将背景图片设置为 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);
    }
}