[英]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.