10

私はflyingsaucerを使用してPDFに変換しているxhtmlドキュメントを持っています。xhtmlには、base64でエンコードされた画像をインラインで持ついくつかのタグがあります。xhtmlのソースは動的であるため、画像タグが配置される構造はさまざまです。これは、タグがどのように見えるかのサンプルです。

<img src="data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAagAAAEuCAYAAADbW4YFAAAgAElEQVR4Aex9CYBdRZ ...

ブラウザでhtmlを見ると、画像は正しく表示されますが、最終的なPDFではimg要素がレンダリングされません。これが、PDFを作成するためにレンダリングする方法です。

ITextRenderer renderer = new ITextRenderer();
renderer.setDocument(builder.parse(source), "");
renderer.layout();
renderer.createPDF(response.getOutputStream(),true);

これを達成するために私が取るべきアプローチを誰かに教えてもらえますか?この投稿を見ましたが、インライン画像を使用しているため、Eddのソリューションを使用してこれを実現する方法がわかりません。

前もって感謝します

4

2 に答える 2

10

はい、ここに示すアプローチを使用できます: Flyingsaucer で生成された pdf でサーブレットから画像をレンダリングする

Edd の場所:

        InputStream input = null;
        try {
            input = ...;
            byte[] bytes = IOUtils.toByteArray(input);
            Image image = Image.getInstance(bytes);

Edd の場合、イメージはリモート ソースからのものです (彼は でそのビットをスキップしますinput = ...;)。あなたのケースでは、Base64 でエンコードされたデータ (の後のテキスト) からそれを読み取りたいだけですbase64,。最初にBase64 デコーダーを使用してバイナリ データを取得し、byte[]ストリームに入れます。次に、Java ImageIOを使用してバイトからイメージを作成し、 Edd のアプローチに従って、画像を PDF に取り込みます。

于 2012-05-31T21:26:19.243 に答える
8

Flying-Saucerはdata:protocolをネイティブにサポートしています。あなたがしなければならないのはプロトコルハンドラーを登録することです:

-Djava.protocol.handler.pkgs=org.xhtmlrenderer.protocols

サーブレットwhatsoververは必要ありません。

于 2012-07-11T12:50:59.373 に答える