2012-10-10 3 views
8

I PDF bin Erzeugung mit Grails Export-Plugin (im Grunde, Flying Saucer). Meine GSP Seite ist eine UTF-8-Seite (oder zumindest Eigenschaften zeigen, dass es UTF-8 ist, auch am Anfang der APS-Seite gibt es eine <?xml version="1.0" encoding="UTF-8"?> Richtlinie). Zunächst generierte PDF korrekt umlaute Zeichen "äöüõ", aber kyrillische Zeichen fehlten in PDF (nicht gerendert). Dann habe ich meine CSS-Datei geändert, wie in der Dokumentation beschrieben durch Zugabe von folgenden:Flying Saucer Schrift für Unicode-Zeichen

@font-face { 
    src: url(ARIALUNI.TTF); 
    -fs-pdf-font-embed: embed; 
    -fs-pdf-font-encoding: UTF-8; 
} 
body { 
     font-family: "Arial Unicode MS", Arial, sans-serif; 
} 

ARIALUNI.TTF wird auch auf den Server bereitgestellt. Aber jetzt bekomme ich sowohl Umlaut-Zeichen als auch kyrillische Zeichen, die als Kästchen wiedergegeben werden. Wenn ich den Wert der Eigenschaft -fs-pdf-encoding in Identity-H ändere, werden Umlautzeichen korrekt gerendert, aber kyrillische Zeichen werden als Fragezeichen dargestellt.

Irgendwelche Ideen, was Schriftart verwendet werden kann, um sowohl die Umlaut und kyrillische Zeichen richtig zu machen? Oder ist mein CSS irgendwie falsch? Alle Hinweise würden sehr geschätzt werden.

Upd 1: Ich habe auch folgende CSS versucht (die von http://fontface.codeandmore.com/ generiert wurde):

@font-face { 
    font-family: 'ArialUnicodeMS'; 
    src: url('arialuni.ttf'); 
    src: url('arialuni.eot?#iefix') format('embedded-opentype'), 
     url('arialuni.woff') format('woff'), 
     url('arialuni.ttf') format('truetype'), 
     url('arialuni.svg#arialuni') format('svg'); 
    font-weight: normal; 
    font-style: normal; 
    -fs-pdf-font-embed: embed; 
    -fs-pdf-font-encoding: UTF-8; 
} 

body { 
    font-family:'ArialUnicodeMS'; 
} 

ich hinzugefügt haben <meta http-equiv="Content-Type" content="text/html; charset=UTF-8"/> Ich war auch mit -Dfile.encoding laufen grails versuchen = UTF-8, wie hier erwähnt: http://grails.1312388.n4.nabble.com/PDF-plugin-Having-problems-with-instalation-td2297840.html, aber nichts hilft. Kyrillische Zeichen werden überhaupt nicht angezeigt. Irgendwelche anderen Ideen, was könnte das Problem sein?

* BTW: * ich meine PDF als zip bin Verpackung und zurück an Browser in der Antwort wie die Versendung:

response.setHeader "Content-disposition", "attachment; filename=test.zip" 
response.setHeader "Content-Encoding", "UTF-8" 
response.contentType = 'application/zip' 
response.outputStream << zip 
response.outputStream.flush() 
response.outputStream.close() 

Muss ich irgendwie Codierung prüfen, während ???? zippen, denen ich wie folgt aus:

public static byte[] zipBytes(Map<String, ByteArrayOutputStream> fileNameToByteContentMap) throws IOException { 
     ByteArrayOutputStream zipBaos = new ByteArrayOutputStream(); 
     ZipOutputStream zos = new ZipOutputStream(zipBaos); 
     fileNameToByteContentMap.eachWithIndex {String fileName, ByteArrayOutputStream baos, i -> 
      byte[] content = baos.buf 
      ZipEntry entry = new ZipEntry(fileName) 
      entry.setSize(content.length) 
      zos.putNextEntry(entry) 
      zos.write(content) 
      zos.closeEntry() 
     } 
     zos.close() 
     return zipBaos.toByteArray(); 
    } 
+0

Wenn Ihr Content-Type als UTF-8 als auch definiert? –

+0

Sie meinen HTML-Inhaltstyp? –

Antwort

6

Aus irgendeinem Grund mit folgenden CSS und .ttf Datei, um sie zu arbeiten begann, die durch face-Kit-Generator erzeugt wurde:

@font-face { 
    src: url('arialuni.ttf'); 
    -fs-pdf-font-embed: embed; 
    -fs-pdf-font-encoding: Identity-H; 
} 

body { 
    font-family: Arial Unicode MS, Lucida Sans Unicode, Arial, verdana, arial, helvetica, sans-serif; 
    font-size: 8.8pt; 
} 

Merkwürdige Sache ist, dass, wenn ich Schriftart in einen Ordner lege sagen "Fonts", wird es die Schriftart finden, aber Zeichen werden nicht gerendert.

+3

Die -FS-PDF-Schriftart-Codierung: Identität-H; ist der Schlüssel; es sagt Flying Saucer, dass dies eine Unicode-Schriftart ist und nicht eine Schrift, die – jaygooby

+0

auf bestimmte Code-Seiten beschränkt wird, um die Schriftart in einen Ordner abzulegen verwendet I 'src: url (‚$ {} baseUrl /assets/ARIALUNI.TTF‘); 'wo baseUrl im Modell mit' grailsLinkGenerator.serverBaseURL' geben – fego

8

Ich habe Unicode-Zeichen (kyrillisch oder tschechisch) innerhalb von Java-Code "aktiviert" und darüber hinaus eine True-Type-Schriftart in meinen Ressourcen (CALIBRI.TTF) zur Verfügung gestellt.

import org.w3c.dom.Document; 
import org.xhtmlrenderer.pdf.ITextRenderer; 
import com.lowagie.text.pdf.BaseFont; 

... 
    ITextRenderer renderer = new ITextRenderer(); 
    URL fontResourceURL = getClass().getResource("fonts/CALIBRI.TTF"); 
    //System.out.println("font-path:"+fontResourceURL.getPath()); 

    /* HERE comes my solution: */ 
    renderer.getFontResolver().addFont(fontResourceURL.getPath(), 
       BaseFont.IDENTITY_H, BaseFont.EMBEDDED); 

    renderer.setDocument(doc, null); 
    renderer.layout(); 
    baos = new ByteArrayOutputStream(); 
    renderer.createPDF(baos); 
    baos.flush(); 
    result = baos.toByteArray(); 
... 

Schließlich habe ich das font-family 'Calibri' an den CSS-Abschnitt meines Dokuments:

... 
<style type="text/css"> 
    span { font-size: 11pt; font-family: Calibri; } 
... 
+1

hatte ich Probleme mit dieser Lösung. Ich reparierte sie unter Verwendung 'URL fontResourceURL = getClass() getResource ("/ fonts/CALIBRI.TTF");.' (Man beachte den Anfangsstrich in Schriftart-Ressource-Pfad) und 'fontResolver.addFont (fontResourceURL.toString(), BaseFont.IDENTITY_H, BaseFont.EMBEDDED); '(beachten Sie toString-Methode statt getPath) –