2014-07-01 3 views
0

<dependency> <groupId>org.xhtmlrenderer</groupId> <artifactId>flying-saucer-pdf-itext5</artifactId> <version>9.0.4</version> </dependency> 내 HTML 문자열을 PDF로 변환하려고합니다.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(); 
    } 

코드가 로컬에서 올바르게 작동합니다. 하지만 프로덕션 서버에서 throwing connection time out 예외입니다. 여기 는 전체 스택의 코드에

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) 

라인 No.84을 추적하다 Document doc = builder.parse(new ByteArrayInputStream(table.getBytes("UTF-8")));

는 처음에는 서버가 외부 CSS를 가져올 수 없습니다 수 있습니다 생각입니다. 그래서 html 파일을 html 파일로 저장하고 브라우저에서 해당 페이지를 볼 수 있습니다. 이는 서버가 CSS에 액세스 할 수 있음을 의미합니다.

+0

스택 추적에서'XMLDTDScannerImpl.setInputSource'를 봅니다. 일부 DTD가 프로덕션 서버에서 액세스 할 수없는 URL에 정의되어있을 수 있습니까? – mkl

답변

0

메인 HTML이 저장되었다고해서 CSS가 잘 저장되었다는 것을 의미하지는 않기 때문에 여전히 CSS에 관한 것일 수 있습니다. (사실, 실제로 저장할지 여부를 모릅니다. 당신이 시도하는 모든 통신을 알기 위해 파로스 같은 프록시를 통해 작업을 수행하려고?)

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

을 그런데, 문제는 다를 수 있습니다. 프로덕션 환경에서 회사 프록시를 사용하고 있습니까? "비행 접시 pdf 라이브러리"가 방화벽에 걸려 그 시간 초과를 유발할 수있는 외부 리소스 (.xsd 또는 이와 유사한 것)가 필요합니까? 응용 프로그램에서 생성하는 모든 통신을 제어 할 수 있는지 확인하고 문제를 찾을 수 있습니다.