2017-09-13 70 views
0

我想设置一些pdf中的字段,但让他们打开后修改后,他们已经填充。我的问题是,当我在附加模式下编辑pdf时,复选框没有设置。文本字段正常工作。itextsharp - 无法设置复选框时PdfStamper在附加模式

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

请分享问题 – mkl

+0

[2017年W4]的PDF(https://www.google.com/url?sa= T&RCT = J&q =&ESRC = S&来源=网络和CD = 1&CAD = RJA&uact = 8&VED = 0ahUKEwiFtZSU7KLWAhWEw4MKHXCyCoUQFggoMAA&URL = HTTPS%3A%2F%2Fwww.irs.gov%2Fpub%2Firs-PDF%2Ffw4.pdf与USG = AFQjCNH6XrXINhUDXXX1C3llG2hdmsZL5g) – just4atwork

回答

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阅读器仍然启用。因此,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(Sharp)做的最好的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"); 
} 
+0

感谢您的帮助! – just4atwork