JAVA itextpdf 段落自动分页指定固定行距打印

JAVA itextpdf 段落自动分页指定固定行距打印

前言:公司有个需求,打印的合同模板左上角要加上logo的图标。但是itext pdf 自动分页会按照默认的顶部高分页打印内容的,导致从第二页开始logo图标就会把合同的内容给覆盖掉了。然后尝试了挺多方法,因为itext 版本问题,很多方法都没办法实现,最后通过多次尝试,最终艰难满足要求。PS:下面的实现方法目前仅在itext5.x版本可行,其他版本没进行实验过,所以不知道是否同样可行,仅供参考。

1. 自定义类实现IEventHandler接口

实现的核心的思想,就是要IEventHandler接口重写handleEvent,

自定义CustomPageStartHandler,该类主要实现从第二页,设置从距离页面顶部处开始

代码如下:

java 复制代码
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. 添加自定义事件处理器
java 复制代码
pdf.addEventHandler(PdfDocumentEvent.START_PAGE, new CustomPageStartHandler(document));
3. 在每页左上角添加logo图标
java 复制代码
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.最终实现的效果如下

相关推荐
Larcher25 分钟前
React Router 不只是页面跳转:从 SPA 路由到权限守卫的完整实践
javascript·后端
Larcher31 分钟前
大模型为什么每次回答都不一样?一文搞懂 Temperature、Top K 与 Top P
javascript·后端
名字还没想好☜3 小时前
Python f-string 进阶:数字格式化、对齐填充、调试 = 号与嵌套表达式
开发语言·数据库·python·字符串格式化·f-string
·薯条大王3 小时前
经济实惠玩云服务器|一台云服务器多人共用,子账号配置教程
java·linux·运维·服务器·汇编·c++·python
eric-sjq4 小时前
10 分钟实战:用 0.6B 本地模型生成中文网页(WanlyFrontend + 编译器全流程)
javascript·机器学习·自然语言处理·html
To_OC4 小时前
LC 438 找到所有字母异位词:暴力超时后,我靠滑动窗口一招搞定
javascript·算法·leetcode
kyriewen5 小时前
面试官问"这段逻辑为什么这样写"——我才发现,这半年我写的代码,我自己都解释不了
前端·javascript·面试
一壶浊酒..6 小时前
Scrape Webpack练习
开发语言·javascript·webpack
ZJH__GO6 小时前
网络编程v4pro--实现聊天室文件传输功能
java·服务器·网络·计算机网络
程序员黑豆6 小时前
Windows 系统 Java 环境变量配置全攻略:解决“不是内部或外部命令”
java·前端·ai编程