코드 조각 나는 서블릿을 사용하여 클라이언트의 브라우저에서 PDF 파일을 렌더링 할 성공적으로 수 있어요 질문비행 - 접시/iText를 PDF 파일은
의 하단에 비행 - 접시 CSS 파일을 찾을 수 없습니다/iText. 그러나, 나는 스타일 시트를 PDF 렌더링에 포함시키는 방법을 이해할 수 없다.
내가 해봤다음과 아무도 지금까지 일한 적이 있습니다.
- getServletContext() getRealPath ("/ PDFservlet.css을")와 웹 루트 디렉토리에서 "PDFservlet.css"를 넣어
buf.append("<head><link rel='stylesheet' type='text/css' href='PDFservlet.css' /></head>")
및 웹 루트 디렉토리에 "PDFservlet.css"를 두는 것, 서블릿 클래스 파일이 있고 "classes"디렉토리 바로 아래에있는 디렉토리href='\PDFservlet.css'
을 제외하고 위와 동일하며 여러 위치에 "PDFservlet.css"넣기 내 웹 루트 디렉토리 아래
여기에서 시도해야 할 다른 사항과 PDF가 클라이언트 브라우저에서 렌더링 될 때이 CSS 시트를 인식하는 방법을 잘 모르겠습니다.
내가 여기서 뭘 잘못하고 있는지 말해 줄 수 있습니까?
또한 PDF가 렌더링 된 후에 나는 java.io.IOException: Stream closed
을 얻었으며 어디서 오는지 확실하지 않습니다.
로컬로 테스트 중이며 WebLogic Server 10.3.3을 테스트 중입니다. 대안으로 나를 위해 노력하고 있습니다 문자열에 서버 측 코드에서 CSS 파일의 내용을 읽기
public void doGet(HttpServletRequest req, HttpServletResponse resp)
throws javax.servlet.ServletException, java.io.IOException
{
resp.setContentType("application/pdf");
StringBuffer buf = new StringBuffer();
buf.append("<html>");
// put in some style
buf.append("<head><link rel='stylesheet' type='text/css' href='PDFservlet.css' /></head>");
// generate the rest of the HTML...
buf.append("<body>");
buf.append(" <div id='container'>");
buf.append(" <div id='check_num'>1000</div>");
buf.append(" <div id='address'><b>Estate Of JAMES SMITH</b><br />35 Addison Avenue<br />New York, NY 00000<br />(123)456-7890</div>");
buf.append(" <div id='date'><i>Date</i> <u>02/08/2012</u></div>");
buf.append(" <div id='void_message'><b>VOID 180 DAYS FROM CHECK DATE</b></div>");
buf.append(" <div id='pay_line_container'>");
buf.append(" <div id='pay_line_message'><i>Pay To The Order Of:</i></div>");
buf.append(" <div id='pay_line'></div>");
buf.append(" <div id='pay_line_pay_to'>Richard Richards XXIII</div>");
buf.append(" <div id='pay_line_amount'>$ 5.00</div>");
buf.append(" </div>");
buf.append(" <div id='pay_line2_container'>");
buf.append(" <div id='pay_line2'></div>");
buf.append(" <div id='pay_line2_amount_description'>Five and 00/100</div>");
buf.append(" <div id='pay_line2_dollars'>DOLLARS</div>");
buf.append(" </div>");
buf.append(" <div id='void_stamp'><b>VOID</b></div>");
buf.append(" <div id='for_line'><i>For:</i> <u>test</u></div>");
buf.append(" <div id='bank_info'><b>TD BANKNORTH</b><br />MAINE</div>");
buf.append(" <div id='signature_line'></div>");
buf.append(" <div id='bank_numbers'><b>c1000c a123456789a 987654321c</b></div>");
buf.append(" </div>");
buf.append("</body>");
buf.append("</html>");
System.out.println(buf.toString());
// parse our markup into an xml Document
try {
DocumentBuilder builder = DocumentBuilderFactory.newInstance().newDocumentBuilder();
Document doc = builder.parse(new StringBufferInputStream(buf.toString()));
ITextRenderer renderer = new ITextRenderer();
renderer.setDocument(doc, null);
renderer.layout();
OutputStream os = resp.getOutputStream();
renderer.createPDF(os);
os.close();
} catch (Exception ex) {
ex.printStackTrace();
}
}
편집 I
는합니다 (readFile
방법에서 존 소총의 게시물의 기반으로한다 How do I create a Java string from the contents of a file?) :
buf.append("<head><style>");
buf.append(readFile(getServletContext().getRealPath("/PDFservlet.css"), "UTF-8"));
buf.append("</style></head>");
이 대안으로 OK의 접근 방식처럼 보이는가? 난 당신 중 일부는 잠시의 모든 한 번에 살펴 수 바라고 있어요
내가 iText를위한 대화방을 만든 II
편집. iText/flying-saucer에 대한 몇 가지 문제가있어 전문가 중 일부의 도움을 받아 쉽게 해결할 수 있다고 생각합니다. iText 문제를 해결할 수있는 도움이되는 자료를 게시 해주십시오. http://chat.stackoverflow.com/rooms/8945/itext
"두 번째 매개 변수는 문서의 URL입니다."- 내 문서가 OutputStream에 렌더링되므로 어떤 내용인지 확실하지 않습니다. 바로 지금, 나는 OutputStream을 서블릿에서 iframe으로 돌려 보낸다. –
Flying Saucer는 상대 URL 찾기를위한 기본 URL로 사용할 것을 알리고 있습니다. (이 정보로 내 대답을 업데이트했습니다) – Adam