2012-04-20 13 views
8

To jest drugi dzień, w którym spędzam śledztwo bez rezultatów. Przynajmniej teraz mogę zadać coś bardzo konkretnego.Generowanie plików PDF z HTML za pomocą znaków spoza alfabetu łacińskiego za pomocą ITextRenderer nie działa

Próbuję napisać poprawny kod HTML, który zawiera pewne znaki spoza alfabetu łacińskiego w pliku PDF za pomocą iText a dokładniej za pomocą ITextRenderer z Flying Saucer.

Mój krótki przykład/code rozpoczyna się od inicjalizacji zmiennych ciąg doc z tej wartości:

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

Oto kod, który używam do celów debugowania. Zapisać ten ciąg do pliku HTML, a następnie otworzyć go przez przeglądarkę tylko dokładnie sprawdzić, że zawartość HTML jest ważna i wciąż mogę przeczytać greckich znaków:

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

Następnym krokiem jest, aby spróbować napisać tę wartość w Plik PDF. To jest mój kod:

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

Końcowy wynik mojego kodu jest:

W pliku HTML uzyskać: Niektóre greckie znaki: Καλημέρα Niektóre greckie znaki (oczekiwane)

W pliku PDF Otrzymuję: Niektóre greckie znaki: Niektóre greckie znaki (nieoczekiwane - greckie znaki są ignorowane !!)

zależności:

  • wersji Java "1.6.0_27"

  • itext-2.0.8.jar

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

Ja także byłem eksperymentowany z dużo mo re czcionki, ale myślę, że mój problem nie ma nic wspólnego z użyciem niewłaściwych czcionek. Każda pomoc jest mile widziane.

Niż

Odpowiedz

0

Niech iText przeczytać informacje nagłówka z treścią html że zawiera utf-8 treści.
Dodaj tag meta dla content-type w kodowaniu html z utf-8charset kodowania następnie uruchom iText, aby wygenerować plik PDF i sprawdzić wynik.

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

Aktualizacja:
Jeśli powyższe nie działa, a następnie zapoznać się ENCODING VERSUS THE DEFAULT CHARSET USED BY THE JVM w dokumencie opublikowanym w http://www.manning.com/lowagie2/iText2E_MEAP_CH02.pdf

+0

Po prostu wypróbowałem to bez dobrych wieści :(Otrzymuję ten sam wynik @Ravinder Myślę, że brakowało Ci w twoim przykładzie: P – alexandros

+0

@alexandros: sprawdź aktualizację mojej odpowiedzi. –

+0

W moim teście dodałem: System.out.println ("file.encoding =" + System.getProperty ("file.encoding")); która drukuje w wyniku tego: file.encoding = UTF-8. Czy to wystarczy, aby zapewnić właściwe kodowanie? – alexandros

9

jestem z Czech, i miał ten sam problem z naszych narodowych symboli! Po kilku poszukiwaniach udało mi się go rozwiązać pod numerem this solution.

szczególności z (co już masz):

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

a następnie ważne część w CSS:

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

Wydaje mi się, bez tego css, czcionek nie są wykorzystywane . Kiedy usuwam te linie z CSS, kodowanie jest znowu przerywane.

nadzieję, że pomoże!

+0

Dziękuję za prawidłowe rozwiązanie! Określenie czcionki (w moim przypadku było to * DejaVu Serif *) zadziałało! – informatik01

4

Dodaj do HTML coś takiego:

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

a następnie dodać FontResolver do ITextRenderer w kodzie Java:

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

działa świetnie dla znaków chorwackich

słoików używanych do generowania PDF to:

core-renderer.jar 
iText-2.0.8.jar 
Powiązane problemy