【问题标题】:Connection timed out while generating pdf from html string从 html 字符串生成 pdf 时连接超时
【发布时间】:2014-07-01 08:21:27
【问题描述】:

我正在使用<dependency> <groupId>org.xhtmlrenderer</groupId> <artifactId>flying-saucer-pdf-itext5</artifactId> <version>9.0.4</version> </dependency> 将我的 HTML 字符串转换为 PDF。

    try {
        String table = getHtmlAsString();//returns html string which contains reference to external CSS
        DocumentBuilder builder = DocumentBuilderFactory.newInstance().newDocumentBuilder();
        Document doc = builder.parse(new ByteArrayInputStream(table.getBytes("UTF-8")));

        ITextRenderer renderer = new ITextRenderer();
        renderer.setDocument(doc, null);

        ByteArrayOutputStream byteArray = new ByteArrayOutputStream();
        renderer.layout();
        renderer.createPDF(byteArray);
        byte[] pdf = byteArray.toByteArray();
        byteArray.close();
        writeByteArrayToFile(pdf);
    } catch (Exception e) {
        e.printStackTrace();
    }

代码在本地运行良好。但是在生产服务器上它会抛出连接超时异常。 这是完整的堆栈跟踪

java.net.ConnectException: Connection timed out: connect at
 java.net.DualStackPlainSocketImpl.connect0(Native Method) at
 java.net.DualStackPlainSocketImpl.socketConnect(Unknown Source) at
 java.net.AbstractPlainSocketImpl.doConnect(Unknown Source) at
 java.net.AbstractPlainSocketImpl.connectToAddress(Unknown Source) at
 java.net.AbstractPlainSocketImpl.connect(Unknown Source) at
 java.net.PlainSocketImpl.connect(Unknown Source) at
 java.net.SocksSocketImpl.connect(Unknown Source) at
 java.net.Socket.connect(Unknown Source) at
 java.net.Socket.connect(Unknown Source) at
 sun.net.NetworkClient.doConnect(Unknown Source) at
 sun.net.www.http.HttpClient.openServer(Unknown Source) at
 sun.net.www.http.HttpClient.openServer(Unknown Source) at
 sun.net.www.http.HttpClient.<init>(Unknown Source) at
 sun.net.www.http.HttpClient.New(Unknown Source) at
 sun.net.www.http.HttpClient.New(Unknown Source) at
 sun.net.www.protocol.http.HttpURLConnection.getNewHttpClient(Unknown Source) at
 sun.net.www.protocol.http.HttpURLConnection.plainConnect(Unknown Source) at
 sun.net.www.protocol.http.HttpURLConnection.connect(Unknown Source) at
 sun.net.www.protocol.http.HttpURLConnection.getInputStream(Unknown Source) at
 org.apache.xerces.impl.XMLEntityManager.setupCurrentEntity(Unknown Source) at
 org.apache.xerces.impl.XMLEntityManager.startEntity(Unknown Source) at
 org.apache.xerces.impl.XMLEntityManager.startDTDEntity(Unknown Source) at
 org.apache.xerces.impl.XMLDTDScannerImpl.setInputSource(Unknown Source) at
 org.apache.xerces.impl.XMLDocumentScannerImpl$DTDDispatcher.dispatch(Unknown Source) at
 org.apache.xerces.impl.XMLDocumentFragmentScannerImpl.scanDocument(Unknown Source) at
 org.apache.xerces.parsers.XML11Configuration.parse(Unknown Source) at
 org.apache.xerces.parsers.XML11Configuration.parse(Unknown Source) at
 org.apache.xerces.parsers.XMLParser.parse(Unknown Source) at
 org.apache.xerces.parsers.DOMParser.parse(Unknown Source) at
 org.apache.xerces.jaxp.DocumentBuilderImpl.parse(Unknown Source) at
 javax.xml.parsers.DocumentBuilder.parse(Unknown Source) at
 com.mypackage.PDFProcessor.getPdf(PDFProcessor.java:84)

代码中的第84行是Document doc = builder.parse(new ByteArrayInputStream(table.getBytes("UTF-8")));

起初我认为可能是服务器无法获取外部 CSS。所以我将 html 字符串保存为 html 文件,我可以在浏览器上看到该页面。这意味着服务器能够访问 CSS。

【问题讨论】:

  • 我在堆栈跟踪中看到XMLDTDScannerImpl.setInputSource。会不会是在生产服务器无法访问的 URL 中定义了某些 DTD?

标签: java pdf-generation flying-saucer


【解决方案1】:

您的 CSS 可能仍然是正确的,因为主 html 已保存这一事实并不意味着 CSS 已保存良好(实际上,我们甚至不知道它是否会尝试保存它,您是否尝试过通过像 Paros 这样的代理来完成您的工作,以便了解您尝试的每一次通信?)

http://sourceforge.net/projects/paros/

顺便说一下,您的问题可能有所不同。您是否在生产环境中使用公司代理?您的“飞碟 pdf 库”是否需要任何可能卡在防火墙中并导致超时的外部资源(任何 .xsd 或类似的东西)?确保您可以控制应用程序生成的所有通信,这样您就会发现问题。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2018-07-08
    • 1970-01-01
    • 1970-01-01
    • 2010-09-15
    • 2011-10-07
    • 1970-01-01
    • 2011-04-04
    相关资源
    最近更新 更多