簡體   English   中英

是否可以在 PDFBOX 中對齊文本?

[英]Is it possible to justify text in PDFBOX?

PDFBOX API 中是否有任何功能可以使文本對齊,或者我們必須手動完成?? 如果手動,那么如何使用 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);
}

(來自 PDFBox 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);
}

(來自 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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM