2017-10-25 13 views
1

.pptx 슬라이드를 내 서버의 .pdf 문서로 변환하는 데 문제가 있습니다. .pptx 파일에 대해 itextpdf 5.5.10 및 apache poi 3.15를 사용합니다. 텍스트에 중국어 문자가 포함되어 있으면 모든 문자의 위치가 잘못되었습니다. 내 로컬 컴퓨터 (Windows 7)에는 아무런 문제가 없습니다. 이것은 내 컴퓨터itextpdf로 .pptx를 .pdf로 변환 중입니다. 중국어 문자로 잘못된 문자 배치

enter image description here

을에 모습입니다 그리고 이것은이 서버의 모습입니다 enter image description here

(CentOS는 리눅스가 설치된 우분투 글꼴 가족과 함께) 1708년 7월 4일 (코어를 해제)

PdfContentByte canvas = writer.getDirectContent(); 
UnicodeFontMapper mapper = new UnicodeFontMapper(); 
    for (XSLFSlide slide : ppt.getSlides()) { 
     PdfTemplate template = canvas.createTemplate(width, height); 
     Graphics2D g2d = new PdfGraphics2D(template, width, height, mapper); 
     // default rendering options 
     DrawFactory.getInstance(g2d).fixFonts(g2d); 
     g2d.setRenderingHint(RenderingHints.KEY_ANTIALIASING, RenderingHints.VALUE_ANTIALIAS_ON); 
     g2d.setRenderingHint(RenderingHints.KEY_RENDERING, RenderingHints.VALUE_RENDER_QUALITY); 
     g2d.setRenderingHint(RenderingHints.KEY_INTERPOLATION, RenderingHints.VALUE_INTERPOLATION_BICUBIC); 
     g2d.setRenderingHint(RenderingHints.KEY_FRACTIONALMETRICS, RenderingHints.VALUE_FRACTIONALMETRICS_ON); 
     //Draw slide 
     slide.draw(g2d); 
     canvas.addTemplate(template, 0, 0); 
     g2d.dispose(); 
     document.newPage(); 
    } 

UnicodeFontMapper 클래스 :

이것은 (자바) 코드 내가 변환을 수행하는 데 사용하는 것입니다
public class UnicodeFontMapper extends DefaultFontMapper { 

@Override 
public BaseFont awtToPdf(Font font) { 
    //using own fonts 
    String fontFamily = "ArialUni"; 
    registerFontFamily(fontFamily); 
    int style = com.itextpdf.text.Font.NORMAL; 
    if (font.isBold()) { 
     if (font.isItalic()) { 
      style = com.itextpdf.text.Font.BOLDITALIC; 
     } else { 
      style = com.itextpdf.text.Font.BOLD; 
     } 
    } 
    com.itextpdf.text.Font pdfFont = FontFactory.getFont(fontFamily, BaseFont.IDENTITY_H, true, font.getSize(), style); 
    return pdfFont.getBaseFont(); 
} 

나는 ArialUni.ttf 글꼴을 사용합니다. 내가 이해하는 것처럼 나는 내 서버에서 뭔가를 잃어 버렸지 만 나는 정확히 무엇을 알아 내지 못한다.

답변

3

모든 시스템에 Arial unicode가 없습니다. 이로 인해 iText가 해당 글꼴에서 지정한 문자를 렌더링하지 못하게 할 수 있습니다. (글꼴에 글리프 (glyph)가 포함되어 있지 않은 경우에도 마찬가지 임).

OpenJDK를 사용하는 경우 선택적으로 graphics2D의 동작을 조사 할 수 있습니다. Windows에서 JDK 오라클 버전을 사용하고 CentOS에서 OpenJDK를 사용하고있을 수도 있습니다. 두 가지 버전의 JDK가 동일한 방식으로 작동하기는하지만 Graphics2D과 같이 일부 영역에서는 약간의 차이가있을 수 있습니다.

쉽게 java -version

+1

감사를 실행하여 사용중인 JDK의 버전을 확인할 수 있습니다. 서버에 arialuni.ttf를 설치하면 문제가 해결되었습니다. 나는 글자가 오른쪽 글립 문자로 렌더링 되었기 때문에 혼란스럽고 생각하지 않았습니다. 그러나 잘못된 위치에 있기 때문에 nedeed 글꼴이 이미 서버에 설치되어 있다고 생각했습니다. – JaneXQ