我正在使用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项目 .
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 回答
由于this answer by rhens,我找到了解决这个问题的方法
我所要做的就是通过添加一行来修改我的GeneratePdf函数:
这是最终结果:
flattenPdf与我的问题保持一致 .