使用iText7 C#将水印添加到PDF

时间:2016-12-21 14:33:05

标签: c# watermark itext7

我正在使用iText 7进行C#,或实际上我正在从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的东西。我无法找到IPageEvent接口,也无法在iText 7中为C#找到PdfPageEventHelper等类。

1 个答案:

答案 0 :(得分: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();
    }
}

还有一个例子,我们添加文字而不是图像。更具体地说是标题:

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#中存在相同的类,接口和方法,因此调整我的示例不应该成为问题。< / p>