在 iText7 c# 中复制到新文档和填写表单

Copy into new document and fillout form in iText7 c#

我一直在尝试掌握 iText7 c#,但运气不佳。

我的目标是:

  1. 加载带有表单(多个字段)的 pdf(一页)作为模板
  2. 填写表格,拼合填​​写的表格页面并将其复制到新文档
  3. 使用不同的数据重复#2 x 次
  4. 保存到内存流

我有不同的部分在工作,但我无法让它一起工作

var memoryStream = new MemoryStream();
PdfReader reader = new PdfReader("untitled-1.pdf"); //Iput
PdfWriter writer = new PdfWriter(memoryStream); //output
PdfDocument pdfDoc = new PdfDocument(reader, writer);
PdfAcroForm form = PdfAcroForm.GetAcroForm(pdfDoc, true);
var fields = form.GetFormFields();
if(fields.ContainsKey("address")) { 
     fields["address"].SetValue("first\nlast");
}
form.FlattenFields();
pdfDoc.Close();
byte[] b = memoryStream.ToArray();
File.WriteAllBytes(@"t.pdf", b);

克隆页面:

// create clone page x times
PdfDocument pdfDoc = new PdfDocument(new PdfWriter("output.pdf").SetSmartMode(true));
pdfDoc.InitializeOutlines();
PdfDocument srcDoc;
for (int i = 0; i<5; i++) {
    srcDoc = new PdfDocument(new PdfReader("untitled-1.pdf"));
    // copy content to the resulting PDF
    srcDoc.CopyPagesTo(1, srcDoc.GetNumberOfPages(), pdfDoc);
}
pdfDoc.Close();

刚写完这个问题就有了思路。这是这个问题的一种解决方案

创建一个包含表单和名为地址的文本字段的 pdf 文件以用作模板,另存为 untitled1-pdf。

此代码将创建一个空文档,然后为用户中的每个用户加载并填写用户的字段地址。

填写的表格将被拼合并复制到新文档中。 全部完成后,文档将保存为 result.pdf

//b.

static void Main(string[] args)
    {
        List<string> users = new List<string> { "Peter", "john", "Carl" };
        byte[] result = createPdf(users, "untitled-1.pdf");
        File.WriteAllBytes(@"result.pdf", result);
    }

    public static byte[] createPdf(List<string> users,string templateFile)
    {
        // create clone page for each user in users
        using (MemoryStream memoryStream = new MemoryStream())
        {
            PdfDocument pdfDoc = new PdfDocument(new PdfWriter(memoryStream).SetSmartMode(true));
            pdfDoc.InitializeOutlines();
            PdfDocument srcDoc;
            foreach (var u in users)
            {
                MemoryStream m = new MemoryStream(fillForm(u,templateFile));
                srcDoc = new PdfDocument(new PdfReader(m));
                // copy content to the resulting PDF
                srcDoc.CopyPagesTo(1, srcDoc.GetNumberOfPages(), pdfDoc);
            }
            pdfDoc.Close();

            return memoryStream.ToArray();
        }
    }

    public static byte[] fillForm(string user,string templateFile)
    {
        using (var memoryStream = new MemoryStream())
        {
            PdfReader reader = new PdfReader(templateFile); //Iput
            PdfWriter writer = new PdfWriter(memoryStream); //output
            PdfDocument pdfDoc = new PdfDocument(reader, writer);
            PdfAcroForm form = PdfAcroForm.GetAcroForm(pdfDoc, true);
            var fields = form.GetFormFields();

            if (fields.ContainsKey("address"))
            {
                fields["address"].SetValue(user);
            }

            form.FlattenFields();
            pdfDoc.Close();
            byte[] b = memoryStream.ToArray();
            return b;
        }
    }