6

誰かが私を助けてくれることを願っています...私がやろうとしていることはかなり単純なはずですが、私はこのことと1日以上戦っていて、アイデアがありません. StackOverflow とインターネット全体に関する多くの情報を見つけましたが、この問題の解決に役立つものは何もありませんでした。

itext-2.0.8 を core-renderer-R8 と共に使用して、フォントが埋め込まれた 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 を含めると、次のようになります。

@font-face {

    font-family: 'MisoRegular';

    src: url("miso-regular-webfont.ttf");

    -fs-pdf-font-embed: embed;

    -fs-pdf-font-encoding: Identity-H;
}

今、これは本当に一般的な使用例だと思います。これを機能させるための簡単な手順を 1 つ実行できていないだけだと思います...問題は、私がしばらくこれに取り組んでいて、木の間から森が見えない。誰かが私に提供できる助けがあれば、大歓迎です。お時間をいただきありがとうございます。

4

3 に答える 3

4

Flying Saucer で、フォントが適切に埋め込まれていないように見え、埋め込もうとしていたフォントが破損しているか、少なくとも完全ではないという問題が発生しました。フォント ファミリーと説明に関する属性が欠落していました。OS XI で FontBook の Validate File オプションを使用してフォントを検証しようとすると、すぐに次のような警告が表示されました。

  • 'name' テーブルの使いやすさ
  • 'name' テーブル構造

しかし、FlyingSaucer は黙って失敗し、Times-Roman と Times-Bold をデフォルトのフォントとして埋め込むことを続行しました。FontBook の検証に合格したフォントを使用してみると、フォントが正しく埋め込まれていることがわかりました。

より多くの情報を得るために、FlyingSaucer からのログ記録の詳細度を上げようと何時間も費やしましたが、レンダリング プロセス全体をステップ実行して、ロード後にデバッガーで FontFamily が "" に設定されていることに気付くまで、これが事実であることに気付きませんでした。フォントと、それが登録されていると思っていた名前が含まれていないこと。

結論: FlyingSaucer とフォントに問題があり、頭を壁にぶつけている場合は、フォントが有効であることを確認してください。

于 2012-04-27T02:10:21.353 に答える