簡體   English   中英

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

[英]Adding watermark to PDF using iText7 C#

我將iText 7用於C#,或者實際上是從iTextSharp 5遷移到IPdfPageEvent 。在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接口,也PdfPageEventHelper iText 7 for C#中的類(例如PdfPageEventHelper

請看一下第7章:處理事件。 設置解釋事件系統的查看器首選項和編寫器屬性

在本章中,我們說明如何對以下事件使用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#中存在相同的類,接口和方法,因此對我的示例進行修改對您來說應該不是問題。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM