java – 是否可以在PDFBOX中对齐文本?
PDFBOX API中是否有任何函数可以使文本合理,或者我们必须手动执行?如果手动然后如何使用
java(其背后的逻辑)证明文本
解决方法
This older answer显示了如何将字符串分解为适合给定宽度的子字符串.要制作示例代码,请以填充整个行宽的方式绘制子字符串,替换如下(取决于PDFBox版本):
PDFBox 1.8.x 替换最后一个循环 for (String line: lines) { contentStream.drawString(line); contentStream.moveTextPositionByAmount(0,-leading); } 这个更精致的一个: for (String line: lines) { float charSpacing = 0; if (line.length() > 1) { float size = fontSize * pdfFont.getStringWidth(line) / 1000; float free = width - size; if (free > 0) { charSpacing = free / (line.length() - 1); } } contentStream.appendRawCommands(String.format("%f Tcn",charSpacing).replace(',','.')); contentStream.drawString(line); contentStream.moveTextPositionByAmount(0,-leading); } (从BreakLongString.java测试testBreakStringJustified for PDFBox 1.8.x) 如果你想知道替换(‘,’,’.’) contentStream.appendRawCommands(String.format("%f Tcn",'.')); …我的语言环境使用逗号作为小数分隔符,并且在我的第一次测试运行后在页面内容中产生了逗号,我有点懒,只是添加了替换以修复事物…… PDFBox 2.0.x 替换最后一个循环 for (String line: lines) { contentStream.showText(line); contentStream.newLineAtOffset(0,-leading); } 这个更精致的一个: for (String line: lines) { float charSpacing = 0; if (line.length() > 1) { float size = fontSize * pdfFont.getStringWidth(line) / 1000; float free = width - size; if (free > 0) { charSpacing = free / (line.length() - 1); } } contentStream.setCharacterSpacing(charSpacing); contentStream.showText(line); contentStream.newLineAtOffset(0,-leading); } (从BreakLongString.java开始测试testBreakStringJustified for PDFBox 2.0.x) 该解决方案仅使用额外的字符间距(运算符Tc)来进行调整.您可能会使用额外的字间距(运算符Tw),它只会扩展空格字符,或两者的组合;但请注意:字间距不适用于所有字体编码.有关这些操作数的更多信息,请参阅表105文本状态运算符,第9.3.2节“字符间距”和第9.3.3节“PDF规范ISO 32000-1中的字间距” 而不是前者 你现在得到了 如你所见,仍有一个小的赤字,一段的最后一行显然不应该是合理的.因此,在最后一行中,使用0字符间距代替: contentStream.appendRawCommands("0 Tcn"); // PDFBox 1.8.x contentStream.setCharacterSpacing(0); // PDFBox 2.0.x PS我刚刚偶然发现setCharacterSpacing目前(2016年11月)仅在2.1.0-SNAPSHOT开发版本而不是2.0.x版本.因此,在2.0.x中,您可能不得不重新使用appendRawCommands,即使它已被标记为已弃用. (编辑:李大同) 【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容! |