这个较旧的答案 https://stackoverflow.com/questions/19635275/how-to-generate-multiple-lines-in-pdf-using-apache-pdfbox/19683618#19683618展示如何将字符串分解为适合给定的子字符串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);
}
(From BreakLongString.java https://github.com/mkl-public/testarea-pdfbox1/blob/master/src/test/java/mkl/testarea/pdfbox1/content/BreakLongString.java#L124 test testBreakStringJustified
适用于 PDFBox 1.8.x)
如果您想知道replace(',', '.')
in
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);
}
(From BreakLongString.java https://github.com/mkl-public/testarea-pdfbox2/blob/master/src/test/java/mkl/testarea/pdfbox2/content/BreakLongString.java#L123 test testBreakStringJustified
适用于 PDFBox 2.0.x)
该解决方案仅使用额外的字符间距(运算符Tc)作为理由。您可以使用额外的字间距(运算符Tw) 仅扩展空格字符或两者的组合;但请注意:字间距并不适用于所有字体编码。有关这些操作数的更多信息请参见。表105文本状态运算符,第 9.3.2 节字符间距,以及第 9.3.3 节字间距在 PDF 规范中ISO 32000-1 http://www.adobe.com/content/dam/Adobe/en/devnet/acrobat/pdfs/PDF32000_2008.pdf
而不是前者
你现在得到
正如你所看到的,仍然有一个小缺陷,段落的最后一行显然不应该被证明是合理的。因此,在最后一行中,使用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
相反,即使它已被标记为已弃用。