在 java 中使用 iText pdf 交替更改 pdf 页面的颜色

Change the color of pdf pages alternatively using iText pdf in java

我正在根据客户 activity 创建报告。 我在 iText PDF 库的帮助下创建了这份报告。 我想用蓝色背景创建前两个页面(用于产品名称和免责声明) 其余页面为白色(无背景色)。 我使用以下代码在报告的开头用蓝色给两页上色。

Rectangle pageSize = new Rectangle(PageSize.A4);
pageSize.setBackgroundColor(new BaseColor(84, 141, 212));
Document document = new Document( pageSize );

但是当我使用 document.newpage() 移动到第 3 页时,页面仍然是蓝色的。 我无法更改第 3 页的颜色。我想将第 3 页以后的颜色更改为白色。 我如何使用 iText 执行此操作?

这是

的后续问题

虽然该问题的答案中给出的建议有效,但这并不是您可以获得的最佳建议。如果我早点看到你原来的问题,我会做出不同的回答。我建议您使用页面事件,就像在 PageBackgrounds 示例中所做的那样。

在本例中,我为第 1 页和第 2 页创建了蓝色背景,为所有后续偶数页创建了灰色背景。参见 page_backgrounds.pdf

这是如何实现的?好吧,使用我在回答这个相关问题时使用的相同技术:How to draw border for whole pdf pages using iText library 5.5.2

我创建了这样一个页面事件:

public class Background extends PdfPageEventHelper {
    @Override
    public void onEndPage(PdfWriter writer, Document document) {
        int pagenumber = writer.getPageNumber();
        if (pagenumber % 2 == 1 && pagenumber != 1)
            return;
        PdfContentByte canvas = writer.getDirectContentUnder();
        Rectangle rect = document.getPageSize();
        canvas.setColorFill(pagenumber < 3 ? BaseColor.BLUE : BaseColor.LIGHT_GRAY);
        canvas.rectangle(rect.getLeft(), rect.getBottom(), rect.getWidth(), rect.getHeight());
        canvas.fill();
    }
}

如您所见,我首先检查页码。如果是奇数且不等于1,我什么都不做。

但是,如果我在第 1 页或第 2 页,或者页码是偶数,我从 writer 获取内容,并从 [=13] 获取页面的尺寸=].然后我将填充颜色设置为蓝色或浅灰色(取决于页码),并为覆盖整个页面的矩形构建路径。最后,我用填充颜色填充该矩形。

现在我们已经有了自定义 Background 事件,我们可以像这样使用它:

PdfWriter writer = PdfWriter.getInstance(document, new FileOutputStream(filename));
Background event = new Background();
writer.setPageEvent(event);

如果您需要不同的行为,请随时调整 Background class。