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();
我需要的是在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();