0

テーブルで作成したフォームがあります。テーブルのセルの横にチェックボックスがあります。これらのチェックボックスには、チェックする必要があるものと、チェックしないものがあります。

私はググって、テーブルにチェックボックスを配置する方法を思いつきました。これは、いくつかの表セルを作成する私の方法です。

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 、2 番目のチェックボックスで false としてマークされていることがわかりますが、常にチェックボックスがチェックされた状態で pdf が作成されます。チェックマークを外して四角形を描いてみましたが、だめでした。rf.setChecked(false)あるべきように見えるように仕事をするために何が起こる必要があるか。ありがとう。

4

1 に答える 1

0

あなたは二重に投稿しましたが、コードの何が問題なのかいくつかのヒントを提供します:

  1. 複数のチェックボックスを追加したいので、ループ内にチェックボックスを作成する必要があります(ただし、後で注釈を追加するのは少し奇妙です)
  2. なぜ部分的な名前を追加したのですか?
  3. 無効な空のオプション (別名エクスポート値) を設定しました
  4. [オプション] (不必要に) 長方形を再作成する必要はありません。

わかりましたこれが正常に動作するコードです:

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

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

setCheckType他の投稿との比較について。

于 2013-08-06T10:25:17.620 に答える