2012-04-20 13 views
8

これは結果がなくても調査した2日目です。少なくとも今、私は何かを非常に具体的に尋ねることができます。ITextRendererを使用した非ラテン文字のHTMLからのPDFの生成は機能しません

私はiTextを使用してPDFファイルにいくつかの非ラテン文字が含まれており、より具体的にFlying SaucerからITextRendererを使用して、有効なHTMLコードを記述しようとしています。

私の短い例/コードは、この値を文字列変数ドキュメントを初期化することによって開始します。

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

ここで私はデバッグの目的のために使用するコードです。私は、HTMLファイルにこの文字列を保存し、その後、私はちょうどHTMLコンテンツが有効であることを確認し、私はまだギリシャ文字を読むことができます倍増するブラウザを介してそれを開く:

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

次のステップは、この値を書き込むしようとすることですPDFファイル。これは私のコードです:

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

私のコードの最終的な結果は次のとおりです。HTMLファイルで

私が手:いくつかのギリシャ文字:Καλημέραいくつかのギリシャ文字(予想される)

をPDFファイルで取得します:一部のギリシャ文字:いくつかのギリシャ文字予期しない - ギリシャ文字無視されます!!)

依存性:

  • Javaのバージョン "1.6.0_27"

  • iTextの-2.0.8.jar

  • de.huxhorn.lilith.3rdpartyを。フライイングレンダラー8プレビュー2.jar

私はまた、私の問題は間違ったフォントを使うこととは関係がないと思います。どんな援助も大歓迎です。

ありがとう

答えて

0

iTextはそれがutf-8コンテンツが含まれていることを、あなたのHTMLコンテンツからヘッダ情報を読んでみましょう。
タグをのhtmlコードに追加してutf-8charsetエンコーディングを実行し、iTextを実行してPDFを生成し、結果を確認してください。

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

更新
上記の私はチェコ共和国出身、そして私たちの国家のシンボルと同じ問題を抱えていたhttp://www.manning.com/lowagie2/iText2E_MEAP_CH02.pdf

+0

ちょうどいいニュースでそれを試しました:(私は同じ結果を得ています @Ravinder私はあなたの例でを逃したと思う:P – alexandros

+0

@alexandros:私の答えの更新をチェックしてください。 –

+0

私はこれをテストに追加しました:System.out.println( "file.encoding =" + System.getProperty( "file.encoding"));その結果、file.encoding = UTF-8が出力されます。これが正しいエンコードを確実にするためには十分であるか? – alexandros

9

で公開文書でENCODING VERSUS THE DEFAULT CHARSET USED BY THE JVMを参照し、その後、動作しない場合!いくつかの検索の後、私はthis solutionでそれを解決することができました。

具体的に(あなたがすでに持っている)で:

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

とCSSで、その後重要一部:

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

そのCSSなしで、あなたのフォントが使用されていない、私には思えます。私はCSSからの行を削除すると、エンコーディングが再び壊れています。

願っています。

+0

ありがとうございました!フォントを指定する(私の場合、* DejaVu Serif *だった)! – informatik01

4

あなたのHTMLにこのような何か追加:

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

をして、JavaコードでITextRendererにFontResolverを追加:PDFを生成するために使用さ

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

はクロアチアの文字のための素晴らしい作品

瓶以下のとおりです。

core-renderer.jar 
iText-2.0.8.jar 
関連する問題