将背景图片设置为 Header 单元格
Setting background image to a Header Cell
我正在尝试使用以下代码为我的 Header 单元格 table 设置背景图片:
Image esq = new Image(ImageDataFactory.create(IMG1));
Cell cellh = new Cell();
cellh.setBorder(Border.NO_BORDER);
cellh.setNextRenderer(new ImageBackgroundCellRenderer(cellh, esq));
table.addHeaderCell(cellh);
问题是只有第一页显示背景图片;其他的是空白的。我该如何解决?
作为明确问题的一般规则,请附上您正在使用的所有 classes 的代码,例如您所指的 ImageBackgroundCellRenderer
。此 class 不是标准 iText7 的一部分 API。
我假设您正在使用类似于以下的实现:
private class ImageBackgroundCellRenderer extends CellRenderer {
protected Image img;
public ImageBackgroundCellRenderer(Cell modelElement, Image img) {
super(modelElement);
this.img = img;
}
@Override
public void draw(DrawContext drawContext) {
img.scaleToFit(getOccupiedAreaBBox().getWidth(), getOccupiedAreaBBox().getHeight());
drawContext.getCanvas().addXObject(img.getXObject(), getOccupiedAreaBBox());
super.draw(drawContext);
}
}
此实现可能会在示例中找到,它解决了该示例要解决的任务。
在您的情况下,您正在考虑重新使用单元格。可重用或可拆分到多个页面的元素的自定义渲染器必须 override/implement getNextRenderer()
方法,该方法创建可用于进一步处理的类似渲染器(渲染器不能单独重用,如果它们有已经画好了)。实现如下所示:
@Override
public IRenderer getNextRenderer() {
return new ImageBackgroundCellRenderer((Cell) modelElement, img);
}
总的来说,下面的代码应该能得到你想要的结果:
private class ImageBackgroundCellRenderer extends CellRenderer {
protected Image img;
public ImageBackgroundCellRenderer(Cell modelElement, Image img) {
super(modelElement);
this.img = img;
}
@Override
public void draw(DrawContext drawContext) {
img.scaleToFit(getOccupiedAreaBBox().getWidth(), getOccupiedAreaBBox().getHeight());
drawContext.getCanvas().addXObject(img.getXObject(), getOccupiedAreaBBox());
super.draw(drawContext);
}
@Override
public IRenderer getNextRenderer() {
return new ImageBackgroundCellRenderer((Cell) modelElement, img);
}
}
我正在尝试使用以下代码为我的 Header 单元格 table 设置背景图片:
Image esq = new Image(ImageDataFactory.create(IMG1));
Cell cellh = new Cell();
cellh.setBorder(Border.NO_BORDER);
cellh.setNextRenderer(new ImageBackgroundCellRenderer(cellh, esq));
table.addHeaderCell(cellh);
问题是只有第一页显示背景图片;其他的是空白的。我该如何解决?
作为明确问题的一般规则,请附上您正在使用的所有 classes 的代码,例如您所指的 ImageBackgroundCellRenderer
。此 class 不是标准 iText7 的一部分 API。
我假设您正在使用类似于以下的实现:
private class ImageBackgroundCellRenderer extends CellRenderer {
protected Image img;
public ImageBackgroundCellRenderer(Cell modelElement, Image img) {
super(modelElement);
this.img = img;
}
@Override
public void draw(DrawContext drawContext) {
img.scaleToFit(getOccupiedAreaBBox().getWidth(), getOccupiedAreaBBox().getHeight());
drawContext.getCanvas().addXObject(img.getXObject(), getOccupiedAreaBBox());
super.draw(drawContext);
}
}
此实现可能会在示例中找到,它解决了该示例要解决的任务。
在您的情况下,您正在考虑重新使用单元格。可重用或可拆分到多个页面的元素的自定义渲染器必须 override/implement getNextRenderer()
方法,该方法创建可用于进一步处理的类似渲染器(渲染器不能单独重用,如果它们有已经画好了)。实现如下所示:
@Override
public IRenderer getNextRenderer() {
return new ImageBackgroundCellRenderer((Cell) modelElement, img);
}
总的来说,下面的代码应该能得到你想要的结果:
private class ImageBackgroundCellRenderer extends CellRenderer {
protected Image img;
public ImageBackgroundCellRenderer(Cell modelElement, Image img) {
super(modelElement);
this.img = img;
}
@Override
public void draw(DrawContext drawContext) {
img.scaleToFit(getOccupiedAreaBBox().getWidth(), getOccupiedAreaBBox().getHeight());
drawContext.getCanvas().addXObject(img.getXObject(), getOccupiedAreaBBox());
super.draw(drawContext);
}
@Override
public IRenderer getNextRenderer() {
return new ImageBackgroundCellRenderer((Cell) modelElement, img);
}
}