簡體   English   中英

PDFBox 嵌入的 TTF 字體不起作用

[英]PDFBox embedded TTF fonts not working

我正在使用 PDFBox 從現有的 PDF 模板構建文檔,因此它會打開文件,向其中添加文本並保存。 它運行良好,除非嘗試使用外部 TTF 字體。 我嘗試了不同的方法並搜索了 2 天的解決方案,但 PDFBox 上的內容並不多。

這是一些代碼,使用字體“Tardy Kid”,因為它不會被誤認為是其他任何東西,並且不可能是任何標准庫的一部分。

代碼執行良好,顯示 println 中的“TardyKid”(顯示字體已加載且名稱可獲取),並顯示文本——但它是 Helvetica。 使用getStringWidth()計算寬度的代碼中更復雜的部分似乎也表明寬度表已成功加載。 它只是不能正確顯示。

該代碼在一個更大的程序的上下文中運行,該程序打開一個現有的 PDF 文檔(模板)並向其中添加文本。 除了

 public void setText ( PDDocument document, String text ) throws IOException {
     int lastPage = document.getNumberOfPages() - 1;
     PDPage page = (PDPage) document.getDocumentCatalog().getAllPages().get(lastPage);
     PDPageContentStream contentStream = null;
     try {
         contentStream = new PDPageContentStream(document,page,true,true,false);
         File fontFile = new File(m_fontDir, "Tardy_Kid.ttf");
         PDFont font = PDTrueTypeFont.loadTTF(document, fontFile);
         Color color =  new Color(196, 18, 47);
         float x = 100f, y = 700f;
         System.out.println(font.getBaseFont());
         contentStream.setFont(font, 32);
         contentStream.setNonStrokingColor(color);
         contentStream.beginText();
         contentStream.moveTextPositionByAmount(x,y);
         contentStream.drawString(text);
         contentStream.endText();
     } finally {
         if (contentStream != null) {
             contentStream.close();
         }
     }
 }

我找到了答案。 我不確定這是否是 PDFBox 中的錯誤,但如果您在同一頁面上多次打開/關閉內容流(由 PDPageContentStream 返回),則無法正常工作。 因此,當在頁面上多次調用該例程時,在 setText 例程中打開/關閉內容流不起作用。 將流移出例程並為整個頁面打開/關閉一次似乎解決了這個問題(以及其他幾個問題)。

這在文檔或示例代碼的任何地方都沒有提到,充其量是非常微妙的。 我將其稱為錯誤,特別是因為它“有效”(不引發任何異常)但會在頁面上創建不確定和/或錯誤的結果。

我有一個類似的問題,它來自一個 pom 更新,它在構建我們的 war 文件時損壞了 pdf 模板文件。

堆棧跟蹤指出“無法讀取字體 TimesNewRoman,Bold 的嵌入 TTF”,這當然是在看到與“推回大小”相關的錯誤后,我們設置了一個新的屬性值以使其過去(我看到的異常供參考: org.apache.pdfbox.exceptions.WrappedIOException: Could not push back 480478 bytes in order to reparse stream. Try increasing push back buffer using system property org.apache.pdfbox.baseParser.pushBackSize )。

我們花了一段時間,但是在爆發戰爭並嘗試打開戰爭中的pdf文件后,我們注意到它已損壞,但源中的pdf文件未損壞。

我們問題的根本原因是我們在 pom 中為我們的資源文件夾添加了“過濾”。 我們這樣做是為了我們可以使用一些反射在我們的健康檢查頁面中獲取一些值,但這破壞了 pdf 文件,我們從以下參考資料中發現: https : //bitbucket.org/petermr/xhtml2stm/issues/ 12/pdf-files-are-being-corrupted-at-some

以下是我們設置的過濾示例:

<resources>
    <resource>
        <directory>src/main/resources</directory>
        <filtering>true</filtering>
    </resource>
</resources>

我們的解決方案是從我們的 pom 中刪除它,並重新設計我們獲取健康頁面信息的方式。

多年后,隨着 PDFBOX 接近 3.0.0 版本(但正式在 2.0.23 版本上),上述(特別是對於 Unicode)似乎是使用 PDType0Font.load() 完成的(在此處的2.0 版本遷移指南中提到)主要根據關於 SO 的問題。

我正在為同樣的問題苦苦掙扎,我發現在我的情況下,在使用 PDDocument.saveIncremental() 時出了點問題 - 恕我直言,這需要仔細考慮與您需要調用 getCOSObject().setNeedToBeUpdated(true ) 在許多不容易弄清楚的地方。 因此,為了以防萬一並縮小可能出現的問題,請檢查簡單的 PDDocument.save() 是否有效。

順便說一句,我確實檢查了其他建議,即打開和寫入 PDPageContentStream 一次而不是多次,並檢查字體本身是否被 Maven 資源過濾損壞,但事實並非如此。 排除第二個問題,僅供參考,如果您需要LiberationSans-Regular TTF字體, 它作為資源嵌入PDFBOX本身,無需將其添加到您自己的資源中。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

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