我正在使用itext sharp在我的模板上用值填充我的表单字段。
创建了模板以下是我用于将值放在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();
}
我仍然得到相同的结果
答案 0 :(得分:5)
我所要做的就是通过添加一行来修改我的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保持与我的问题相同。