2012-04-25 8 views
3

私は誰かが私を助けることができるホッピングです...私は何をしようとしているようですが、かなりシンプルでなければなりませんが、私は今一日以上この事を戦っていて、 。私はStackOverflowとインターネットに関する多くの情報を見つけましたが、この問題を解決するのに役立つものは何もありません。フライングソーサーで@ font-face

core-renderer-R8と共にitext-2.0.8を使用して、埋め込みフォントでPDFを作成しようとしています。私は、有効なXHTMLからPDFを生成しようとしており、@ font-faceスタイルタグを使ってフォントを埋め込んでいます。私は@ font-faceタグがブラウザでファイルを開くことによってフォントを含んでいることを確認しました。そして、私はいつもTTFの関係をXHTML/CSSの文書と比べて保つように注意しています。

これを試してみるために、私は小さな「Hello World」タイプのプログラムを作成してフォントを埋め込みました。私は2つの別々のアプローチを取っており、どちらも望みの結果を生み出すことができません。私はこの小さなEclipseプログラムのコピーをhttp://christopherluft.com/FlyingSaucer.zip

に置いています。プログラムはどちらのインスタンスでもPDFを生成しますが、どちらのPDFも期待どおりに埋め込まれていません。 setDocumentでファイルを使用する最初の方法ではエラーは発生せず、フォントも生成されません。 2番目の方法ではPDFが生成されますが、デバッグ出力にjava.net.MalformedURLExceptionが表示されます。

私は様々なパスとURLの多数の順列を試しました。しかしながら、所望の結果が得られないものはない。私の疑問は、ITextRenderer.setDocumentについて何かを理解していないことです。しかし、私は実際の使用事例に特有の適切な文書を見つけるのに苦労しました。

私がしようとしています最初の方法は次のとおりです。

public static void main(String[] args) throws IOException, DocumentException { 

    System.getProperties().setProperty("xr.util-logging.loggingEnabled", 
      "true"); 
    XRLog.setLoggingEnabled(true); 

    String inputFile = "sample.xhtml"; 
    String url = new File(inputFile).toURI().toURL().toString(); 
    String outputFile = "firstdoc.pdf"; 

    OutputStream os = new FileOutputStream(outputFile); 

    ITextRenderer renderer = new ITextRenderer(); 
    renderer.setDocument(url); 
    renderer.layout(); 
    renderer.createPDF(os); 

    os.close(); 
} 

そして、私は(我々は我々のアプリでそれを使用する実際の方法に近いです)使用しています第2の方法は次のとおりです。

public static void main(String[] args) throws IOException, DocumentException { 

    System.getProperties().setProperty("xr.util-logging.loggingEnabled", "true"); 
    XRLog.setLoggingEnabled(true); 

    String inputFile = "sample.xhtml"; 
    String url = new File(inputFile).toURI().toURL().toString(); 

    DocumentBuilder documentBuilder; 
    org.w3c.dom.Document xhtmlContent; 

    try 
    { 
     documentBuilder = DocumentBuilderFactory.newInstance().newDocumentBuilder(); 
     documentBuilder.setEntityResolver(new XhtmlEntityResolver(new SuppressingEntityResolver())); 
     xhtmlContent = documentBuilder.parse(url); 

     System.out.println(url); 

     String outputFile = "firstdoc.pdf"; 
     OutputStream os = new FileOutputStream(outputFile); 
     ITextRenderer renderer = new ITextRenderer(); 

     renderer.setDocument(xhtmlContent,"."); 
     renderer.layout(); 
     renderer.createPDF(os); 

     System.out.println("Finishing up...."); 
     os.close(); 
    } 
    catch (SAXException e) 
    { 
     // TODO Auto-generated catch block 
     e.printStackTrace(); 
    } 
    catch (ParserConfigurationException e) 
    { 
     // TODO Auto-generated catch block 
     e.printStackTrace(); 
    } 
} 

XHTMLに@ font-faceを含めると、次のようになります。

今私はこれが本当に一般的な私はこれを働かせるために簡単な一歩を踏み出すことに失敗したと想像しています...問題は、私がこれにしばらく滞在していて、木々の中で森を見ることができないと思うことです。誰かが私に提供できる助けがあれば、大歓迎です。あなたの時間をありがとう。

+0

Mavenでフォントが壊れていないことを確認してください。 http://stackoverflow.com/a/35367727/2420718 –

答えて

4

Flying Saucerでフォントが正しく埋め込まれていないように見えて、埋め込みしようとしていたフォントが破損しているか、少なくとも完全ではないという問題が発生しました。フォントファミリに関する属性および説明が欠落していました。私はOS XIにFontBookで検証ファイル]オプションを使用して、私のフォントを検証してみました場合は速やかに警告を提示されたと言って:

  • を「名前」のテーブルユーザビリティ
  • 「名前」テーブル構造

しかしFlyingSaucer黙って失敗し、Times-RomanとTimes-Boldをデフォルトのフォントとして埋め込んでいます。 FontBookの検証をパスしたフォントを使ってみると、フォントが正しく埋め込まれていることがわかりました。

FlyingSaucerからのログ記録の冗長性を増やしてより多くの情報を得ようと数時間を費やしていましたが、レンダリングプロセス全体を踏んでからFontFamilyが "フォントをロードした後のデバッガと、それが登録されると予想される名前が含まれていないことを示します。

ボトムライン:FlyingSaucerとフォントに問題があり、壁に向かって頭を叩いている場合は、フォントが有効であることを確認してください。

+0

ありがとうございます。 FontForgeを使用してフォントを修正し、エラーをすばやく修正することができます。有効なフォントを使用している場合、FlyingSaucerはそれを取得します。 – kevinverhoef

2

私はtekgruntのような同じ問題で苦労しましたが、最終的にカスタムフォント(Computer Modern)が埋め込まれたPDFが得られました。私の経験:フォントのための

  • OTF形式は動作しませんでした(iTextの機能でクラッシュが)
  • TTF形式は、私は、以下の変更を行った後、仕事をした:CSSでは、同じフォントファミリを使用しますフォントにエンコードされているような名前。
    org.xhtmlrenderer.pdf.ITextFontResolver.addFontFaceFont()
    にブレークポイントを設定し、変数 "fontFamily"がどの値を取得しているかを調べます。これがCSSフォントファミリと同じでない場合は、うまく動作しません。

もちろん、これらの問題はライブラリによってユーザーに報告される必要があります。

関連する問題