我使用的是iText 7 java库。这里是我的gradle依赖项。
compile group: 'com.itextpdf', name: 'kernel', version: '7.1.9'
compile group: 'com.itextpdf', name: 'layout', version: '7.1.9'
compile group: 'com.itextpdf', name: 'forms', version: '7.1.9'
我需要在现有的pdf模板中填写Acro表格。PDF表单有一个复选框定义了以下设置-
名称= COMM_PREF_EMAIL
复选框样式= Check
出口值= Yes
如果我在acrobat阅读器中打开pdf并单击复选框,它将显示选中的复选标记,如预期的那样。
对于iText库,我的期望是,如果我将复选框值设置为Yes (与复选框的导出值匹配),那么只应该选中复选框。如果设置了任何其他值,则复选框应保持未选中状态。
下面是我使用iText 7库编写的java代码。
PdfAcroForm pdfAcroForm = PdfAcroForm.getAcroForm(pdfDocument, true);
PdfFormField pdfFormField = pdfAcroForm.getField("COMM_PREF_EMAIL");
pdfFormField.setValue("B");
我将复选框值设置为"B“,这与导出值”是“不匹配,但在PDF中仍在选中复选框,最糟糕的部分是复选框样式也更改为交叉。下面是运行此代码后复选框的处理方式。
注意,复选框样式总是更改为交叉,而不管我设置了什么值。
我做了一些调试,注意到当使用PdfFormField检索getField
时,它有chekType=0
,这是不正确的。它不是在pdf中定义的。应该是1,这是支票。现在,当我调用pdfFormField.setValue(...)
时,它最终调用了regenerateField()
,因为它具有无效的值,所以我猜它取了chekType=3 (交叉)的默认值。
有人能帮我解决以下两个问题吗?
任何建议或建议都是非常感谢的。
在6/10/2020上的更新
链接pdf文件,以复制问题https://github.com/rakeshprajapati1982/itext-7-issue/blob/master/Checklist.pdf
发布于 2020-10-31 19:34:22
由于使用itextSharp方法的SetField()似乎自动获得窗体的分隔
PdfStamper pdfStamper = new PdfStamper(pdfReader_, fileStream);
AcroFields pdfFormFields = pdfStamper.AcroFields;
pdfFormFields.SetField(FIELD_NAME, "123",true);
但是现在在itext7中,我的研究似乎并不隐含小部件形状"dove,交叉,start等.“,它只是得到了让我们调用它们的状态(”是的,关闭“)的值,所以只需设置小部件输入SetCheckType(数字),就像为什么iText在CheckType时输入十字符号中提到的那样
所以在你的代码里
var field = form1.GetField(FIELD_NAME);
if (field.GetType() == typeof(PdfButtonFormField)) {
field.SetCheckType(PdfFormField.TYPE_CHECK);//PdfFormField.TYPE_CIRCLE,PdfFormField.TYPE_CROSS,PdfFormField.TYPE_DIAMOND,PdfFormField.TYPE_SQUARE,PdfFormField.TYPE_STAR,etc
field.SetValue("Yes", true);
}
顺便说一句,如果我用不好的方式回答这个问题,请随意编辑,不要删除它。
https://stackoverflow.com/questions/62165305
复制相似问题