我正在使用 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/