【问题标题】:Adding text as watermark using itext7 C#使用itext7 C#将文本添加为​​水印
【发布时间】:2016-12-22 12:48:22
【问题描述】:

我正在使用以下代码为我的 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);
    }

但是我只在最后一页中获得水印,该页面过于隐藏在内容之下。您能否修改此代码,以便我可以在所有页面上获取水印并显示在内容上。

【问题讨论】:

  • 您的代码有很多问题。例如:您不需要两个 PdfDocument 实例。一个就够了。
  • 请给出简洁的代码。参数解释得不好。请多花点力气解释这个问题。它将帮助其他人给你一个更好、更有用的答案。万事如意!

标签: c# pdf watermark itext7


【解决方案1】:

请查看iText 7 for C# jump-start tutorial,更具体地说是Chapter 5: Manipulating an existing PDF document。滚动到它显示的部分:“添加页眉、页脚和水印”并查看示例:

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 的文件。

您想向每个页面添加内容。这意味着您必须遍历每一页(从1n)。获取每个页面iPdfPage 对象并将//Draw header text 行替换为您想要执行的任何操作。

在您的情况下,您在现有内容下方添加图像。那是正常的事情,但是你说水印被现有的内容覆盖了。例如,当实际内容由图像(例如扫描的页面)组成时,就会发生这种情况。如果您在包含扫描页面的 PDF 的页面下添加水印,您将永远看不到水印。

在这种情况下,您必须在现有内容之上添加内容,但最好让水印透明:

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() / 2pageSize.GetHeight() / 2 作为坐标,这意味着我们假设页面的左下角有坐标(0, 0)。情况可能并非如此。您可能需要将 x 偏移量和 y 偏移量添加到该值。

【讨论】:

  • “最好让水印透明” - 透明度最好,混合模式变暗。
  • 请注意,这里的例子是传递一个“45”的旋转角度。 iText7 期望该角度以弧度为单位,而不是度数。如果你想要 45 度的旋转,你应该指定 "(float) Math.PI / 180 * 45"。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2021-07-25
  • 1970-01-01
  • 1970-01-01
  • 2012-09-21
相关资源
最近更新 更多