ITextPDF - 矩形颜色是 overlapping/hidding 块的文本

ITextPDF - Rectangle color is overlapping/hidding chunk's text

我需要的是在PDF的特定坐标集中绘制多个圆角矩形。我使用 this example(IMDB one)以动态方式获取 Chunks' 坐标(使用 PdfPageEvent 及其 onGenericTag() 方法)。它正在完美地获取 Chunks' 坐标并将矩形放置在它们必须放置的位置。当我设置颜色时问题就来了,颜色完全隐藏了文本。我知道文本在那里,因为我实际上能够复制它们。如果我不应用颜色,文本是可见的。

如果我不应用颜色,它们实际上是这样的:

这就是我应用颜色后它们的样子(这是它们应该的样子,但包括文字):

忽略矩形大小的差异,我只是通过示例覆盖了原文,但原文显示完美。 为什么文本被隐藏?我知道这是可以做到的,因为这个例子,但我不知道我做错了什么。 我使用的是5.5.13版本。

这是我创建块并将其添加到段落的方式:

List<Chunk> chunksList = new ArrayList<>(); //rects
            Chunk rdChunk;
            for(Person rd: persons) {
                rdChunk = new Chunk(rd.getName(), textFont);
                rdChunk.setGenericTag(rd.getName());
                chunksList .add(rdChunk);
            }
            document.add(createParagraph("as: ", chunksList , basicLeftIndentation));

private Paragraph createParagraph(String field, List<Chunk> chunks, long leftIndentation) {

    Paragraph paragraph = new Paragraph();

    paragraph.add(new Chunk(field, labelFont));
    for(Chunk chunk: chunks) {
        paragraph.add(new Chunk("  "));
        paragraph.add(chunk);
    }
    paragraph.setIndentationLeft(leftIndentation);

    return paragraph;
}

这就是我使用 PdfPageEvent 接口的方式:

@Override
public void onGenericTag(PdfWriter writer, Document document, Rectangle rect, String text) {
    int[] colors;
    switch(text) {

    case "XX":
        colors = new int[]{142, 166, 207};
        break;
    case "XY":
        colors = new int[]{207, 188, 142};
        break;

    drawRectangle(writer.getDirectContent(), rect, colors);
}

public void drawRectangle(PdfContentByte content, Rectangle rect, int[] colors) {

    content.saveState();
    content.roundRectangle(rect.getLeft() -2,
                      rect.getBottom() - 3,
                      rect.getWidth() + 4,
                      rect.getHeight() + 4, 7f);
    content.setRGBColorFill(colors[0], colors[1], colors[2]);
    content.fill();
    content.restoreState();
}

问题解决了,我在打电话

writer.getDirectContent();

而不是

writer.getDirectContentUnder();