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

Kra*_*rma 1 c# pdf itextsharp

我想使用以下内容为现有PDF添加水印:

ITextSharp将文本插入现有pdf

第3个答案正在运行,但如果PDF包含图像,则水印隐藏在其后面.

Bru*_*gie 6

对于这样的问题,请参阅StackOverflow上的最佳iText问题.本书捆绑了以前在StackOverflow上发布和回答的数百个问题,包括我们封闭的问题跟踪器的一些答案.这是一个在以前没有在StackOverflow上发布的答案:

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

PdfContentByte canvas = pdfStamper.getOverContent(i);
Run Code Online (Sandbox Code Playgroud)

现在文本将覆盖图像,但它可能隐藏一些重要信息.如果你想避免这种情况,你需要引入透明度.

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

在此输入图像描述

首先,我在现有内容下添加"在现有内容下添加此水印"文本.部分文本被隐藏(正如您在问题中指出的那样).然后,我在现有内容的基础上添加文本"此水印添加到现有内容的顶部".这可能就足够了,除非您担心通过覆盖现有内容会丢失一些重要信息.在这种情况下,看看我如何添加文本"此透明水印添加到现有内容的顶部":

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();
}
Run Code Online (Sandbox Code Playgroud)

一些额外的提示和技巧:

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