我正在使用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
等类。
答案 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_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();
}
}
还有一个例子,我们添加文字而不是图像。更具体地说是标题:
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>