我正在使用 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 上的样子的图像:
我不知道为什么我的字段在展平时不可见,即使我不使用合并。代码或模板有问题吗?替代品也将受到赞赏。
顺便说一句,如果相关的话,我的项目是一个 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/