当前位置: 首页 > 知识库问答 >
问题:

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

戚建白
2023-03-14

我试图从包含html代码的Java字符串生成pdf文档。我使用“Freemarker”作为模板引擎来生成html内容,然后使用“Flying Discer”将生成的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运行。作为tree命令(在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

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

谢谢你,罗希特

共有2个答案

苏乐童
2023-03-14

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

万俟招
2023-03-14

尝试设置baseUrl参数。

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

renderer.setDocumentFromString(html);

方法还可以采用基本url参数:

renderer.setDocumentFromString(content, baseUrl)

其中baseUrl=根文件夹(在我的示例中,它是一个web应用程序,所以它是“http://server:port/app”)。它看起来像是在baseUrl上构建的基本href-相对路径。一旦我在中添加了这一点,就需要使用图像和css。

 类似资料:
  • 我正在使用飞碟/iText生成报告。现在,报告有一个条件,即如果发生特定情况,报告应移动到pdf的下一页,并在pdf上添加数据,等等<问候Pawan

  • 问题内容: 我正在使用飞碟将XHTML转换为PDF文档。我已经获得了仅可用于基本HTML和嵌入式CSS的代码,但是,现在,我试图将图像添加为PDF的标题。我想知道的是,是否有任何办法通过将图像文件读取为Java Image对象来添加图像,然后以某种方式将其添加到PDF(或XHTML中,就像它获得了虚拟的“ URL”一样)表示可用于呈现PDF的Image对象。有没有人做过这样的事情? 预先感谢您提供

  • 我正在使用飞碟将XHTML转换为PDF文档。我已经让代码只使用基本的HTML和内嵌CSS,然而,现在我正试图将一个图像作为某种头添加到PDF中。我想知道的是,是否有任何方法可以添加图像,通过读取图像文件作为Java图像对象,然后以某种方式将其添加到PDF(或XHTML——就像它得到一个虚拟的“url”,表示可以用于呈现PDF的图像对象)。有人做过这样的事吗? 提前感谢您提供的任何帮助!

  • 这是一个例外。。 Java语言lang.ClassCastException:org。XHTMLender。提供BlockBox无法转换为组织。XHTMLender。牛顿表。桌子盒

  • 我想用外部资源(jpg、css)从html创建pdf。 这是用于生成pdf File对象的代码,带有Flie Saucer和itext: 不幸的是,所有与https链接的资源都被忽略,而超文本传输协议资源运行良好。 编辑: 我扩展了iTextureAgent以拦截https调用资源,但出现了以下错误: 太阳安全供应商。证书路径。SunCertPathBuilderException:无法找到请求目

  • 使用飞碟以PDF格式打印图像。 超文本标记语言代码: 当我使用飞碟将HTML转换为PDF时。生成的PDF不会打印图像。 我需要使用任何特定的软件包来打印PDF格式的图像吗。如果你有任何问题,请告诉我。