Itext Sharp Merge Pdfs with acrofields

我正在使用itext sharp在我的模板上用值填充我的表单字段 .

我使用pdfescape.com创建了模板

这是我用来将值放在pdf模板中的代码 .

private static byte[] GeneratePdf(Dictionary<String, String> formKeys, String pdfPath)
    {
        var templatePath = System.Web.HttpContext.Current.Server.MapPath(pdfPath);
        var reader = new PdfReader(templatePath);
        var outStream = new MemoryStream();
        var stamper = new PdfStamper(reader, outStream);

        var form = stamper.AcroFields;
        var fieldKeys = form.Fields.Keys;

        // "Flatten" the form so it wont be editable/usable anymore  
      //  stamper.FormFlattening = true;

        foreach (KeyValuePair<String, String> pair in formKeys)
        {
            if (fieldKeys.Any(f => f == pair.Key))
            {
                form.SetField(pair.Key, pair.Value);
                form.SetFieldProperty(pair.Key, "setfflags", PdfFormField.FF_READ_ONLY, null);
            }
        }
        stamper.Close();
        reader.Close();

        return outStream.ToArray();
    }

我首先使用了stamper.FormFlattening = true,但随后值不可见 . 因此,我只是将值设置为就绪,而不是使用表单展平,一切正常 .

现在我想使用the pdf merger by smart-soft合并多个这些pdf文件

合并完成后,值不可见 . 当我突出显示表单时,它会突出显示所有文本,但我无法读取它 . 我对此进行了研究并阅读了字段需要展平的内容 .

这是我突出显示所有内容时在pdf上的外观图像:
Image of pdf highlighted Text

我不知道为什么我的田地在被夷为平地时不可见,即使我不使用合并 . 代码或模板有问题吗?备选方案也将受到赞赏 .

顺便说一句,如果相关,我的项目是一个asp-mvc项目 .

EDIT

我添加了以下代码,以便我首先阅读模板,将值写入表单字段,关闭它,重新打开它,展平然后按照其中一条注释的建议再次关闭它 . 我只是将我从GeneratePdf函数得到的结果传递给了这个函数:

private static byte[] flattenPdf(byte[] pdf)
    {
        var reader = new PdfReader(pdf);

        var outStream = new MemoryStream();
        var stamper = new PdfStamper(reader, outStream);

        stamper.FormFlattening = true;

        stamper.Close();
        reader.Close();

        return outStream.ToArray();
    }

我仍然得到相同的结果

回答(1)

2 years ago

由于this answer by rhens,我找到了解决这个问题的方法

我所要做的就是通过添加一行来修改我的GeneratePdf函数:

form.GenerateAppearances = true;

这是最终结果:

private static byte[] GeneratePdf(Dictionary<String, String> formKeys, String pdfPath)
    {
        var templatePath = System.Web.HttpContext.Current.Server.MapPath(pdfPath);
        var reader = new PdfReader(templatePath);
        var outStream = new MemoryStream();
        var stamper = new PdfStamper(reader, outStream);

        var form = stamper.AcroFields;
        form.GenerateAppearances = true; //Added this line, fixed my problem
        var fieldKeys = form.Fields.Keys;

        foreach (KeyValuePair<String, String> pair in formKeys)
        {
            if (fieldKeys.Any(f => f == pair.Key))
            {
                form.SetField(pair.Key, pair.Value);
            }
        }
        stamper.Close();
        reader.Close();

        return flattenPdf(outStream.ToArray());
    }

flattenPdf与我的问题保持一致 .