使用iText7实现PDF文本自动双栏排布及跨页承接的问题
基于iText7实现自动流双栏PDF的解决方案
不要用表格模拟双栏布局,iText7原生支持区域渲染和内容自动流转,直接用ColumnDocumentRenderer就能实现需求,完全不需要手动预判内容长度。
具体实现步骤:
- 先定义页面双栏的区域参数,设置好页面边距后,把页面可绘制区域平分为左右两个等高的矩形
- 直接给Document对象绑定双栏渲染器,渲染器会自动处理内容流转逻辑:优先填充当前页左栏,左栏满了自动切到当前页右栏,右栏满了自动生成新页并从新页左栏继续填充
- 所有文本、段落、图片、表格等元素正常添加到Document对象即可,不需要手动拆分内容
Java版本示例代码:
// 初始化PDF对象 PdfDocument pdfDoc = new PdfDocument(new PdfWriter("双栏输出示例.pdf")); Document doc = new Document(pdfDoc); // 计算双栏尺寸(单位:点) PageSize pageSize = pdfDoc.getDefaultPageSize(); float pageMargin = 36; // 页面四周边距 float columnGap = 24; // 两栏中间的间距 float columnWidth = (pageSize.getWidth() - 2 * pageMargin - columnGap) / 2; float columnHeight = pageSize.getHeight() - 2 * pageMargin; // 定义左右两个栏的绘制区域 Rectangle[] columnAreas = new Rectangle[]{ // 左栏坐标 new Rectangle(pageMargin, pageMargin, columnWidth, columnHeight), // 右栏坐标 new Rectangle(pageMargin + columnWidth + columnGap, pageMargin, columnWidth, columnHeight) }; // 绑定双栏渲染器 doc.setRenderer(new ColumnDocumentRenderer(doc, columnAreas)); // 正常添加任意长度内容即可 for (int i = 0; i < 50; i++) { doc.add(new Paragraph("此处可插入任意长文本、图片、表格等元素,渲染器会自动完成跨栏、跨页的内容流转,不会出现内容溢出或者截断问题。".repeat(8))); } doc.close();
如果你使用的是C#版本的iText7,逻辑完全一致,只需要替换为对应C#语法即可。该方案比表格模拟双栏的适配性高很多,复杂元素也能正常自动拆分。
内容的提问来源于stack exchange,提问作者José Antonio Ayala Nadales
相关产品推荐
相关产品推荐

