我想在pdf中设置一些字段,但是在填充之后将它们保持打开状态以进行修改。我的问题是,当我在附加模式下编辑pdf时,复选框没有设置。文本字段工作正常。
string pdfTemplate = @"c:\test\fw4.pdf";
string newFile = @"c:\test\completed_fw4.pdf";
PdfReader pdfReader = new PdfReader(pdfTemplate);
//PdfStamper pdfStamper = new PdfStamper(pdfReader, new System.IO.FileStream(newFile, System.IO.FileMode.Create), '\0', true); //doesn't set field - leaves editable
PdfStamper pdfStamper = new PdfStamper(pdfReader, new System.IO.FileStream(newFile, System.IO.FileMode.Create)); //sets field - leaves locked
AcroFields pdfFormFields = pdfStamper.AcroFields;
pdfFormFields.SetField("topmostSubform[0].Page1[0].c1_01[1]", "2");
pdfStamper.Close();
答案 0 :(得分:0)
有问题的PDF表格是混合AcroForm / XFA表格。 iText(Sharp)5对XFA表单的支持有限,看起来它无法处理XFA表单表示中的复选框,而它可以在AcroForm表示中处理它。
这解释了观察结果:
一方面
PdfStamper pdfStamper = new PdfStamper(pdfReader, new System.IO.FileStream(newFile, System.IO.FileMode.Create), '\0', true);
//doesn't set field - leaves editable
您在附加模式下工作,因此使用权签名仍然有效,PDF仍然启用了Reader。因此,Adobe Reader显示XFA表单并允许编辑。由于iText未正确更新XFA表单,因此未选中此框。
另一方面
PdfStamper pdfStamper = new PdfStamper(pdfReader, new System.IO.FileStream(newFile, System.IO.FileMode.Create));
//sets field - leaves locked
您无法在附加模式下工作,因此使用权限签名无效并且读取器启用被破坏,这是Adobe Reader具有更少功能的情况,因为没有使用权限签名/读取器启用。因此,Reader只显示AcroForm并且不允许编辑。但是当iText正确更新AcroForm表单时,会检查该框。
在这种情况下,使用iText(夏普)5可以做的最好的事情就是删除XFA表单和使用权限签名。这使您获得纯AcroForm表单,并且没有来自无效使用权签名的限制:
using (PdfReader reader = new PdfReader(@"fw4.pdf"))
using (FileStream stream = new FileStream(@"fw4-SetCheckBox.pdf", FileMode.Create))
using (PdfStamper stamper = new PdfStamper(reader, stream))
{
reader.Catalog.Remove(PdfName.PERMS);
reader.Catalog.GetAsDict(PdfName.ACROFORM).Remove(PdfName.XFA);
AcroFields pdfFormFields = stamper.AcroFields;
pdfFormFields.SetField("topmostSubform[0].Page1[0].c1_01[1]", "2");
}