2012-10-10 33 views
8

Estoy generando PDF utilizando el complemento de exportación Grails (básicamente, Flying Saucer). Mi página GSP es una página UTF-8 (o al menos las propiedades muestran que es UTF-8, también en el comienzo de la página GSP hay una directiva <?xml version="1.0" encoding="UTF-8"?>). Al principio, el PDF generado contenía correctamente caracteres umlaut "äöüõ", pero los caracteres cirílicos faltaban en PDF (no se representaba en absoluto). A continuación, he cambiado mi archivo css como se describe en la documentación mediante la adición siguiente:Fuente Flying Saucer para caracteres 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 también se implementa en el servidor. Pero ahora estoy obteniendo ambos personajes umlaut y caracteres cirílicos representados como cuadros. Si cambio el valor de la propiedad de codificación -fs-pdf a Identity-H, los caracteres umlaut se representan correctamente, pero los caracteres cirílicos se representan como signos de interrogación.

¿Alguna idea de qué tipo de letra se puede utilizar para representar correctamente los caracteres umlaut y cirílico? O puede ser que mi CSS sea de alguna manera incorrecta? Cualquier sugerencia sería muy apreciada.

UPD 1: también he intentado siguiente CSS (que fue generado por 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'; 
} 

He añadido <meta http-equiv="Content-Type" content="text/html; charset=UTF-8"/> También estaba tratando de ejecutar griales con -Dfile.encoding = UTF-8, como se mencionó aquí: http://grails.1312388.n4.nabble.com/PDF-plugin-Having-problems-with-instalation-td2297840.html, pero nada ayuda. Los caracteres cirílicos no se muestran en absoluto. Cualquier otra idea, ¿cuál podría ser el problema?

* Por cierto: * Estoy envasado mi PDF como postal y enviarla de vuelta al navegador en la respuesta de esa manera:

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

¿Es necesario considerar alguna forma de codificación, mientras que comprimir ????, lo que me gusta que:

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

Si el tipo de contenido define como UTF-8, así? –

+0

¿Te refieres al tipo de contenido HTML? –

Respuesta

6

por alguna razón que comenzó a trabajar con el siguiente CSS y el archivo .ttf, que se generó por la cara-kit-generador:

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

Lo raro es que si pongo la fuente en alguna carpeta, digamos "fuentes", encontrará la fuente pero los caracteres no se representarán.

+3

-fs-pdf-font-encoding: Identity-H; es la clave; le dice a Flying Saucer que esta es una fuente Unicode y no una fuente que está restringida a ciertas páginas de códigos – jaygooby

+0

para poner la fuente en una carpeta que utilicé 'src: url ('$ {baseUrl} /assets/ARIALUNI.TTF'); 'donde baseUrl se pasa en el modelo con' grailsLinkGenerator.serverBaseURL' – fego

8

Logré "habilitar" caracteres Unicode (cirílicos o checos) dentro del código Java y además proporcionar una fuente de tipo verdadero en mis recursos (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(); 
... 

Finalmente añadió la fuente de la familia 'Calibri' a la sección css de mi documento:

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

Tuve problemas al usar esta solución. Lo arreglé usando 'URL fontResourceURL = getClass(). GetResource ("/fonts/CALIBRI.TTF ");' (note la barra inicial en la ruta del recurso de la fuente) y 'fontResolver.addFont (fontResourceURL.toString(), BaseFont.IDENTITY_H, BaseFont.EMBEDDED); '(note el método toString en cambio getPath) –

Cuestiones relacionadas