[英]Is it possible to justify text in PDFBOX?
PDFBOX API 中是否有任何功能可以使文本对齐,或者我们必须手动完成?? 如果手动,那么如何使用 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);
}
(来自 PDFBox 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);
}
(来自 PDFBox 2.0.x 的BreakLongString.java测试testBreakStringJustified
)
此解决方案仅使用额外的字符间距(运算符Tc )进行调整。 您可以改为使用仅扩展空格字符的额外字间距(运算符Tw ),或两者的组合; 但要注意:字间距不适用于所有字体编码。 有关这些操作数的更多信息,请参见。 表 105文本状态运算符,PDF 规范ISO 32000-1中的第 9.3.2 节字符间距和第 9.3.3 节字间距
而不是前者
你现在得到
如您所见,仍有一个小缺陷,段落的最后一行显然不应该是合理的。 因此,在最后一行中,使用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
,即使它已被标记为已弃用。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.