[英]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_PAGE
或END_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.