【问题标题】:IText - Generating PDF with Chinese characters (Chinese Simplified)IText - 生成带有中文字符的 PDF(简体中文)
【发布时间】:2014-03-01 22:12:02
【问题描述】:

我正在使用 iText 生成一些 PDF,这些 pdf 包含一些中文字符(简体中文 - GB2312),但是我无法使用这些字符生成 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
}

【问题讨论】:

    标签: java pdf itext chinese-locale


    【解决方案1】:

    采用的解决方案:

    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);
    

    【讨论】:

      【解决方案2】:

      您的 CLASSPATH 中有 iText jar,但您忘记添加(正确的)itext-asian.jar。

      请下载额外 jars ZIP 文件的 2.3 版,该文件可在此处获得:http://sourceforge.net/projects/itext/files/extrajars/

      这个 jar 包含中国字形的指标。这样的字体永远不会被嵌入。当您在 Adob​​e Reader 中使用此类字体打开文档时,可能会要求您安装额外的字体包。

      【讨论】:

      • 我目前的工作我们有很多官僚机构要添加新的API,还有其他解决方案吗?无需添加itext-asian?
      • 您对添加新 API 的假设是错误的。如果您打开 itext-asian.jar,您会发现它包含指标文件(数据),而不是可执行代码。另外:如果您的工作环境很官僚,您的公司可能已经购买了商业许可证供您使用 iText。如果是这样,他们已经接受了所有与 iText 相关的 jar。
      • 至于您的问题:如果您的具体要求是使用 CJK 字体(未嵌入且需要字体包的字体),那么您需要 itext-asian.jar 中的指标。如果您的要求是创建中文文本,那么您还有其他选择。这些在我的书中都有描述。如果您没有这本书的副本,请查看第 11 章的示例:itextpdf.com/book/chapter.php?id=11(例如:您可以使用 arialuni.ttf 作为字体,其中包含告诉 iText 如何嵌入 中国字形。)
      • 我尝试使用显示给我的字体:BaseFont bfComic = BaseFont.createFont("C:\\Windows\\Fonts\\carialuni.ttf", BaseFont.IDENTITY_H, BaseFont.EMBEDDED);但是文件仍然没有显示中文字符。汉字在 Paragraph 对象中存在,但在 Document 中消失,是不是漏掉了什么?
      • 你试过什么? (另外:你的代码说 carialuni.ttf 而不是 arialuni.ttf)
      猜你喜欢
      • 2016-09-02
      • 1970-01-01
      • 1970-01-01
      • 2012-01-22
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多