Itextsharp合并Pdf与acrofields

时间:2013-11-23 17:09:35

标签: c# asp.net-mvc pdf itextsharp itext

我正在使用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项目。

修改

我添加了以下代码,以便我首先阅读模板,将值写入表单字段,关闭它,重新打开它,展平然后按照其中一条注释的建议再次关闭它。我只是将从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 个答案:

答案 0 :(得分:5)

由于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保持与我的问题相同。