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

ITextSharp insert text to an existing pdf

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

最佳答案

对于此类问题,请咨询The Best iText Questions on StackOverflow。本书捆绑了数百个先前在StackOverflow上发布并回答的问题,包括来自封闭问题跟踪器的一些答案。这是之前未在StackOverflow上发布的答案:

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

PdfContentByte canvas = pdfStamper.getOverContent(i);


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

我写了一个简单的示例,说明了如何完成此操作。它称为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();
}


一些额外的提示和技巧:


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

关于c# - PDF文件中的水印隐藏在图像后面,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/30894122/

10-13 03:53