请看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_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# 中存在相同的类、接口和方法,所以你改编我的例子应该不成问题。