我想使用以下方法向现有的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/