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());
        }
    }