PDF 文件中的水印隐藏在图像后面

Watermark in PDF file is hiding behind images

我想使用以下方法为现有 PDF 添加水印:

ITextSharp insert text to an existing pdf

第三个答案有效,但如果 PDF 包含图像,则水印会隐藏在图像后面。

此类问题请咨询The Best iText Questions on Whosebug。这本书捆绑了数百个以前在 Whosebug 上发布和回答的问题,包括来自我们已关闭问题跟踪器的一些答案。这是一个以前没有在 Whosebug 上发布过的答案:

如果您的 PDF 中有不透明的形状(例如图像,还有彩色形状),您需要在现有内容之上添加水印:

PdfContentByte canvas = pdfStamper.getOverContent(i);

现在文字会盖住图片,但可能会隐藏一些重要信息。如果要避免这种情况,就需要引入透明度。

我写了一个简单的例子来说明这是如何完成的。它被称为TransparentWatermark 我们来看看结果:

首先,我在现有内容下添加文本 "This watermark is added UNDER the existing content"。 部分文本被隐藏(正如您在问题中指出的那样)。 然后我在现有内容之上添加文本 "This watermark is added ON TOP OF the existing content"。这可能就足够了,除非您担心某些重要信息会因覆盖现有内容而丢失。 在那种情况下,看看我如何添加文本 "This TRANSPARENT watermark is added ON TOP OF the existing content":

public void manipulatePdf(String src, String dest) throws IOException, DocumentException {
    PdfReader reader = new PdfReader(src);
    int n = reader.getNumberOfPages();
    PdfStamper stamper = new PdfStamper(reader, new FileOutputStream(dest));
    PdfContentByte under = stamper.getUnderContent(1);
    Font f = new Font(FontFamily.HELVETICA, 15);
    Phrase p = new Phrase(
        "This watermark is added UNDER the existing content", f);
    ColumnText.showTextAligned(under, Element.ALIGN_CENTER, p, 297, 550, 0);
    PdfContentByte over = stamper.getOverContent(1);
    p = new Phrase("This watermark is added ON TOP OF the existing content", f);
    ColumnText.showTextAligned(over, Element.ALIGN_CENTER, p, 297, 500, 0);
    p = new Phrase(
        "This TRANSPARENT watermark is added ON TOP OF the existing content", f);
    over.saveState();
    PdfGState gs1 = new PdfGState();
    gs1.setFillOpacity(0.5f);
    over.setGState(gs1);
    ColumnText.showTextAligned(over, Element.ALIGN_CENTER, p, 297, 450, 0);
    over.restoreState();
    stamper.close();
    reader.close();
}

一些额外的提示和技巧:

  • 更改图形状态时始终使用 saveState()restoreState()。如果不这样做,您可能会收到不良影响,例如其他内容会受到您所做更改的影响(例如,您不希望所有内容都变得透明)。
  • 文本的默认渲染模式是"fill",因此我更改了填充不透明度。
  • 在这种情况下,我定义了 50% (0.5f) 的填充不透明度。如果要更改文本的透明度,请选择 0.0f 和 1.0f 之间的任何值。