我正在使用 Itext7 创建一个带有表格的 pdf。
该表占据多页。
我还覆盖了单元格渲染器以向某些单元格添加表单域。
我注意到当表格进入新页面时,第一行不会触发 CellRender 类的 draw 方法。
我在下面放了一些代码以便更好地理解。

...
//adding the cells to table
for (int i = 0; i < 10; i++) {
    addRow(table,i);
}
...
//addRow implementation
private void addRow(Table table, int row) throws IOException {
    table.startNewRow();

    PdfFont zapfdingbats = PdfFontFactory.createFont(FontConstants.ZAPFDINGBATS);

    Cell checkBoxCell = new Cell().add(new Paragraph("o").setFont(zapfdingbats).setMargins(9, 0, 0, 11)).setKeepTogether(true);
    checkBoxCell.setNextRenderer(new CheckboxCellRenderer(checkBoxCell, "cb"+row));
    table.addCell(checkBoxCell);
    ...
    //other cells here
}
...
//The implementation of the custom CellRender
protected class CheckboxCellRenderer extends CellRenderer {
    protected String name;

    public CheckboxCellRenderer(Cell modelElement, String name) {
        super(modelElement);
        this.name = name;
    }
    //this method is not triggered for the first row when a new page is created
    @Override
    public void draw(DrawContext drawContext) {
        System.out.println(name);
        super.draw(drawContext);
        float x = getOccupiedAreaBBox().getLeft();
        float y = getOccupiedAreaBBox().getBottom();
        float width = getOccupiedAreaBBox().getRight()-getOccupiedAreaBBox().getLeft();
        float height = getOccupiedAreaBBox().getTop()-getOccupiedAreaBBox().getBottom();
        Rectangle rect = new Rectangle(x+5, y+5, width-10, height-10);
        PdfTextFormField pdfTextFormField = PdfFormField.createText(drawContext.getDocument(), rect, name);
        PdfAcroForm.getAcroForm(drawContext.getDocument(), true).addField(pdfTextFormField);
    }
}

我究竟做错了什么?

最佳答案

如果您转到一个新页面,那么您的 Renderer 将被丢弃并创建一个新的 Renderer 对象。这样做是为了避免在模型对象发生变化时混淆状态。在这种情况下,方法 getNextRenderer 被调用:

/**
 * Gets a new instance of this class to be used as a next renderer, after this renderer is used, if
 * {@link #layout(LayoutContext)} is called more than once.
 * @return new renderer instance
 */
IRenderer getNextRenderer();

因此,如果您只是在自定义 CheckboxCellRenderer 类中覆盖此方法,则应该没问题:
@Override
public IRenderer getNextRenderer() {
    return new CheckboxCellRenderer(getModelElement(), name);
}

关于java - Itext7 CellRenderer 并不总是有效,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/45957620/

10-11 04:40