2013-05-30 88 views
4

我正在使用PDFBox從現有PDF模板創建文檔,因此它會打開文件,向其添加文本並將其保存。除了嘗試使用外部TTF字體時,它運行良好。我已經嘗試了不同的方法,並搜索了2天的解決方案,但是PDFBox上並沒有太多內容。PDFBox嵌入式TTF字體不能正常工作

這是一些代碼,使用字體"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(); 
     } 
    } 
} 
+0

經過進一步測試,似乎只有在此之後再次調用SetFont時,纔會出現該問題,以查看另一段文本。看起來,所有的文本都會恢復到最後的字體集。如果我只設置一個文本,或同一字體中的多個文本(Tardy Kid),它就可以工作。 –

回答

4

我已經找到了答案。我不確定這是否是PDFBox中的錯誤,但如果您在同一頁面上多次打開/關閉內容流(由PDPageContentStream返回),它將無法正常工作。因此,如果在頁面上多次調用例程,setText例程中的內容流打開/關閉不起作用。在例程之外移動流並在整個頁面上打開/關閉一次似乎可以清除此問題(以及其他一些問題)。

這在文檔或示例代碼中的任何地方都沒有提及,並且在最好情況下非常微妙。我會稱之爲一個錯誤,尤其是因爲它「有效」(不會拋出任何異常),但會在頁面上創建不確定和/或錯誤的結果。

1

我有一個類似的問題,它來自pom更新,在構建我們的戰爭文件時損壞了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文件沒有損壞。

我們問題的根本原因是我們在我們的資源文件夾中添加了「過濾」。我們這樣做是爲了讓我們可以在我們的健康檢查頁面中使用一些反射來獲取一些值,但是這會損壞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刪除此返工我們是如何走到了我們的健康頁面中的信息。