FlyingSaucer renderer.setDocument抛出“Stream closed”异常

时间:2011-02-22 04:45:59

标签: java stream pdf-generation flying-saucer

使用找到here的简单示例创建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();
    }
}

控制台打印出以下错误。

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)

5 个答案:

答案 0 :(得分:9)

如果xhtml引用了渲染器无法找到的文件,例如css文件,则

renderer.setDocument可以抛出“Stream closed”异常。

这个症状与原始海报并不完全匹配,因为“无法加载XML资源”没有出现在错误消息中,我将这包括在内,以便通过谷歌来到这里。

答案 1 :(得分:1)

我解决了这个问题,只需更换

renderer.setDocument(url);

renderer.setDocument(new File(inputFile));

答案 2 :(得分:1)

 String File_To_Convert = "src/file.html";
        String url = new File(File_To_Convert).toURI().toURL().toString();
        //System.out.println("---"+url);
        String HTML_TO_PDF = "ConvertedFile.pdf";
        OutputStream os = new FileOutputStream(HTML_TO_PDF);       

         ITextRenderer renderer = new ITextRenderer();
                renderer.setDocument(url);      
                renderer.layout();
                renderer.createPDF(os) ;    
                os.close();
          System.out.println("done.");

这是正常运行的代码。

大多数人在我的代码中遇到上述问题。

 File_To_Convert = "src/file.html";

这里我们必须给出相对路径。

答案 3 :(得分:0)

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

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

答案 4 :(得分:0)

这里实际发生的是setDocument(...)调用执行而renderer无法打开InputStream(通常是因为该文件不存在或者没有足够的权限来访问它)。修复方法是使用File或应用可以访问的实时网址替换该引用。