2013-02-12 75 views
0

我正在使用此示例將java swing JFrame轉換爲pdf:export jcomponent to pdf with itext。問題是當我的框架包含像čěř...這樣的UTF-8字符時。這些字符在導出的文檔中缺失。我如何在我的pdf中打開這些字符?當導出java swing組件時,IText忽略UTF-8字符

UPDATE:

我嘗試你的榜樣,但我得到異常:

ExceptionConverter: com.itextpdf.text.DocumentException: Font 'fonts/verdana.ttf,1' with 'Identity-H' is not recognized. 
    at com.itextpdf.text.pdf.BaseFont.createFont(BaseFont.java:699) 
    at com.itextpdf.text.pdf.BaseFont.createFont(BaseFont.java:606) 
    at com.itextpdf.text.pdf.BaseFont.createFont(BaseFont.java:549) 
    at com.itextpdf.text.pdf.DefaultFontMapper.awtToPdf(DefaultFontMapper.java:107) 
    at com.itextpdf.text.pdf.PdfGraphics2D.getCachedBaseFont(PdfGraphics2D.java:1082) 
    at com.itextpdf.text.pdf.PdfGraphics2D.setFont(PdfGraphics2D.java:1075) 
    at javax.swing.JComponent.paintChildren(JComponent.java:855) 
    at javax.swing.JComponent.printChildren(JComponent.java:1214) 
    at javax.swing.JComponent.paint(JComponent.java:1049) 
    at javax.swing.JComponent.print(JComponent.java:1183) 
    at javax.swing.JComponent.paintChildren(JComponent.java:874) 
    at javax.swing.JComponent.printChildren(JComponent.java:1214) 
    at javax.swing.JComponent.paint(JComponent.java:1049) 
    at javax.swing.JComponent.print(JComponent.java:1183) 
    at javax.swing.JComponent.paintChildren(JComponent.java:874) 
    at javax.swing.JComponent.printChildren(JComponent.java:1214) 
    at javax.swing.JComponent.paint(JComponent.java:1049) 
    at javax.swing.JComponent.print(JComponent.java:1183) 
    at javax.swing.JComponent.paintChildren(JComponent.java:874) 
    at javax.swing.JComponent.printChildren(JComponent.java:1214) 
    at javax.swing.JComponent.paint(JComponent.java:1049) 
    at javax.swing.JComponent.print(JComponent.java:1183) 
    at javax.swing.JComponent.paintChildren(JComponent.java:874) 
    at javax.swing.JComponent.printChildren(JComponent.java:1214) 
    at javax.swing.JComponent.paint(JComponent.java:1049) 
    at javax.swing.JComponent.print(JComponent.java:1183) 
    at javax.swing.JComponent.paintChildren(JComponent.java:874) 
    at javax.swing.JComponent.printChildren(JComponent.java:1214) 
    at javax.swing.JComponent.paint(JComponent.java:1049) 
    at javax.swing.JComponent.print(JComponent.java:1183) 
    at javax.swing.JComponent.paintChildren(JComponent.java:874) 
    at javax.swing.JComponent.printChildren(JComponent.java:1214) 
    at javax.swing.JComponent.paint(JComponent.java:1049) 
    at javax.swing.JComponent.print(JComponent.java:1183) 
    at javax.swing.JComponent.paintChildren(JComponent.java:874) 
    at javax.swing.JComponent.printChildren(JComponent.java:1214) 
    at javax.swing.JComponent.paint(JComponent.java:1049) 
    at javax.swing.JComponent.print(JComponent.java:1183) 
    at javax.swing.JComponent.paintChildren(JComponent.java:874) 
    at javax.swing.JComponent.printChildren(JComponent.java:1214) 
    at javax.swing.JComponent.paint(JComponent.java:1049) 
    at javax.swing.JComponent.print(JComponent.java:1183) 
    at GUI.PlayOffPanel.export(PlayOffPanel.java:322) 

看起來像有一些是一些問題,進口的.ttf像宋體或時間,但與例如你加什麼字體工作。但我真的很想使用Verdana字體,所以仍然在尋找答案

+0

我沒有答案,但可能會幫助您解決問題。我曾經有JasperReport(它使用iText生成PDF)的問題,我不得不添加我的字體文件(包含所需字符的字體)組織在一個.jar(一些XML和TTF文件) – JScoobyCed 2013-02-12 07:40:56

+0

我發現TTF文件我的字體,但你用xml意味着什麼? – hudi 2013-02-12 07:43:28

+0

取決於你如何編碼non_ascii字符, – mKorbel 2013-02-12 07:45:44

回答

3

因爲您沒有顯示自己的任何代碼,我認爲您使用的代碼來自export jcomponent to pdf with itext(您提到的問題)。因此,你的代碼檢索Graphics2D實例:

Graphics2D g2d = tp.createGraphics(bill.getWidth(), bill.getHeight(), new DefaultFontMapper()); 

iText in Action — 2nd Edition記錄,部分14.5.2 繪製文本PdfGraphics2D,您使用DefaultFontMapper假定每個字體使用的編碼的Cp1252(WinAnsi的) 。(不幸的是,這是而不是僅在其方法insertDirectory的JavaDoc中記錄在JavaDoc頭文件DefaultFontMapper,中。)這將解釋您缺少的字符。

您可以通過添加自定義BaseFontParameters對象映射器因爲是樣品Text1ToPdf2.java在做c:/windows/fonts/msgothic.ttc:

// create a font mapper 
DefaultFontMapper mapper = new DefaultFontMapper(); 
// map MS Gothic to the corresponding font program 
BaseFontParameters parameters = new BaseFontParameters("c:/windows/fonts/msgothic.ttc,1"); 
parameters.encoding = BaseFont.IDENTITY_H; 
mapper.putName("MS PGothic", parameters); 
// Create a Graphics2D object 
Graphics2D g2 = new PdfGraphics2D(canvas, 600, 60, mapper); 

根據您的使用情況下,它可能是太乏味做的所有解決這個問題字體(可能)使用,但有替代品在書的非常相同的部分解釋:你可以

  • 創建FontMapper實現自己的(例如通過繼承DefaultFontMapper),
  • 使用AsianFontMapper(在某些情況下,亞洲字符集缺失的),或
  • 添加字形爲存儲在字體形狀,而不是字符。

這些選項涵蓋了書中的多個頁面,這些選項太多,無法在這裏放入單個答案。您可以通過查看樣本Text2ToPdf1.javaText2ToPdf2.javaText2ToPdf3.java來獲得第一印象。