FlyingSaucer renderer.setDocument抛出"Stream closed"异常

pab*_*ben 8 java pdf-generation stream flying-saucer

我在使用此处的简单示例创建PDF时遇到问题.这是我第一次尝试使用它,我尝试了一些事情和大量的搜索,但没有找到错误产生的原因.错误源于该renderer.setDocument(url);行.如果有人有任何想法,建议或替代方案,将不胜感激.

package flyingsaucerpdf;

import java.io.*;
import com.lowagie.text.DocumentException;
import org.xhtmlrenderer.pdf.ITextRenderer;

public class FirstDoc {

    public static void main(String[] args) 
            throws IOException, DocumentException {
        String inputFile = "samples/firstdoc.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();
    }
}
Run Code Online (Sandbox Code Playgroud)

控制台打印出以下错误.

ERROR:  'Stream closed'
org.xhtmlrenderer.util.XRRuntimeException: Can't load the XML resource (using TRaX transformer). java.io.IOException: Stream closed
    at org.xhtmlrenderer.resource.XMLResource$XMLResourceBuilder.createXMLResource(XMLResource.java:191)
    at org.xhtmlrenderer.resource.XMLResource.load(XMLResource.java:71)
    at org.xhtmlrenderer.swing.NaiveUserAgent.getXMLResource(NaiveUserAgent.java:211)
    at org.xhtmlrenderer.pdf.ITextRenderer.loadDocument(ITextRenderer.java:134)
    at org.xhtmlrenderer.pdf.ITextRenderer.setDocument(ITextRenderer.java:138)
    at com.asiaprice.service.email.template.CompletePdf.createpdf(CompletePdf.java:28)
Run Code Online (Sandbox Code Playgroud)

Ter*_*ner 9

如果xhtml引用渲染器无法找到的文件(例如css文件),则renderer.setDocument可以抛出"Stream closed"异常.

这个症状与原始海报不完全匹配,因为"无法加载XML资源"没有出现在错误消息中,我包括这个是为了通过谷歌来到这里的人的利益.


Chr*_*ris 0

“samples/firstdoc.xhtml”是教程中的文件吗?它是否位于正确的目录中并且可以访问?XHTMLRenderer 只接受干净的 XHTML 代码并且非常严格。如果出现问题,您将得到例外。

在我的一些项目中,我使用JTidy在渲染之前清理源代码。