【问题标题】:Flying Saucer and CSS飞碟和 CSS
【发布时间】:2016-01-21 21:17:52
【问题描述】:

使用飞碟将 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 指向它们(红色的帽子)。似乎https可能存在问题,但不知道如何解决这个问题。有没有人遇到过这个问题?

谢谢, ——阿卜杜勒

【问题讨论】:

  • 没有一些代码真的很难说问题出在哪里。
  • 我不确定要发布哪个代码,因为这似乎是一个已知问题,但目前还没有人有解决方案。我可以直接通过链接查看我的 .ear 文件中的 css 文件,但是当我渲染 PDF 时,它无法获取 css 文件(即使它包含在内)并且 PDF 的样式不显示.这在不同的环境中都可以正常工作,除了一个。这就是为什么它看起来像是一个与环境相关的问题而不是代码。
  • 您是否将 CSS 路径作为 URI 传递?我也遇到过这个问题,但我猜这是由 html 中的语法错误引起的。你能检查(也许“清理”)你的输入吗?

标签: css ssl https keystore flying-saucer


【解决方案1】:

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

  1. 开启日志记录 (Turning on Flying Saucer java.util.logging Output)

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

    公共字符串resolveURI(字符串uri){ /**/ }

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

在我的例子中,渲染器的 baseURL 是错误的。您可以在解析文档时将其传递给渲染器。

renderer.setDocumentFromString(generatedHtml, getBaseUrl());

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

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

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

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2013-07-30
    • 1970-01-01
    • 1970-01-01
    • 2014-05-29
    • 2011-07-24
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多