1

HTML コードを含む Java String から PDF ドキュメントを生成しようとしています。「Freemarker」をテンプレートエンジンとして使用してhtmlコンテンツを生成し、「Flying-Saucer」を使用してこの生成されたhtmlをpdfに変換しています。私の問題は、生成された pdf で画像がレンダリングされないことです。私がどのように生成しているかについての正確な詳細は次のとおりです。

import java.io.ByteArrayOutputStream;
import java.io.IOException;
import java.io.OutputStream;
import java.io.OutputStreamWriter;
import java.io.Writer;
import java.util.List;

import org.xhtmlrenderer.pdf.ITextRenderer;

import com.google.inject.Inject;
import com.google.inject.Singleton;
import com.lowagie.text.DocumentException;

import freemarker.template.Configuration;
import freemarker.template.DefaultObjectWrapper;
import freemarker.template.SimpleHash;
import freemarker.template.SimpleSequence;
import freemarker.template.Template;
import freemarker.template.TemplateException;

@Singleton
public class FlyingSaucerTaxInvoicePdfPrinter implements ITaxInvoicePdfPrinter {
    private final Configuration m_cfg;

    @Inject
    public FlyingSaucerTaxInvoicePdfPrinter() {
        // TODO: Following should be singletons and injected
        m_cfg = new Configuration();
        m_cfg.setObjectWrapper(new DefaultObjectWrapper());
        m_cfg.setClassForTemplateLoading(this.getClass(), "/");
    }

    private Template getTemplate() throws IOException {
        return m_cfg.getTemplate(PdfResources.TAX_INVOICE_TEMPLATE);
    }

    @Override
    public void printToPdf(TaxInvoiceUiPb taxInvoice, OutputStream pdfOutputStream) {
        OutputStream htmlOuputStream = null;
        try {
            htmlOuputStream = new ByteArrayOutputStream();
            printHtml(htmlOuputStream, taxInvoice);
            generatePDF(htmlOuputStream, pdfOutputStream);
        } catch (Exception e) {
            throw new LoggedRuntimeException(e);
        } finally {
            try {
                htmlOuputStream.close();
            } catch (IOException e) {
                throw new LoggedRuntimeException(e);
            }
        }
    }

    private void generatePDF(OutputStream htmlOuputStream, OutputStream pdfOutputStream)
                    throws DocumentException, IOException {
        try {
            ITextRenderer renderer = new ITextRenderer(30.666f, 20);
            String html = htmlOuputStream.toString();
            logHtml(html);
            renderer.setDocumentFromString(html);
            renderer.layout();
            renderer.createPDF(pdfOutputStream);
        } finally {
            pdfOutputStream.close();
        }
    }

// Some methods not shown as irrelevant
}

生成された html (関連するセクションのみを表示) は次のとおりです。

<body>
<div class="main" background="images/invoice-bg.jpg">
    <img src="images/invoice-bg.jpg"></img>
    <div class="header">
    <div class="logo"><img src="images/invoice-logo.jpg" alt="" border="0" /></div>
    <div class="heading">booking invoice</div>
    </div>
    <div class="clear"></div>
</div>
</body>

このコードは、Tomcat にデプロイされた War として実行されます。ツリー コマンド (WEB-INF 内で実行) の出力としての戦争の画像の場所は次のとおりです。

|-- classes
|   |-- com
|   |   `-- ilodge
|   |       `-- pmsServerWar
|   |           |-- PmsServerWarListener.class
|   |           `-- PmsServerWarServletModule.class
|   |-- images
|   |   |-- invoice-bg.jpg
|   |   |-- rupees-icon-total.png
|   |   |-- thank-you.jpg
|   |   |-- total-bold-rupee.png
|   |   `-- ul-bor.jpg
|   |-- taxInvoice.css
|   |-- taxInvoiceFooter.ftl
|   |-- taxInvoice.ftl
|   `-- test.ftl
|-- lib
|   |-- addressServer-1.0-SNAPSHOT.jar
|   |-- addressUiProtobuf-1.0-SNAPSHOT.jar
|   `-- xml-apis-1.3.03.jar
`-- web.xml

簡潔にするために、出力を切り捨てました。助けてください。

よろしくお願いします、 Rohit

4

2 に答える 2

3

baseUrl パラメータを設定してみてください。

私は同じ問題を抱えていました-私はhtmlを渡していますが、pdfで画像(またはcss)を取得していませんでした。私はあなたとまったく同じものを使用しました:

renderer.setDocumentFromString(html);

このメソッドは、ベース URL パラメーターも受け取ることができます。

renderer.setDocumentFromString(content, baseUrl)

baseUrl = ルート フォルダー (私の場合は Web アプリケーションなので、'http://server:port/app' でした)。ベースhrefのように機能するようです-相対パスはbaseUrlに基づいて構築されます。それを追加したら、blammo - images and css.

于 2013-05-01T16:32:36.473 に答える
0

考えられる問題は、html コードで相対 URL を使用している可能性があります。相対 URL ではなく、絶対 URL を使用してみてください。

于 2012-05-15T13:50:13.280 に答える