2

使用飞碟将 xhtml 转换为 PDF 时,出现以下异常:

java.io.IOException: Stream closed
            at  java.io.BufferedInputStream.getInIfOpen(Unknown Source)
            at  java.io.BufferedInputStream.read1(Unknown Source)
            at  java.io.BufferedInputStream.read(Unknown Source)
            at  sun.nio.cs.StreamDecoder.readBytes(Unknown Source)
            at  sun.nio.cs.StreamDecoder.implRead(Unknown Source)
            at  sun.nio.cs.StreamDecoder.read(Unknown Source)
            at  java.io.InputStreamReader.read(Unknown Source)
at org.xhtmlrenderer.css.parser.Lexer.zzRefill(Lexer.java:1634) 
             at org.xhtmlrenderer.css.parser.Lexer.yylex(Lexer.java:1865)
at org.xhtmlrenderer.css.parser.CSSParser.next(CSSParser.java:1778) 
at org.xhtmlrenderer.css.parser.CSSParser.la(CSSParser.java:1790) 
at org.xhtmlrenderer.css.parser.CSSParser.stylesheet(CSSParser.java:157) 
at org.xhtmlrenderer.css.parser.CSSParser.parseStylesheet(CSSParser.java:87) 
at org.xhtmlrenderer.context.StylesheetFactoryImpl.parse(StylesheetFactoryImpl.java:78) 
at org.xhtmlrenderer.context.StylesheetFactoryImpl.parse(StylesheetFactoryImpl.java:95) 
atorg.xhtmlrenderer.context.StylesheetFactoryImpl.getStylesheet(StylesheetFactoryImpl.java:174) 
at org.xhtmlrenderer.context.StyleReference.readAndParseAll(StyleReference.java:123) 
at org.xhtmlrenderer.context.StyleReference.setDocumentContext(StyleReference.java:107) 
at org.xhtmlrenderer.pdf.ITextRenderer.setDocument(ITextRenderer.java:175) 
at org.xhtmlrenderer.pdf.ITextRenderer.setDocument(ITextRenderer.java:142) 

我可以通过以下链接查看 css 文件的内容:https://.../file.css 我已经在 J​​BOSS 服务器中创建了一个密钥库和证书,并确保 ssl.conf 指向它们(redhat) . 似乎https可能存在问题,但不知道如何解决这个问题。有没有人遇到过这个问题?

谢谢,--阿卜杜勒

4

1 回答 1

4

为时已晚,但其他人可能会发现它很有用。这是我解决问题的方法:

  1. 打开日志记录(打开飞碟 java.util.logging 输出

    System.getProperties().setProperty("xr.util-logging.loggingEnabled", "true");
    XRLog.setLoggingEnabled(true);
    
  2. 阅读 org.xhtmlrenderer.swing.NaiveUserAgent 日志

    public String resolveURI(String uri){ /**/ }

(如果您可以远程调试它/在本地运行 JBoss - 在此处放置一个断点,您将看到所有字体/资源/css 加载)

就我而言,事实证明 baseURL 对于渲染器来说是错误的。您可以在解析文档时将其传递给渲染器。

renderer.setDocumentFromString(generatedHtml, getBaseUrl());

为了在我使用的环境中获取有效的 baseURL:

"jndi:"+servletContext.getResource("/").getPath()

(事实证明,您实际上可以使用此“jndi:”前缀访问已部署的战争中的静态文件。)

于 2016-01-21T13:17:52.393 回答