如何关闭OpenPDF中长单词自动断词功能?
如何关闭OpenPDF中长单词自动断词功能?
嘿,我刚好折腾过OpenPDF 2.0.3版本的类似问题,给你捋捋怎么解决~
首先,先搞定“不让长单词被任意截断”的核心需求:
OpenPDF默认会自动拆分超长单词来适配容器宽度,要关掉这个,关键就是禁用它的断词功能。不管你用的是ColumnText还是PdfPCell,都可以通过设置断词策略为null来实现。
针对PdfPCell的操作
给单元格设置setHyphenation(null)就可以了,这样超长单词会完整地移到下一行;如果还是放不下,就会直接超出单元格边界,但绝对不会被截断。示例代码:
PdfPCell cell = new PdfPCell(new Phrase("Supercalifragilisticexpialidocious")); // 禁用自动断词 cell.setHyphenation(null);
针对ColumnText的操作
给要添加的Phrase(或者Paragraph)设置setHyphenation(null),再添加到ColumnText中,就能实现同样的效果:
ColumnText ct = new ColumnText(writer.getDirectContent()); ct.setSimpleColumn(100, 700, 500, 600); // 定义列的左右上下坐标,可用宽度为400 Phrase longWordPhrase = new Phrase("Supercalifragilisticexpialidocious"); longWordPhrase.setHyphenation(null); // 禁用断词 ct.addElement(longWordPhrase); ct.go();
接下来是你提到的“超长单词放不下就抛出错误”的需求:
OpenPDF本身没有自带这个检测机制,得我们自己手动做宽度校验,步骤很简单:
- 获取文本使用的字体,计算出超长单词的实际显示宽度;
- 对比容器(单元格/列)的可用宽度;
- 如果单词宽度超过容器,就抛出自定义异常。
给你举个PdfPCell的完整校验例子:
// 初始化字体,这里用默认Helvetica,你可以换成自己项目里的字体 BaseFont baseFont = BaseFont.createFont(BaseFont.HELVETICA, BaseFont.CP1252, BaseFont.NOT_EMBEDDED); float fontSize = 12; // 你的文本字体大小 String longWord = "Supercalifragilisticexpialidocious"; // 计算单词的实际显示宽度 float wordWidth = baseFont.getWidthPoint(longWord, fontSize); // 创建单元格并设置宽度(假设设置为300) PdfPCell cell = new PdfPCell(new Phrase(longWord, new Font(baseFont, fontSize))); cell.setWidth(300); cell.setHyphenation(null); // 禁用断词 // 校验宽度,超出就抛错 if (wordWidth > cell.getWidth()) { throw new IllegalArgumentException("长单词长度超出单元格可用宽度!"); }
ColumnText的校验逻辑也大同小异,只要把容器宽度换成列的实际可用宽度(比如上面例子里的500-100=400)就行。
备注:内容来源于stack exchange,提问作者Chris van Darg
相关产品推荐
相关产品推荐

