我使用以下代码为我的pdf添加水印。
private void Merge(List<string> src, string dest)
{
iTextKernel.PdfWriter writer = new iTextKernel.PdfWriter(dest);
iTextKernel.PdfDocument pdfDocument1 = new iTextKernel.PdfDocument(new iTextKernel.PdfReader(src[0]), writer);
pdfDocument1.AddEventHandler(PdfDocumentEvent.END_PAGE, new WatermarkingEventHandler());
for (int i = 1, max = src.Count; i < max; i++)
{
iTextKernel.PdfDocument pdfDocument2 = new iTextKernel.PdfDocument(new iTextKernel.PdfReader(src[i]));
var pagesCount = pdfDocument2.GetNumberOfPages();
pdfDocument2.CopyPagesTo(1, pagesCount, pdfDocument1);
pdfDocument2.Close();
}
pdfDocument1.Close();
protected class WatermarkingEventHandler : IEventHandler {
public void HandleEvent(Event e) {
PdfDocumentEvent docEvent = (PdfDocumentEvent) e;
iTextKernel.PdfDocument pdfDoc = docEvent.GetDocument();
iTextKernel.PdfPage page = docEvent.GetPage();
iText.Kernel.Font.PdfFont font = null;
try {
font = PdfFontFactory.CreateFont(FontConstants.HELVETICA_BOLD);
} catch (IOException ex) {
//_log.Error(ex);
}
PdfCanvas canvas = new PdfCanvas(page.NewContentStreamBefore(), page.GetResources(), pdfDoc);
new Canvas(canvas, pdfDoc, page.GetPageSize())
.SetFontColor(iText.Kernel.Colors.DeviceGray.LIGHT_GRAY)
.SetFontSize(60)
.SetFont(font)
.ShowTextAligned(new Paragraph("FOR YOUR RECORDS ONLY: DO NOT SUBMIT"), 298, 421, pdfDoc.GetPageNumber(page),
TextAlignment.CENTER, VerticalAlignment.MIDDLE, 45);
}
但我只是在最后一页中隐藏在内容之下的水印。您可以修改此代码,以便我可以在所有页面上获得水印并显示在内容上。
答案 0 :(得分:0)
请查看iText 7 for C# jump-start tutorial,更具体地说Chapter 5: Manipulating an existing PDF document。滚动到它所说的部分:&#34;添加页眉,页脚和水印&#34; 并查看示例:
PdfDocument pdfDoc = new PdfDocument(new PdfReader(src), new PdfWriter(dest));
Document document = new Document(pdfDoc);
Rectangle pageSize;
PdfCanvas canvas;
int n = pdfDoc.GetNumberOfPages();
for (int i = 1; i <= n; i++) {
PdfPage page = pdfDoc.GetPage(i);
pageSize = page.GetPageSize();
canvas = new PdfCanvas(page);
//Draw header text
}
pdfDoc.close();
正如您所看到的,我们只需要一个PdfDocument
实例,但我们还传递PdfWriter
实例,而不是只传递PdfReader
。我们将使用路径src
读取文件,然后我们将写入路径为dest
的文件。
您想要为每个页面添加内容。这意味着您必须遍历每个页面(从1
到n
)。获取每个页面PdfPage
的{{1}}对象,并将行i
替换为您想要执行的操作。
在您的情况下,您在现有内容下添加图像。这是正常的事情,但是你说水印是由现有的内容覆盖的。例如,当实际内容由图像(例如,扫描页面)组成时,就会发生这种情况。如果您在包含扫描页面的PDF页面下添加水印,您将永远不会看到水印。
在这种情况下,您必须在现有内容的基础上添加内容,但最好使水印透明:
//Draw header text
请注意,在本教程中,我们使用Paragraph p = new Paragraph("FOR YOUR RECORDS ONLY: DO NOT SUBMIT").SetFontSize(60);
canvas.SaveState();
PdfExtGState gs1 = new PdfExtGState().SetFillOpacity(0.2f);
canvas.SetExtGState(gs1);
document.ShowTextAligned(p, pageSize.GetWidth() / 2, pageSize.GetHeight() / 2, pdfDoc.GetPageNumber(page), TextAlignment.CENTER, VerticalAlignment.MIDDLE, 45);
canvas.RestoreState();
和pageSize.GetWidth() / 2
作为坐标,这意味着我们假设页面的左下角有坐标pageSize.GetHeight() / 2
。情况可能并非如此。您可能必须将x偏移量和y偏移量添加到该值。