Java中如何用iText 5.5.9将旋转90°的长文本拆分至两个矩形?
用iText 5.5.9实现旋转文本拆分到多个矩形
当然可以实现这个需求!你之前把文本渲染成模板再旋转的方式,没法处理超长文本的自动拆分。我们可以直接利用ColumnText的文本续排能力,配合画布旋转来实现顺时针90度的竖排文本拆分到两个矩形中,具体步骤如下:
核心思路
- 借助
PdfContentByte的坐标变换,把整个画布顺时针旋转90度,后续添加的文本会自动变成竖排(和你之前用setRotationDegrees(-90)的效果一致)。 - 用
ColumnText先填充第一个目标矩形,通过go()方法的返回状态判断是否还有剩余文本。 - 如果有未渲染的文本,再用
ColumnText填充第二个矩形,实现文本的自动延续。
完整代码示例
final Document document = new Document(PageSize.A3); document.setMargins(0f, 0f, 0f, 0f); final PdfWriter pdfWriter = PdfWriter.getInstance(document, outputStream); document.open(); final String text = "这里替换成你的超长文本内容..."; Font myFont = new Font(FontFamily.HELVETICA, 12); // 获取PDF内容操作对象 PdfContentByte contentByte = pdfWriter.getDirectContent(); // 保存当前画布状态,后续恢复原始状态 contentByte.saveState(); // 执行顺时针90度的坐标变换 // 变换矩阵说明:实现顺时针旋转90度,同时调整原点适配A3页面布局 contentByte.concatCTM(0, 1, -1, 0, 0, document.getPageSize().getWidth()); // 定义旋转坐标系下的两个矩形(对应原始页面的竖排区域) // 第一个矩形:对应原始页面中(0, 100)到(100, 700)的竖排区域 Rectangle rect1 = new Rectangle(100, 0, 700, 100); // 第二个矩形:对应原始页面中(150, 100)到(250, 700)的竖排区域 Rectangle rect2 = new Rectangle(100, 150, 700, 250); // 配置段落样式,和你之前的设置保持一致 Paragraph paragraph = new Paragraph(text, myFont); paragraph.setAlignment(Element.ALIGN_JUSTIFIED); paragraph.setLeading(0f, 1.2f); // 初始化ColumnText并添加段落 ColumnText columnText = new ColumnText(contentByte); columnText.addElement(paragraph); // 填充第一个矩形 int status = columnText.setSimpleColumn(rect1); status = columnText.go(); // 如果还有剩余文本,继续填充第二个矩形 if (ColumnText.hasMoreText(status)) { columnText.setSimpleColumn(rect2); columnText.go(); } // 恢复画布原始状态 contentByte.restoreState(); document.close();
关键细节说明
- 坐标变换:
concatCTM(0, 1, -1, 0, 0, document.getPageSize().getWidth())这个变换矩阵实现了顺时针90度旋转,同时调整原点位置确保文本在页面上的布局符合预期。你可以根据自己的目标矩形位置,调整矩阵参数或矩形的坐标值。 - 文本续排判断:
ColumnText.go()方法会返回文本填充状态,通过ColumnText.hasMoreText(status)能快速判断是否还有未渲染的剩余文本,这是实现自动拆分的核心逻辑。 - 方案优势:直接操作画布和
ColumnText避免了将文本转成图片的损耗,同时天然支持文本的自动续排,不需要手动处理文本截断和拆分的复杂逻辑。
内容的提问来源于stack exchange,提问作者Cimlman
相关产品推荐
相关产品推荐

