在PDFBOX API中是否有任何function使文本alignment,或者我们必须手动执行? 如果手动然后如何certificate文字使用Java(背后的逻辑)
这个较旧的答案显示了如何将字符串拆分成适合给定width
子字符串。 为了使示例代码在这里绘制子字符串以填充整行宽度,替换如下(取决于PDFBox版本):
替换最后的循环
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 Tc\n", charSpacing).replace(',', '.')); contentStream.drawString(line); contentStream.moveTextPositionByAmount(0, -leading); }
(从PDFBlock 1.8.x的BreakLongString.java测试testBreakStringJustified
)
如果你想知道replace(',', '.')
的内容
contentStream.appendRawCommands(String.format("%f Tc\n", charSpacing).replace(',', '.'));
…我的语言环境使用逗号作为小数点分隔符,并在我的第一次测试运行在页面内容中导致逗号,我有点懒惰,只是补充说,取代修复的东西…
替换最后的循环
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
为PDFBox 2.0.x)
此解决方案仅使用额外的字符间距(运算符Tc )进行调整。 您可以改为使用额外的单词间距(运算符Tw ),它只扩展空格字符,或两者的组合; 请注意,虽然:字间距不适用于所有字体编码。 有关这些操作数的更多信息,请参阅 表105 文本状态操作符 ,部分9.3.2 字符间距和部分9.3.3 PDF规范ISO 32000-1中的字间距
而不是前者
你现在得到
正如你所看到的,还有一个小小的赤字,一个段落的最后一行显然不应该是合理的。 因此,在最后一行中,使用一个0
字符的空格来代替:
contentStream.appendRawCommands("0 Tc\n"); // 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
,即使它已被标记为废弃。