2017-10-25 4 views
1

Ich habe Probleme mit der Konvertierung von .pptx-Folien in .pdf-Dokumente auf meinem Server. Ich benutze itextpdf 5.5.10 und apache poi 3.15 für .pptx-Dateien. Wenn der Text chinesische Zeichen enthält, ist die Positionierung aller Zeichen schlecht. Auf meinem lokalen Rechner (Windows 7) habe ich keine Probleme. Dies ist, wie es auf meinem Rechner siehtKonvertieren von .pptx zu .pdf mit itextpdf. Falsche Zeichenpositionierung mit chinesischen Zeichen

enter image description here

Und das ist, wie es auf dem Server sucht (CentOS Linux-Version 1708.04.07 (Core) mit installiert ubuntu Schriftfamilie) enter image description here

das ist die (Java) Code, den ich um die Konvertierung zu tun verwenden:

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 Klasse:

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

Ich verwende ArialUni.ttf Schriftart. Wie ich verstehe, vermisse ich etwas auf meinem Server, aber ich weiß nicht genau was.

Antwort

3

Arial-Unicode ist nicht auf allen Systemen vorhanden. Dies kann dazu führen, dass iText die Zeichen, die Sie in dieser Schriftart angegeben haben, nicht rendert. (Ähnlich, wenn eine Schriftart keine Glyphe enthält).

Optional, wenn Sie die OpenJDK verwenden, möchten Sie vielleicht in die Funktionsweise von Graphics2D schauen. Vielleicht verwenden Sie die Oracle-Version des JDK unter Windows und OpenJDK unter CentOS. Obwohl beide Versionen des JDK identisch funktionieren sollen, können in einigen Bereichen kleine Unterschiede auftreten, wie z. B. Graphics2D.

Sie können ganz einfach überprüfen sein, welche Version des JDK Sie von java -version

+1

Dank Verwendung ausgeführt werden. Die Installation von arialuni.ttf auf dem Server hat das Problem gelöst. Ich war verwirrt und habe nicht darüber nachgedacht, weil Charaktere mit richtigen Glyphen, aber in falschen Positionen gerendert wurden, so dachte ich, dass Neeed Schrift bereits auf dem Server installiert ist. – JaneXQ

Verwandte Themen