我有一份包含2页的申请PDF表格。仅当第一页没有足够的空间时,才应使用第二页。如果第二页没有,则应该打印第2页的新副本。 因此,我的目标是构建一个方法来创建一个页面1 +可变页数为2的表单。 好像我只是使用PDFcopyfields连接pdf会重复字段,我使用Lowagie的方法重新编号重复的字段。 到目前为止,我只能复制整个文件' n'使用pdfcopyfields的次数(即,具有相同页数1 +第2页的文档)。而且,最糟糕的是文档无法保存。
public void Write()
{
PdfCopyFields copy = new PdfCopyFields(new FileStream(@"C:\users\u19\desktop\33.pdf", FileMode.Create));
copy.AddDocument(new PdfReader(RenameFieldsIn(@"C:\users\u19\desktop\1.pdf", 1)));
copy.AddDocument(new PdfReader(RenameFieldsIn(@"C:\users\u19\desktop\1.pdf", 2)));
// close the PdfCopyFields object
copy.Close();
}
private static byte[] RenameFieldsIn(string datasheet, int i)
{
List<string> form_keys = new List<string>();
using (var ms = new MemoryStream())
{
// Create the stamper
using (PdfStamper stamper = new PdfStamper(new PdfReader(datasheet), ms))
{
// Get the fields
AcroFields form = stamper.AcroFields;
// so we aren't hit with 'Collection was modified' exception
foreach (string k in stamper.AcroFields.Fields.Keys)
{
form_keys.Add(k);
}
// Loop over the fields
foreach (string key in form_keys)
{
// rename the fields
form.RenameField(key, string.Format("{0}_{1}", key, i));
}
}
return ms.ToArray();
}
}
答案 0 :(得分:1)
正如我在评论中已经解释的那样,您的PDF是“启用阅读器”。阅读器启用涉及使用Adobe私钥的数字签名。您声称您尝试填写的PDF不包含任何签名。但是,您共享了PDF,当我查看此文档时,我清楚地看到使用权利(UR)签名:
此签名(如果有效)解锁Adobe Reader中的功能,例如:保存文档的权限。合并这样的表单不可避免地会破坏数字签名并删除该许可。您只能使用Adobe软件恢复该权限。 仔细观察,您可以看到您的PDF使用Acrobat v8.0启用了阅读器。
换句话说:如果没有Adobe,您需要尝试实现一些不可能实现的功能,因为您需要使用Adobe的属性对该文档进行数字签名。