ITextPDF-矩形颜色重叠/隐藏块的文本

时间:2019-07-29 12:30:29

标签: java pdf colors itext

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

如果我不应用颜色,这就是它们的实际外观:

enter image description here

如果我应用颜色,这就是它们的外观(这是它们的外观,但包括文本): enter image description here

忽略矩形大小的差异,我只是通过示例覆盖了原始文本,但是原始显示非常完美。 为什么文本被隐藏?我知道可以通过示例完成此操作,但是我不知道我做错了什么。 我正在使用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();
}

1 个答案:

答案 0 :(得分:0)

问题解决了,我在打电话

writer.getDirectContent();

代替

writer.getDirectContentUnder();