2012-04-20 30 views
8

Este es el segundo día que paso investigando sin resultados. Al menos ahora, puedo preguntar algo muy específico.La generación de PDF desde HTML con caracteres no latinos usando ITextRenderer no funciona

estoy tratando de escribir un código HTML válido que contiene algunos caracteres no latinos en un archivo PDF utilizando iText y más específicamente usando ITextRenderer de Flying Saucer.

Mi ejemplo corto/código comienza inicializando una variable doc cadena con este valor:

String doc = "<?xml version=\"1.0\" encoding=\"UTF-8\"?><html xmlns=\"http://www.w3.org/1999/xhtml\" lang=\"en\">" 
      + "<body>Some greek characters: Καλημέρα Some greek characters" 
      + "</body></html>"; 

Este es el código que utilizo para fines de depuración. Puedo guardar esta cadena a un archivo HTML y luego lo abro a través de un navegador sólo para corroborar que el contenido HTML es válido y todavía puedo leer los caracteres griegos:

//write for debugging purposes in an html file 
File newTextFile = new File("C:/work/test.html"); 
FileWriter fw = new FileWriter(newTextFile); 
fw.write(doc); 
fw.close(); 

siguiente paso es tratar de escribir este valor en el Archivo PDF. Este es mi código:

ITextRenderer renderer = new ITextRenderer(); 
    //add some fonts - if paths are not right, an exception will be thrown 
    renderer.getFontResolver().addFont("c:/work/fonts/TIMES.TTF", BaseFont.IDENTITY_H, BaseFont.EMBEDDED); 
    renderer.getFontResolver().addFont("c:/work/fonts/TIMESBD.TTF", BaseFont.IDENTITY_H, BaseFont.EMBEDDED); 
    renderer.getFontResolver().addFont("c:/work/fonts/TIMESBI.TTF", BaseFont.IDENTITY_H, BaseFont.EMBEDDED); 
    renderer.getFontResolver().addFont("c:/work/fonts/TIMESI.TTF", BaseFont.IDENTITY_H, BaseFont.EMBEDDED); 


    final DocumentBuilderFactory documentBuilderFactory = DocumentBuilderFactory 
      .newInstance(); 
    documentBuilderFactory.setValidating(false); 
    DocumentBuilder builder = documentBuilderFactory.newDocumentBuilder(); 
    builder.setEntityResolver(FSEntityResolver.instance()); 
    org.w3c.dom.Document document = builder.parse(new ByteArrayInputStream(
      doc.toString().getBytes("UTF-8"))); 

    renderer.setDocument(document, null); 
    renderer.layout(); 
    renderer.createPDF(os); 

El resultado final de mi código es:

En archivo HTML me sale: Algunos caracteres griegos: Καλημέρα Algunos caracteres griegos (esperado)

En el archivo PDF obtengo: Algunos caracteres griegos: Algunos caracteres griegos (inesperados - caracteres griegos son ignorados !!)

Dependencias:

  • versión de Java "1.6.0_27"

  • itext-2.0.8.jar

  • de.huxhorn.lilith.3rdparty. flyingsaucer.core-renderer-8Pre2.jar

También he sido experimentado con mucho mo re fuentes, pero supongo que mi problema no tiene nada que ver con el uso de fuentes incorrectas. Cualquier ayuda es más que bienvenida.

Gracias

Respuesta

0

Deje que el iText leer una información de la cabecera de su contenido HTML que contiene utf-8 contenido.
Agregue meta etiqueta para content-type en código html con utf-8 codificación charset luego ejecute iText para generar PDF y verifique el resultado.

<?xml version="1.0" encoding="UTF-8"?> 
<html xmlns="http://www.w3.org/1999/xhtml" lang="en"> 
<head> 
    <meta http-equiv="Content-Type" content="text/html; charset=utf-8"> 
</head> 
<body> 
    Some greek characters: Καλημέρα Some greek characters 
</body> 
</html> 

actualización:
Si lo anterior no funciona, a continuación, se refieren a ENCODING VERSUS THE DEFAULT CHARSET USED BY THE JVM en el documento publicado en http://www.manning.com/lowagie2/iText2E_MEAP_CH02.pdf

+0

Acabo de intentarlo sin buenas noticias :(Estoy obteniendo el mismo resultado @Ravinder Creo que se perdió un en su ejemplo: P – alexandros

+0

@alexandros: compruebe la actualización de mi respuesta. –

+0

Agregué en mi prueba esto: System.out.println ("file.encoding =" + System.getProperty ("file.encoding")); que imprime como resultado esto: file.encoding = UTF-8. ¿Debería esto ser suficiente para garantizar que estoy teniendo la codificación correcta? – alexandros

9

soy de República Checa, y tenía el mismo problema con nuestros símbolos nacionales! Después de algunas búsquedas, logré resolverlo con this solution.

Específicamente con (que ya tiene):

renderer 
    .getFontResolver() 
    .addFont(fonts.get(i).getFile().getPath(), 
      BaseFont.IDENTITY_H, 
      BaseFont.NOT_EMBEDDED); 

y luego parte importante en el CSS:

* { 
    font-family: Verdana; 
/* font-family: Times New Roman; - alternative. Without ""! */ 
} 

Me parece, sin que css, sus fuentes no se utilizan . Cuando elimino estas líneas de CSS, la codificación se rompe nuevamente.

Espero que esto ayude!

+0

¡Gracias por la solución correcta! Especificar la fuente (en mi caso fue * DejaVu Serif *) funcionó! – informatik01

4

Añadir a algo HTML así:

<?xml version='1.0' encoding='UTF-8'?> 
<!DOCTYPE html> 
<html> 
    <head> 
     <meta http-equiv='Content-Type' content='text/html; charset=UTF-8'/> 
     <style type='text/css'> 
      * { font-family: 'Arial Unicode MS'; } 
     </style> 
    </head> 
    <body> 
     <span>Some text with šđčćž characters</span> 
    </body> 
</html> 

y luego añadir FontResolver a ITextRenderer en código Java:

ITextRenderer renderer = new ITextRenderer(); 
renderer.getFontResolver().addFont("fonts/ARIALUNI.TTF", BaseFont.IDENTITY_H, BaseFont.NOT_EMBEDDED); 

funciona muy bien para caracteres croatas

frascos utilizados para la generación de PDF son:

core-renderer.jar 
iText-2.0.8.jar 
Cuestiones relacionadas