Itext Sharp Merge Pdfs with acrofields

Jea*_*ntz 3 c# pdf asp.net-mvc itext itextsharp

我正在使用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();
    }
Run Code Online (Sandbox Code Playgroud)

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

现在我想通过smart-soft使用pdf合并来合并这些pdf文件中的多个

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

这是我突出显示所有内容时在pdf上的外观图像: pdf突出显示文本的图像

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

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

编辑

我添加了以下代码,以便我首先阅读模板,将值写入表单字段,关闭它,重新打开它,展平然后按照其中一条注释的建议再次关闭它.我只是将我从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();
    }
Run Code Online (Sandbox Code Playgroud)

我仍然得到相同的结果

Jea*_*ntz 5

由于rhens的回答,我找到了解决这个问题的方法

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

form.GenerateAppearances = true;
Run Code Online (Sandbox Code Playgroud)

这是最终结果:

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());
    }
Run Code Online (Sandbox Code Playgroud)

flattenPdf与我的问题保持一致.