2012-04-20 8 views
8

Questo è il 2 ° giorno che passo a investigare senza risultati. Almeno ora, sono in grado di chiedere una cosa molto specifica.Generazione di PDF da HTML con caratteri non latini che utilizzano ITextRenderer non funziona

Sto cercando di scrivere un codice HTML valido che contiene alcuni caratteri non latini in un file PDF utilizzando iText e più specificamente con ITextRenderer da Flying Saucer.

Il mio esempio/breve codice inizia con l'inizializzazione di una doc string variabile con questo valore:

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>"; 

Ecco il codice che uso per scopi di debug. Risparmio questa stringa al file HTML e poi l'apro attraverso un browser solo per controllare due volte che il contenuto HTML è valido e posso ancora leggere i caratteri greci:

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

passo successivo è quello di provare a scrivere questo valore nel File PDF. Questo è il mio codice:

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

L'esito finale del mio codice è:

Nel file HTML ottengo: Alcuni caratteri greci: Καλημέρα Alcuni caratteri greci (expected)

Nel file PDF ottengo: Alcuni caratteri greci: alcuni caratteri greci (imprevisti - caratteri greci sono ignorati !!)

Dipendenze:

  • versione Java "1.6.0_27"

  • itext-2.0.8.jar

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

Ho anche sperimentato molto re font, ma suppongo che il mio problema non abbia nulla a che fare con l'utilizzo di caratteri errati. Qualsiasi aiuto è più che benvenuto.

Thanx

risposta

0

Lasciate che il iText leggere un colpo di testa di informazioni sul suo sito web HTML che contiene utf-8 contenuti.
Aggiungi meta tag per content-type in codice html con utf-8charset codifica quindi eseguire iText per generare PDF e controllare il risultato.

<?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> 

Aggiornamento:
Se quanto sopra non funziona, quindi fare riferimento alla ENCODING VERSUS THE DEFAULT CHARSET USED BY THE JVM nel documento pubblicato all'indirizzo http://www.manning.com/lowagie2/iText2E_MEAP_CH02.pdf

+0

Ho appena provato che senza buone notizie :(Sto ottenendo lo stesso risultato @Ravinder Penso che ti sia perso un nel tuo esempio: P – alexandros

+0

@alexandros: controlla l'aggiornamento della mia risposta. –

+0

Ho aggiunto nel mio test questo: System.out.println ("file.encoding =" + System.getProperty ("file.encoding")); che stampa come risultato questo: file.encoding = UTF-8. Questo dovrebbe essere sufficiente per garantire che sto avendo la giusta codifica? – alexandros

9

io sono dalla Repubblica Ceca, e ha avuto lo stesso problema con i nostri simboli nazionali! Dopo alcune ricerche, sono riuscito a risolverlo con this solution.

particolare con (che avete già):

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

e poi importante parte in CSS:

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

Mi sembra, senza che i CSS, i font non vengono utilizzati . Quando rimuovo le righe da CSS, la codifica viene nuovamente interrotta.

Spero che questo possa aiutare!

+0

Grazie per la soluzione corretta! La specifica del carattere (nel mio caso era * DejaVu Serif *) funzionava! – informatik01

4

Aggiungi alla tua qualcosa di HTML come questo:

<?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> 

e quindi aggiungere FontResolver a ITextRenderer in codice Java:

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

grandi opere per personaggi croati

vasi utilizzati per la generazione di PDF sono:

core-renderer.jar 
iText-2.0.8.jar 
Problemi correlati