用 iText7 填充 pdf 校验字段
Fill pdf check field with iText7
我正在尝试使用 iText7 在我的 PDF 上勾选一个复选框。
但不是只检查一个字段,而是检查所有字段
我需要的:
我得到的:
PDF编辑时:
我认为导出值与它有关。
但是我不知道该怎么办。
我的代码:
private static void CreatePdf(string output)
{
using var _pdfDoc = new PdfDocument(new PdfReader("CheckTest.pdf"), new PdfWriter(output));
var form = PdfAcroForm.GetAcroForm(_pdfDoc, true);
var check = form.GetField("Check");
check.SetValue("01");
}
PDF: Link
有人知道如何正确检查吗?
谢谢!
首先,PDF 本质上是将 PDF AcroForm 复选框字段误用作单选按钮,而不是使用真正的 PDF AcroForm 单选按钮字段。
PDF 规范没有明确规定 PDF 查看器在这种情况下应该做什么(毕竟这是误用),但相关 PDF 表单生成器的开发人员可能已经试验并确定在最广泛的情况下使用 PDF 查看器,Adobe Acrobat Reader,这种误用如他们所愿。
但是,由于这种用途超出了规范,因此处理此类 PDF 的其他 PDF 处理器可能会产生完全不同的结果而不会做任何错误。
也就是说,有一种方法可以使用 iText 填写表单并获得类似于 Adobe Reader 生成的结果的结果。
手头的问题是,iText 默认情况下为除实际 AcroForm 单选按钮字段之外的所有表单字段类型在设置字段值时以适合字段类型的方式生成新外观。在您的文档中有三个同名的复选框字段对象。因此,它们被视为具有三个表示相同值的小部件的单个复选框,因此外观是根据您的观察生成的。
但是你可以告诉 iText 不要生成新的外观,使用另一个 SetValue
重载接受一个额外的布尔值,简单地替换
check.SetValue("01");
来自
check.SetValue("01", false);
现在 iText 会处理现有的外观,因此只有具有该 "01"
值外观的字段才会被选中。
注意,仅在此类情况下阻止 iText 生成外观。例如,在文本字段的情况下,不更新外观会导致即使内部字段值已更改,仍会继续显示具有以前字段内容的旧外观。
A 是这样做的:
Dim MyPDFFormCheckBoxField As Fields.PdfFormField = myform.GetField("myCheckBox")
MyPDFFormCheckBoxField.SetCheckType(PdfFormField.TYPE_CHECK)
MyPDFFormCheckBoxField.SetValue("", 如果(myCheckBox.IsChecked = 真, 真, 假))
请注意,设置复选框为真或假的是 SetValue 的第二个参数。
我正在尝试使用 iText7 在我的 PDF 上勾选一个复选框。 但不是只检查一个字段,而是检查所有字段
我需要的:
我得到的:
PDF编辑时:
我认为导出值与它有关。 但是我不知道该怎么办。
我的代码:
private static void CreatePdf(string output)
{
using var _pdfDoc = new PdfDocument(new PdfReader("CheckTest.pdf"), new PdfWriter(output));
var form = PdfAcroForm.GetAcroForm(_pdfDoc, true);
var check = form.GetField("Check");
check.SetValue("01");
}
PDF: Link
有人知道如何正确检查吗?
谢谢!
首先,PDF 本质上是将 PDF AcroForm 复选框字段误用作单选按钮,而不是使用真正的 PDF AcroForm 单选按钮字段。
PDF 规范没有明确规定 PDF 查看器在这种情况下应该做什么(毕竟这是误用),但相关 PDF 表单生成器的开发人员可能已经试验并确定在最广泛的情况下使用 PDF 查看器,Adobe Acrobat Reader,这种误用如他们所愿。
但是,由于这种用途超出了规范,因此处理此类 PDF 的其他 PDF 处理器可能会产生完全不同的结果而不会做任何错误。
也就是说,有一种方法可以使用 iText 填写表单并获得类似于 Adobe Reader 生成的结果的结果。
手头的问题是,iText 默认情况下为除实际 AcroForm 单选按钮字段之外的所有表单字段类型在设置字段值时以适合字段类型的方式生成新外观。在您的文档中有三个同名的复选框字段对象。因此,它们被视为具有三个表示相同值的小部件的单个复选框,因此外观是根据您的观察生成的。
但是你可以告诉 iText 不要生成新的外观,使用另一个 SetValue
重载接受一个额外的布尔值,简单地替换
check.SetValue("01");
来自
check.SetValue("01", false);
现在 iText 会处理现有的外观,因此只有具有该 "01"
值外观的字段才会被选中。
注意,仅在此类情况下阻止 iText 生成外观。例如,在文本字段的情况下,不更新外观会导致即使内部字段值已更改,仍会继续显示具有以前字段内容的旧外观。
A 是这样做的:
Dim MyPDFFormCheckBoxField As Fields.PdfFormField = myform.GetField("myCheckBox") MyPDFFormCheckBoxField.SetCheckType(PdfFormField.TYPE_CHECK) MyPDFFormCheckBoxField.SetValue("", 如果(myCheckBox.IsChecked = 真, 真, 假))
请注意,设置复选框为真或假的是 SetValue 的第二个参数。