c# - Itextsharp 合并 Pdfs 与 acrofields

标签 c# asp.net-mvc pdf 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();
    }

还是一样的结果

最佳答案

感谢 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 与我的问题保持一致。

关于c# - Itextsharp 合并 Pdfs 与 acrofields,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/20165307/

相关文章:

java - 跨平台 JSON 序列化

c# - 在 .NET 中读取文件内容更改

C#:有什么方法可以抑制类似于抑制警告消息的编译器错误?

asp.net-mvc - ASP.Net RC1 中 TryUpdateModel 的模拟要求

asp.net-mvc - Asp.Net 3.1 使用 Windows 身份验证和角色授权

java - 更新数字签名的 PDF 并重新签名

c# - 控制 .NET BCL 类型在调试器中显示的方式(对 KeyValuePair(TKey, TValue) 感兴趣)

asp.net-mvc - 在 Office Web Apps 中从 ASP.NET 打开 Excel/Word 文档进行编辑?

java - 在 PDF Java 中创建表单数据

c# - itextSharp - 合并 pdf 文件会禁用扩展阅读器权限