Itext 我的复选框总是选中的。我不能随意创建它们
我有一个用表创建的表单。在表格的单元格一侧,我有复选框。其中一些复选框需要选中,而其他复选框则不需要选中 我在谷歌上搜索了一下,想出了一个在桌子上放复选框的方法。下面是我创建一些表格单元格的方法Itext 我的复选框总是选中的。我不能随意创建它们,itext,Itext,我有一个用表创建的表单。在表格的单元格一侧,我有复选框。其中一些复选框需要选中,而其他复选框则不需要选中 我在谷歌上搜索了一下,想出了一个在桌子上放复选框的方法。下面是我创建一些表格单元格的方法 private void createFourColumnBody(String[] rowLabels, PdfPTable table) throws DocumentException { PdfFormField checkboxGroupField = PdfFormField.cre
private void createFourColumnBody(String[] rowLabels, PdfPTable table) throws DocumentException {
PdfFormField checkboxGroupField = PdfFormField.createCheckBox(writer);
for (String label : rowLabels) {
PdfPCell cell = table.getDefaultCell();
cell = new PdfPCell(new Paragraph(label));
cell.setHorizontalAlignment(Element.ALIGN_LEFT);
table.addCell(cell);
cell = new PdfPCell(table.getDefaultCell());
cell.setCellEvent(new CellField(writer, checkboxGroupField, true));
table.addCell(cell);
cell = new PdfPCell(table.getDefaultCell());
cell.setCellEvent(new CellField(writer, checkboxGroupField, false));
table.addCell(cell);
cell = new PdfPCell(new Paragraph(" "));
table.addCell(cell);
}
getDocument().add(table);
writer.addAnnotation(checkboxGroupField);
}
这是用来创建复选框的类
protected class CellField implements PdfPCellEvent {
private PdfFormField parent;
private String partialFieldName;
private PdfWriter writer;
private boolean checked;
public CellField(PdfWriter writer, PdfFormField parent, boolean checked) {
this.writer = writer;
this.parent = parent;
this.checked = checked;
}
public void cellLayout(PdfPCell cell, Rectangle rect, PdfContentByte[] cb) {
try {
createCheckboxField(rect);
} catch (Exception e) {
throw new RuntimeException(e);
}
}
private void createCheckboxField(Rectangle rect) throws IOException, DocumentException {
RadioCheckField rf = new RadioCheckField(writer, new Rectangle(rect.getLeft(2), rect.getBottom(2),
rect.getRight(2), rect.getTop(2)), partialFieldName, "");
rf.setChecked(checked);
rf.setBorderColor(GrayColor.GRAYBLACK);
rf.setBackgroundColor(GrayColor.GRAYWHITE);
rf.setCheckType(RadioCheckField.TYPE_CHECK);
parent.addKid(rf.getCheckField());
}
}
您可以在第一个方法中看到,我在第一个复选框中将选中的布尔值标记为true,在第二个复选框中标记为false,但它总是在选中复选框的情况下创建pdf。我试着去掉复选标记,只画一个矩形,但没有效果。要使rf.setChecked(false)
正常工作,需要做些什么。谢谢 虽然您有,但我会给您一些提示代码有什么问题:
public void createFourColumnBody(String[] rowLabels, PdfPTable table) throws DocumentException {
this.doc.open();
ArrayList<PdfFormField> list = new ArrayList<PdfFormField>();
for (int i=0;i<rowLabels.length;i++) {
//PdfFormField checkboxGroupField = PdfFormField.createRadioButton(this.writer,false);
PdfFormField checkbox1 = PdfFormField.createCheckBox(this.writer);
//create a unique name
checkbox1.setFieldName("checkbox-"+i);
PdfFormField checkbox2 = PdfFormField.createCheckBox(this.writer);
checkbox2.setFieldName("checkbox+"+i);
//use for autofill
//checkbox2.setFieldName("checkbox-"+i);
PdfPCell cell = table.getDefaultCell();
cell = new PdfPCell(new Paragraph(rowLabels[i]));
cell.setHorizontalAlignment(Element.ALIGN_LEFT);
table.addCell(cell);
cell = new PdfPCell(table.getDefaultCell());
cell.setCellEvent(new CellField(this.writer, checkbox1, true,"1"));
table.addCell(cell);
cell = new PdfPCell(table.getDefaultCell());
cell.setCellEvent(new CellField(this.writer, checkbox2, false,"1"));
//use for autofill
//cell.setCellEvent(new CellField(this.writer, checkbox1, true,"1"));
table.addCell(cell);
cell = new PdfPCell(new Paragraph(" "));
table.addCell(cell);
list.add(checkbox1);
list.add(checkbox2);
}
this.doc.add(table);
for(PdfFormField field: list){
this.writer.addAnnotation(field);
}
}
关于
setCheckType
比较另一篇文章。我能够用C#中的PdfStamper来处理这段代码。在大多数情况下,除了注释被写入PdfWriiter的部分(我假设这就是上面的this.writer)之外,其他部分都是相同的。主要区别在于我必须使用pdfStamper.AddAnnotation(f,1)(其中1是页码)。我对这种方法有一个问题/担忧。当表格跨过分页符时会发生什么情况?我需要弄清楚如何跟踪/控制它,还是它会自动地弄清楚?
protected class CellField implements PdfPCellEvent {
private PdfFormField parent;
private PdfWriter writer;
private boolean checked;
private String onValue;
public CellField(PdfWriter writer, PdfFormField parent, boolean checked, String onValue) {
this.writer = writer;
this.parent = parent;
this.checked = checked;
this.onValue = onValue;
}
public void cellLayout(PdfPCell cell, Rectangle rect, PdfContentByte[] cb) {
try {
this.createCheckboxField(rect);
} catch (Exception e) {
throw new RuntimeException(e);
}
}
private void createCheckboxField(Rectangle rect) throws IOException, DocumentException {
RadioCheckField bt = new RadioCheckField(this.writer, rect, null, this.onValue);
bt.setCheckType(RadioCheckField.TYPE_CROSS);
bt.setChecked(this.checked);
this.parent.addKid(bt.getCheckField());
}
}