答案 0 :(得分:6)
对于这样的问题,请咨询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()
。如果不这样做,您可能会受到不良影响,例如受您所做更改影响的其他内容(例如,您不希望所有内容都变得透明)。