FlyingSaucer渲染器的setDocument方法抛出“流已关闭”异常

9
我在使用这个简单示例时遇到了创建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)

一般而言,我的建议是“获取源代码,在抛出异常的地方设置断点”。在那种情况下,那个特定的异常并没有什么意义。我所能想到的唯一可能是 FileOutputStream 由于某些原因打开失败了。 - Mark Storer
5个回答

11

如果xhtml引用了渲染器找不到的文件(例如css文件),renderer.setDocument可能会抛出“Stream closed”异常。

这种情况的症状与原帖并不完全相符,“无法加载XML资源”不会出现在错误消息中,我包括这个信息是为了那些通过谷歌来到这里的人受益。


是的,一定要确保XHTML中的任何引用都可以解决。还可以将其包装在try/catch中,以防止出现任何奇怪的堆栈跟踪。 - Jason Lowenthal

1

我通过简单地替换解决了这个问题

renderer.setDocument(url);

使用

renderer.setDocument(new File(inputFile));

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";

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


我们能否将Spring映射传递到File_To_Convert字符串中?String toConvert = "/dailyFlight.do"; - Samarland

0

"samples/firstdoc.xhtml"是教程中的文件吗?它是否在正确的目录下并且可访问?XHTMLRenderer只接受干净的XHTML代码,并且非常严格。如果有任何问题,您将会收到异常。

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


0
实际上发生的情况是setDocument(...)调用执行,而renderer无法打开InputStream(通常是因为文件不存在或没有足够的权限访问它)。修复方法是将该引用替换为应用程序可以访问的File或活动URL。

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接