是否有可能certificate在PDFBOX文本?

在PDFBOX API中是否有任何function使文本alignment,或者我们必须手动执行? 如果手动然后如何certificate文字使用Java(背后的逻辑)

这个较旧的答案显示了如何将字符串拆分成适合给定width子字符串。 为了使示例代码在这里绘制子字符串以填充整行宽度,替换如下(取决于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 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(',', '.')); 

…我的语言环境使用逗号作为小数点分隔符,并在我的第一次测试运行在页面内容中导致逗号,我有点懒惰,只是补充说,取代修复的东西…

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为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 ,即使它已被标记为废弃。