【问题标题】:Adding watermark to PDF using iText7 C#使用 iText7 C# 向 PDF 添加水印
【发布时间】:2016-12-21 14:33:04
【问题描述】:

我正在为 C# 使用 iText 7,或者实际上我正在从 iTextSharp 5 迁移到 iText 7。在 iTextSharp 中,我使用了 IPdfPageEvent(更具体地说是 PdfPageEventHelper 辅助类)向 PDF 添加水印:

public MyPageEvent extends PdfPageEventHelper {
  private Image waterMark;
  public MyPageEvent(Image img) {
    waterMark = img;
  }
  public void OnEndPage(PdfWriter writer, Document doc) {
    PdfContentByte content = writer.GetUnderContent();
    content.AddImage(waterMark);
  }
}

Image watermarkImage = new Image(imgPath);
watermarkImage.setAbsolutePosition(x, y);
writer.setPageEvent( new MyPageEvent(watermarkImage) );

现在我正在为此寻找 iText 7 等效项。我在 iText 7 for C# 中找不到IPageEvent 接口,也找不到诸如PdfPageEventHelper 之类的类。

【问题讨论】:

    标签: c# watermark itext7


    【解决方案1】:

    请看Chapter 7: Handling events; setting viewer preferences and writer properties事件系统的解释。

    在本章中,我们将解释如何将addEventHandler() 方法用于以下事件:

    • START_PAGE– 启动新页面时触发,
    • END_PAGE– 在新页面开始之前触发,
    • INSERT_PAGE– 插入页面时触发,并且
    • REMOVE_PAGE– 页面被移除时触发。

    在 iText 5 中,需要在 OnEndPage() 方法中添加水印。在 iText 7 中,您可以选择 START_PAGEEND_PAGE 事件。

    假设您要添加图像作为水印。在这种情况下,您将创建一个 IEventHandler 接口的实现,如下所示:

    protected class TransparentImage implements IEventHandler {
        protected PdfExtGState gState;
        protected Image img;
        public TransparentImage(Image img) {
            this.img = img;
            gState = new PdfExtGState().setFillOpacity(0.2f);
        }
        @Override
        public void handleEvent(Event event) {
            PdfDocumentEvent docEvent = (PdfDocumentEvent) event;
            PdfDocument pdf = docEvent.getDocument();
            PdfPage page = docEvent.getPage();
            Rectangle pageSize = page.getPageSize();
            PdfCanvas pdfCanvas = new PdfCanvas(
                page.getLastContentStream(), page.getResources(), pdf);
            pdfCanvas.saveState().setExtGState(gState);
            Canvas canvas = new Canvas(pdfCanvas, pdf, page.getPageSize());
            canvas.add(img
                .scaleAbsolute(pageSize.getWidth(), pageSize.getHeight()));
            pdfCanvas.restoreState();
            pdfCanvas.release();
        }
    }
    

    还有一个示例,我们添加了文本而不是图像。更具体地说是 a 标头:

    protected class Header implements IEventHandler {
        String header;
        public Header(String header) {
            this.header = header;
        }
        @Override
        public void handleEvent(Event event) {
            PdfDocumentEvent docEvent = (PdfDocumentEvent) event;
            PdfDocument pdf = docEvent.getDocument();
            PdfPage page = docEvent.getPage();
            if (pdf.getPageNumber(page) == 1) return;
            Rectangle pageSize = page.getPageSize();
            PdfCanvas pdfCanvas = new PdfCanvas(
                page.getLastContentStream(), page.getResources(), pdf);
            Canvas canvas = new Canvas(pdfCanvas, pdf, pageSize);
            canvas.showTextAligned(header,
                pageSize.getWidth() / 2,
                pageSize.getTop() - 30, TextAlignment.CENTER);
        }
    }
    

    使用这样的IEventHandler 实现很容易:

    PdfDocument pdf = new PdfDocument(new PdfWriter(dest));
    pdf.addEventHandler(PdfDocumentEvent.START_PAGE,
        new Header("The Strange Case of Dr. Jekyll and Mr. Hyde"));
    

    如您所见,您可以简单地将事件处理程序添加到PdfDocument,指定必须为哪个事件触发处理程序。

    重要提示:我分享的代码是 Java 代码,但是 C# 中存在相同的类、接口和方法,所以你改编我的例子应该不成问题。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2021-07-25
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多