C#:使用 PDFsharp 创建 PDF 表单 (AcroForm)

标签 c# pdf pdfsharp

如何将 PDF 表单元素添加到 PDFsharp PdfPage目的?

我知道 AcroForm 是可填写表单的 PDF 元素的最佳格式,但 PDFsharp 库似乎不允许您创建 AcroForm 对象的实例。

我已经能够使用 PDFsharp 生成简单的文档,如下所示:

static void Main(string[] args) {
    PdfDocument document = new PdfDocument();
    document.Info.Title = "Created with PDFsharp";

    // Create an empty page
    PdfPage page = document.AddPage();

    // Draw Text
    XGraphics gfx = XGraphics.FromPdfPage(page);
    XFont font = new XFont("Verdana", 20, XFontStyle.BoldItalic);
    gfx.DrawString("Hello, World!", font, XBrushes.Black,
        new XRect(0, 0, page.Width, page.Height), XStringFormats.Center);

    // Save document
    const string filename = "HelloWorld.pdf";
    document.Save(filename);
}

但我不知道如何添加可填写的表单元素。我认为它可能会使用 page.Elements.Add(string key, PdfItem item)方法,但是如何制作 AcroForm PdfItem ? (像 PdfTextField 这样的类似乎没有公共(public)构造函数)

PDFsharp 论坛和文档对此没有帮助,我在 Stack Overflow 上找到的最接近的答案是 this one ,这是用错误的库回答。

所以,简而言之:我将如何转换 "Hello World"上面的文本到文本字段?

是否可以在 PDFsharp 中执行此操作,还是应该使用不同的 C# PDF 库? (我非常想坚持使用免费的 - 最好是开源的 - 库)

最佳答案

PdfSharp 中的大多数类构造函数都是密封的,这使得创建新的 pdf 对象有点困难。但是,您可以使用它的类创建对象来添加低级 pdf 元素。
下面是创建文本字段的示例。
关于关键元素的定义,请参阅从第 432 页开始的 pdf 技术规范
https://www.adobe.com/content/dam/acom/en/devnet/pdf/pdfs/PDF32000_2008.pdf

        public static void AddTextBox()
        {

            using (PdfDocument pdf = new PdfDocument())
            {
                PdfPage page1 = pdf.AddPage();

                double left = 50;
                double right = 200;
                double bottom = 750;
                double top = 725;

                PdfArray rect = new PdfArray(pdf);
                rect.Elements.Add(new PdfReal(left));
                rect.Elements.Add(new PdfReal(bottom));
                rect.Elements.Add(new PdfReal(right));
                rect.Elements.Add(new PdfReal(top));
                pdf.Internals.AddObject(rect);

                PdfDictionary form = new PdfDictionary(pdf);
                form.Elements.Add("/Filter", new PdfName("/FlateDecode"));
                form.Elements.Add("/Length", new PdfInteger(20));
                form.Elements.Add("/Subtype", new PdfName("/Form"));
                form.Elements.Add("/Type", new PdfName("/XObject"));
                pdf.Internals.AddObject(form);

                PdfDictionary appearanceStream = new PdfDictionary(pdf);
                appearanceStream.Elements.Add("/N", form);
                pdf.Internals.AddObject(appearanceStream);

                PdfDictionary textfield = new PdfDictionary(pdf);
                textfield.Elements.Add("/FT", new PdfName("/Tx"));
                textfield.Elements.Add("/Subtype", new PdfName("/Widget"));
                textfield.Elements.Add("/T", new PdfString("fldHelloWorld"));
                textfield.Elements.Add("/V", new PdfString("Hello World!"));
                textfield.Elements.Add("/Type", new PdfName("/Annot"));
                textfield.Elements.Add("/AP", appearanceStream);
                textfield.Elements.Add("/Rect", rect);
                textfield.Elements.Add("/P", page1);
                pdf.Internals.AddObject(textfield);

                PdfArray annotsArray = new PdfArray(pdf);
                annotsArray.Elements.Add(textfield);
                pdf.Internals.AddObject(annotsArray);

                page1.Elements.Add("/Annots", annotsArray);

                // draw rectangle around text field
                //XGraphics gfx = XGraphics.FromPdfPage(page1);
                //gfx.DrawRectangle(new XPen(XColors.DarkOrange, 2), left, 40, right, bottom - top);

                // Save document
                const string filename = @"C:\Downloads\HelloWorld.pdf";
                pdf.Save(filename);
                pdf.Close();

                Process.Start(filename);
            }
        }

关于C#:使用 PDFsharp 创建 PDF 表单 (AcroForm),我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/54486608/

相关文章:

javascript - javascript(钛)中的PDF页数

azure - 是否可以在 Azure 应用服务上安装字体?

c# - 我应该在使用多线程 SqlBulkCopy 插入数据时使用表锁吗

c# - 将 Web 项目和 Web 服务部署到 Azure 的解决方案

c# - 如何使 Dispose 等待所有异步方法?

c# - ILMerge DLL : Assembly not merged in correctly, 仍列为外部引用

c# - iTextSharp - 打印合并的 PDF 模板

pdf - 使用 imagemagick 无法正确转换某些 PDF

c# - 如何调整 PDF 文档的大小以适合位图

c# - 如何在 PDFsharp 中将流转换为 PdfDocument