将背景图像设置为页眉单元

时间:2018-11-27 19:26:11

标签: java itext7

我正在尝试使用以下代码在Header Cell表中设置背景图像:

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

问题在于,只有第一页显示背景图片;其他的是空白的。我该怎么解决?

1 个答案:

答案 0 :(得分:1)

作为明确说明问题的一般规则,请附上您正在使用的所有类的代码,例如您所引用的ImageBackgroundCellRenderer。此类不是标准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);
    }
}

此实现可能在示例中找到,它解决了要为该示例解决的任务。

在您的情况下,您正在考虑重用该单元格。对于重用的元素或可拆分成多个页面的元素的自定义渲染器,必须重写/实现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);
    }
}