【发布时间】:2015-09-02 20:07:10
【问题描述】:
【问题讨论】:
-
为什么要否决这个问题?这是一个真正的问题。当然,没有代码示例,但代码示例在另一个问题中。
标签: c# pdf itextsharp
【问题讨论】:
标签: c# pdf itextsharp
如有此类问题,请咨询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()。如果不这样做,您可能会得到不良影响,例如受您所做更改影响的其他内容(例如,您不希望所有内容都变得透明)。【讨论】: