2012-10-10 10 views
8

Sto generando PDF utilizzando il plug-in di esportazione di Grails (fondamentalmente, Flying Saucer). La mia pagina GSP è una pagina UTF-8 (o almeno le proprietà mostrano che è UTF-8, anche all'inizio della pagina GSP c'è una direttiva <?xml version="1.0" encoding="UTF-8"?>). Inizialmente il PDF generato conteneva correttamente i caratteri di umlaut "äöüõ", ma i caratteri cirillici mancavano dal PDF (non erano stati resi affatto). Poi ho cambiato il mio file css come descritto nella documentazione con l'aggiunta seguente:Tipo di carattere Flying Saucer per caratteri unicode

@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 è anche distribuito al server. Ma ora sto ottenendo sia caratteri di umlaut che caratteri cirillici resi come scatole. Se sto cambiando il valore della proprietà codifica -fs-pdf in Identity-H, i caratteri di umlaut sono resi correttamente, ma i caratteri cirillici sono resi come punti interrogativi.

Qualche idea su quale tipo di carattere può essere utilizzato per il rendering corretto di umlaut e caratteri cirillici? O forse il mio CSS è in qualche modo sbagliato? Qualsiasi suggerimento sarebbe molto apprezzato.

Upd 1: Ho anche provato seguente CSS (che è stato generato da http://fontface.codeandmore.com/):

@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'; 
} 

Ho aggiunto <meta http-equiv="Content-Type" content="text/html; charset=UTF-8"/> Sono stato anche cercando di eseguire graal con -Dfile.encoding = UTF-8, come menzionato qui: http://grails.1312388.n4.nabble.com/PDF-plugin-Having-problems-with-instalation-td2297840.html, ma nulla aiuta. I caratteri cirillici non sono mostrati affatto. Qualche altra idea quale potrebbe essere il problema?

* BTW: * Sto Packaging mia PDF come zip e l'invio di nuovo al browser nella risposta del genere:

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

ho bisogno di prendere in considerazione in qualche modo la codifica mentre lampo ????, che faccio così:

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

Se il tipo di contenuto definito come UTF-8 come bene? –

+0

Intendi il tipo di contenuto HTML? –

risposta

6

Per qualche motivo ha iniziato a lavorare con il seguente CSS e il file .ttf, che è stato generato da face-kit-generatore:

@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; 
} 

La cosa strana è che se metto font in una cartella, diciamo "font", troverà il font ma i caratteri non saranno renderizzati.

+3

-fs-pdf-font-encoding: Identity-H; è la chiave; dice a Flying Saucer che questo è un font Unicode e non un font limitato a certe code page – jaygooby

+0

per inserire il font in una cartella che ho usato 'src: url ('$ {baseUrl} /assets/ARIALUNI.TTF'); 'where baseUrl è passato nel modello con' grailsLinkGenerator.serverBaseURL' – fego

8

Sono riuscito a "abilitare" caratteri unicode (cirillico o ceco) all'interno del codice java e inoltre a fornire un carattere di tipo true nelle mie risorse (CALIBRI.TTF).

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

Infine ho aggiunto il font-family 'Calibri' alla sezione css del mio documento:

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

Ho avuto problemi nell'utilizzare questa soluzione. L'ho risolto usando 'URL fontResourceURL = getClass(). GetResource ("/fonts/CALIBRI.TTF ");' (notare la barra iniziale nel percorso della risorsa font) e 'fontResolver.addFont (fontResourceURL.toString(), BaseFont.IDENTITY_H, BaseFont.EMBEDDED); '(notare il metodo toString invece getPath) –