2014-02-05 288 views
0

我正在使用iText生成一些PDF文件,這些pdf文件有一些中文字符(簡體中文--GB2312),但是我無法生成帶有這些字符的pdf。IText - 用中文生成PDF(簡體中文)

任何人都可以告訴我我錯在哪裏?

我嘗試使用各種形式的創作,但沒有成功:

BaseFont bf = BaseFont.createFont("STSong-Light", "UniGB-UCS2-H", BaseFont.NOT_EMBEDDED); 


com.itextpdf.text.DocumentException: Font 'STSong-Light' with 'UniGB-UCS2-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:441) 
    at com.ford.fc.frc.render.wsltopdf.PDFDefaultWriter.printText(PDFDefaultWriter.java:176) 
    at com.ford.fc.frc.render.wsltopdf.PDFDefaultConverter.convertFile(PDFDefaultConverter.java:122) 
    at com.ford.fc.frc.render.wsltopdf.PDFDefaultConverter.convert(PDFDefaultConverter.java:234) 
    at com.ford.fc.frc.render.plugins.PDFDefaultRenderer.render(PDFDefaultRenderer.java:41) 
    at com.ford.fc.frc.report.ReportManager.executeRenderer(ReportManager.java:1113) 
    at com.ford.fc.frc.report.ReportManager.reportCompleted(ReportManager.java:596) 
    at com.ford.fc.roc.ReportOutputControl.reportCompleted(ReportOutputControl.java:87) 
    at LoadFRC.main(LoadFRC.java:69) 



BaseFont bfComic = BaseFont.createFont(AsianFontMapper.ChineseSimplifiedFont, AsianFontMapper.ChineseSimplifiedEncoding_H, BaseFont.NOT_EMBEDDED); 
     Font fontbold = new Font(bfComic, 8); 


BaseFont bfComic = BaseFont.createFont("C:\\Windows\\Fonts\\cour.ttf", BaseFont.IDENTITY_H, BaseFont.EMBEDDED); 
     Font fontbold = new Font(bfComic, 8); 

有人能幫助我嗎?

增加的問題,這是我目前的測試代碼:

while(null != (line = reader.readLine())) { 
    document.open(); 

    FontSelector selector = new FontSelector(); 
    /*FontFactory.getFont("MSung-Light","UniCNS-UCS2-H", BaseFont.NOT_EMBEDDED);*/ 
    Font f2 = FontFactory.getFont(AsianFontMapper.ChineseSimplifiedFont, AsianFontMapper.ChineseTraditionalEncoding_H, BaseFont.NOT_EMBEDDED); 
    f2.setColor(BaseColor.RED); 
    selector.addFont(f2); 
    Phrase ph = selector.process(line); 
    document.add(new Paragraph(ph)); 


    BaseFont bfComic = BaseFont.createFont("C:\\Windows\\Fonts\\arialuni.ttf", BaseFont.IDENTITY_V, BaseFont.EMBEDDED); 
    Font fontbold = new Font(bfComic, 8); 
    Paragraph p = new Paragraph(line, fontbold); 
    document.add(p); 

    // step 5: we close the document 
} 

回答

0

你必須和iText JAR在你的CLASSPATH,但你忘了加上(正確)iText的-asian.jar。

請下載額外的jar文件的ZIP文件,該文件是在這裏提供的2.3版本:http://sourceforge.net/projects/itext/files/extrajars/

這個jar文件包含了中國字形指標。這樣的字體將永遠不會被嵌入。當您在Adobe Reader中使用這種字體打開文檔時,可能會要求您安裝額外的字體包。

+0

我目前的工作中,我們有很多的官僚機構增加新的API,是有另一種解決方案?不需要添加itext-asian? –

+0

你認爲你正在添加一個新的API是錯誤的。如果你打開itext-asian.jar,你會發現它包含指標文件(數據),而不是可執行代碼。另外:如果你的工作環境是官僚主義,你的公司可能已經購買了使用iText的商業許可證。如果是這樣,他們已經接受了所有iText相關的罐子。 –

+0

至於你的問題:如果你的具體要求是使用CJK字體(未嵌入並需要字體包的字體),那麼你需要itext-asian.jar中的度量。如果您的要求是創建中文文本,那麼您有其他選擇。這些在我的書中描述。如果您沒有該書的副本,請參閱第11章的示例:http://itextpdf.com/book/chapter.php?id=11(例如:您可以使用arialuni.ttf作爲一個包含告訴iText如何**嵌入中文字形的信息的字體。) –

2

採用的解決辦法:

private static final String PATH_FONT_ARIALUNI = "C:\\Windows\\Fonts\\arialuni.ttf"; 
     private static final String PATH_FONT_COUR = "C:\\Windows\\Fonts\\cour.ttf"; 



     // FOR Chinese 
     BaseFont baseFont = BaseFont.createFont(PATH_FONT_ARIALUNI, BaseFont.IDENTITY_H, BaseFont.EMBEDDED); 
     Font font = new Font(baseFont, 6.8f); 

     BaseFont baseFontNormal = BaseFont.createFont(PATH_FONT_COUR, BaseFont.IDENTITY_H, BaseFont.EMBEDDED); 
     Font fontNormal = new Font(baseFontNormal, 6.8f); 

     Paragraph par = new Paragraph(); 
     par.setLeading(9); 

     char[] aa = line.toCharArray(); 
     boolean isLastChineseChar = false; 

     System.out.println(line); 

     StringBuilder newLine = new StringBuilder(); 
     for (int j = 0; j < line.length(); j++) { 

      if((Character.UnicodeBlock.of(aa[j]) == Character.UnicodeBlock.CJK_UNIFIED_IDEOGRAPHS)){ 
       if(!isLastChineseChar) { 
        par.add(new Phrase(newLine.toString(), fontNormal)); 
        newLine.delete(0, newLine.length()); 
       } 
       newLine.append(aa[j]); 
       isLastChineseChar = true; 
       /*System.out.println("Is CHINESE: " + aa[j]);*/ 
      } else { 
       if(isLastChineseChar) { 
        par.add(new Phrase(newLine.toString(), font)); 
        newLine.delete(0, newLine.length()); 
        isLastChineseChar = false; 
       } 
       newLine.append(aa[j]); 
       /*System.out.println("NOT IS CHINESE: " + aa[j]);*/ 
      } 
     } 

     if(isLastChineseChar){ 
      par.add(new Phrase(newLine.toString(), font)); 
     } else { 
      par.add(new Phrase(newLine.toString(), fontNormal)); 
     }  

     if(line.contains(BREAK_PAGE)) { 
      document.newPage(); 
     } 

     par.setAlignment(Element.ALIGN_LEFT); 
     document.add(par);