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)
4

5 回答 5

11

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

此症状与原始海报不完全匹配,因为“无法加载 XML 资源”未出现在错误消息中,我将其包括在内是为了那些通过谷歌来到这里的人的利益。

于 2013-02-21T11:13:47.587 回答
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";

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

于 2013-02-13T13:33:55.333 回答
1

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

renderer.setDocument(url);

renderer.setDocument(new File(inputFile));
于 2011-09-26T09:52:34.313 回答
0

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

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

于 2011-02-22T11:09:29.227 回答
0

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

于 2012-01-12T15:55:25.697 回答