使用飞碟/iText进行图像渲染

使用飞碟/iText进行图像渲染,itext,flying-saucer,Itext,Flying Saucer,我正在尝试从包含html的Java字符串生成pdf文档 代码。我使用“Freemarker”作为模板引擎来生成html 内容,然后“飞碟”将生成的html转换为pdf。 我的问题是图像没有在生成的pdf中呈现。确切的 我如何生成的详细信息如下: import java.io.ByteArrayOutputStream; import java.io.IOException; import java.io.OutputStream; import java.io.OutputStreamWrite

我正在尝试从包含html的Java字符串生成pdf文档 代码。我使用“Freemarker”作为模板引擎来生成html 内容,然后“飞碟”将生成的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(仅显示相关部分)为:

为了简洁起见,我截断了输出。请帮忙

感谢和问候,
Rohit

一个可能的问题是在html代码中使用相对URL。尝试使用绝对URL,而不是相对URL。

尝试设置baseUrl参数

我也有同样的问题——我在传递html,而不是在pdf中获取图像(或css)。我用了和你完全一样的东西:

renderer.setDocumentFromString(html);
该方法还可以采用基本url参数:

renderer.setDocumentFromString(content, baseUrl)
其中baseUrl=根文件夹(在我的例子中,它是一个web应用程序,所以它是“http://server:port/app”)。它的工作方式似乎类似于在baseUrl上构建的基本href-相对路径。一旦我在中添加了它,就可以使用图像和css

renderer.setDocumentFromString(html);
renderer.setDocumentFromString(content, baseUrl)