JAVA itextpdf 段落自动分页指定固定行距打印
前言:公司有个需求,打印的合同模板左上角要加上logo的图标。但是itext pdf 自动分页会按照默认的顶部高分页打印内容的,导致从第二页开始logo图标就会把合同的内容给覆盖掉了。然后尝试了挺多方法,因为itext 版本问题,很多方法都没办法实现,最后通过多次尝试,最终艰难满足要求。PS:下面的实现方法目前仅在itext5.x版本可行,其他版本没进行实验过,所以不知道是否同样可行,仅供参考。
1. 自定义类实现IEventHandler接口
实现的核心的思想,就是要IEventHandler接口重写handleEvent,
自定义CustomPageStartHandler,该类主要实现从第二页,设置从距离页面顶部处开始
代码如下:
public class CustomPageStartHandler implements IEventHandler {
private final Document document;
private static final float TOP_MARGIN = 40f;
public CustomPageStartHandler(Document document) {
this.document = document;
}
@Override
public void handleEvent(Event event) {
PdfDocumentEvent docEvent = (PdfDocumentEvent) event;
PdfDocument pdfDoc = docEvent.getDocument();
PdfPage page = docEvent.getPage();
int pageNumber = pdfDoc.getPageNumber(page);
// 控制从第二页开始的内容起始位置
if (pageNumber > 1) {
// 在第二页及之后的页面设置从距离页面顶部处开始
document.setMargins(TOP_MARGIN, document.getRightMargin(),document.getBottomMargin(),document.getLeftMargin());
}
}
}
2. 添加自定义事件处理器
pdf.addEventHandler(PdfDocumentEvent.START_PAGE, new CustomPageStartHandler(document));
3. 在每页左上角添加logo图标
for (int j = 1; j <= pageCount; j++) {
// 试剂logo
Rectangle pageSize = pdf.getPage(j).getPageSize();
String logoImagePath = WebUtils.getClasspath()+ File.separator+ "static" + File.separator + "image" + File.separator+"logo.jpg";
ImageData logoImageData = ImageDataFactory.create(logoImagePath);
logoImageData.setDpi(300, 300);
Image logoImage = new Image(logoImageData);
logoImage.scaleAbsolute(88f, 22f);
document.add(logoImage.setFixedPosition(j, 27f, pageSize.getTop()- 38));
}
4.最终实现的效果如下