【发布时间】: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