【解決方法】PDFドキュメントの上に描画し、pdfsharpを使用してアクセシビリティタグを失わないようにする方法は?


やあ!
魔法の解決策はありますか? すべてのアクセシビリティ タグを失うことなく、既存のドキュメントに基づいて PDF ドキュメントを作成することは可能ですか?

ここでの私たちの状況は非常に複雑であり、かなり長い間解決しようとしてきた問題に対するクリーンでエレガントな解決策を探しています。
私たちのシステムでは、顧客は PDF ファイルを読み込むことができ、顧客がファイルに描画、書き込み、署名を記入できる UI インターフェイスがあります。
最後に、ブラウザ経由でファイルをダウンロードします。
この問題は、クライアントが障碍のある方や障碍者向けのアクセシビリティを備えた PDF ファイルを読み込むときに発生します。
彼が PDF をダウンロードすると、アクセスできなくなり、すべてのタグが失われます。
を使用しております PDFシャープ PDFですべての操作を実行するのに役立つライブラリとして.
コードのチェックから、アクセシビリティ タグをまったく参照していないため、コードの実行中にそれらを見つけて保持する方法を確認しようとしています。
簡単に言えば、次のコードです。

C#
using PdfSharp.Drawing;
using PdfSharp.Pdf;
using PdfSharp.Pdf.IO;
using System;
using System.Collections.Generic;
using System.IO;
private PdfDocument DrawOnPdf(Stream stream, dynamic layers, dynamic parameters, bool bIsAutomated = false)
        {
            //This is the object generated from pdf the client uploaded
            PdfSharp.Drawing.XPdfForm formOriginal = XPdfForm.FromStream(stream);
            //We now create a new PdfSharp.Pdf.PdfDocument
            PdfDocument outputDocument = new PdfDocument();
            XGraphics gfx = null;
            XRect box;
            outputDocument.PageLayout = PdfPageLayout.SinglePage;
            //We're iterating through all of the uploaded pdf pages
            for (int idx = 1; idx <= formOriginal.PageCount; idx += 1)
            {
                // Add a new page to the output document
                PdfPage page = outputDocument.AddPage();
                // Set page number (which is one-based)
                formOriginal.PageNumber = idx;
                page.Orientation = formOriginal.Page.Orientation;
                page.Width = formOriginal.Page.Width;
                page.Height = formOriginal.Page.Height;

                double width = page.Width;
                double height = page.Height;
                
                gfx = XGraphics.FromPdfPage(page);
                
                box = new XRect(0, 0, width, height);
                
                // Draw the page identified by the page number like an image
                gfx.DrawImage(formOriginal, box);
                dynamic currentPage = GetPageLayer(layers, idx, idx == formOriginal.PageCount);
                //This method of ours can write text, date, block, radio, circle etc.
                DrawPdfLayer(gfx, currentPage, parameters, bIsAutomated);

            }
            return outputDocument;
        }
        private static void DrawPdfLayer(XGraphics gfx, dynamic page, dynamic parameters, bool bIsAutomated = false)
        {
            object item = null;

            try
            {
                foreach (var layer in page.layer)
                {
                    item = layer;

                    double x = layer.x;
                    double y = layer.y;

                    string input = null;
                    dynamic arrInput = null;
                    if (parameters != null && layer.input_id != null &&
                            parameters[layer.input_id.ToString()] != null)
                    {
                        var tmp = parameters[layer.input_id.ToString()];
                        if (tmp is Newtonsoft.Json.Linq.JArray)
                            arrInput = tmp;
                        else
                            input = tmp.ToString();
                    }

                    bool clear = (bool)layer.cleardash;
                    if (clear && input != null)
                    {
                        input = input.Replace("-", "   ");
                    }

                    bool emailUser = (bool)layer.emailuser; 
                    if (emailUser && input != null)
                    {
                        if (!String.IsNullOrEmpty(input))
                            input = input.Remove(input.IndexOf('@'));
                    }

                    bool emailDomain = (bool)layer.emaildomain; 
                    if (emailDomain && input != null)
                    {
                        if (!String.IsNullOrEmpty(input))
                            input = input.Remove(0, input.IndexOf('@') + 1);
                    }
                    var brush = XBrushes.Black;
                    if (layer.color != null)
                        brush = new XSolidBrush(XColor.FromArgb(255, (int)layer.color.R, (int)layer.color.G, (int)layer.color.B));

                    string layerType = layer.type.ToString();
                    switch (layerType)
                    {
                        case "text":
                            WriteText(ref gfx, brush, layer, input, x, y);
                            break;
                        case "numberinput": 
                            int maxLength = (int)layer.maxlength;
                            if (input != null)
                            {
                                if (input.Length < maxLength && maxLength > 0)
                                    input = input.PadLeft(maxLength);
                            }
                            WriteText(ref gfx, brush, layer, input, x, y);
                            break;

                        case "date":
                            WriteDate(ref gfx, brush, layer, input, x, y);
                            break;

                        case "block":
                            WriteBlock(ref gfx, brush, layer, input, x, y);
                            break;

                        case "circle":
                        case "radio":
                            if (input != null) arrInput = new string[] { input };

                            if (arrInput != null)
                                foreach (var val in arrInput)
                                {
                                    if (layerType == "radio")
                                        WriteRadio(ref gfx, brush, layer, val.ToString(), x, y, bIsAutomated);
                                    else
                                        WriteCircle(ref gfx, brush, layer, val.ToString(), x, y);
                                }
                            break;
                    }
                }

                gfx.Restore(gfx.Save());
            }
            catch (Exception ex)
            {
                
            }
        }

私が試したこと:

これまで試したことは、PDFDocument オブジェクトのクローンを作成し、そのすべてのページを一時リストに保存し、元の 1 ページをすべて削除してから、アクセシビリティ タグを使用して空の pdf で作業することでした。 タグも欠落していることがわかりました。

コメント

タイトルとURLをコピーしました