2014-02-05 3 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); 

누군가가 나를 도울 수 있을까요? 당신은 당신의 CLASSPATH에 iText를 항아리를

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-asian.jar를 추가하는 것을 잊었다 : 질문을 추가

,이 테스트를 위해 내 현재 코드입니다. http://sourceforge.net/projects/itext/files/extrajars/

이 항아리 중국 상형 문자에 대한 통계가 포함되어

가능 여기에 여분의 병용 ZIP 파일의 버전 2.3을 다운로드하십시오. 그러한 글꼴은 절대 포함되지 않습니다. Adobe Reader에서 이러한 글꼴을 사용하여 문서를 열면 추가 글꼴 팩을 설치하라는 메시지가 표시 될 수 있습니다.

+0

내 현재 작업, 다른 해결책이? 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를 as –

2

이 솔루션은 채택 : 우리는 새로운 API를 추가하는 많은 관료가

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