当使用飞碟将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我在JBOSS服务器中创建了一个密钥库和证书,并确保ssl.conf指向它们(红帽)。似乎有一个问题可能与https,但不知道如何解决这个问题。有没有人以前遇到过这个问题?
谢谢, --Abdul
答案 0 :(得分:4)
已经太晚了,但其他人可能觉得它很有用。以下是我解决问题的方法:
打开记录(Turning on Flying Saucer java.util.logging Output)
System.getProperties().setProperty("xr.util-logging.loggingEnabled", "true");
XRLog.setLoggingEnabled(true);
阅读org.xhtmlrenderer.swing.NaiveUserAgent日志
public String resolveURI(String uri){ / ** / }
(如果你可以远程调试它/在本地运行JBoss - 在那里放一个断点,你就会看到所有的font / resource / css加载)
在我的情况下,结果是渲染器的baseURL是错误的。您可以在解析文档时将其传递给渲染器。
renderer.setDocumentFromString(generatedHtml, getBaseUrl());
为了在我的环境中获得有效的baseURL,我已经使用过:
"jndi:"+servletContext.getResource("/").getPath()
(原来你实际上可以使用这个" jndi:"前缀来访问已部署战争中的静态文件。)