代码片段位于问题的底部
我成功地使用servlet和fly-saucer / iText在客户端的浏览器中呈现PDF。但是,我无法弄清楚如何将样式表包含在PDF渲染中。
我尝试了以下内容,到目前为止还没有任何工作:
buf.append("<head><link rel='stylesheet' type='text/css' href='PDFservlet.css' /></head>")
并将“PDFservlet.css”放在Web根目录中,即servlet类文件所在的目录,位于“classes”目录下href='\PDFservlet.css'
除外,并将“PDFservlet.css”放在我的网络根目录下的不同位置不确定此处还有什么可以尝试以及如何在客户端浏览器中呈现PDF时识别此CSS表。
你们有谁能告诉我这里我做错了什么?
此外,我在呈现PDF后得到java.io.IOException: Stream closed
,并且不知道它来自何处。
我正在本地测试并运行WebLogic Server 10.3.3。
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();
}
}
编辑我
将服务器端代码中的CSS文件内容读入字符串对我来说是另一种选择(readFile
方法基于Jon Skeet在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>");
这似乎是一种可行的方法吗?
编辑II
我已经为iText创建了一个聊天室,我希望你们中的一些人可能会偶尔看一下。我有一些关于iText /飞碟的问题,我认为可以通过一些专家的帮助轻松解决。请查看您是否有机会发布有关iText问题的任何有用材料:http://chat.stackoverflow.com/rooms/8945/itext
答案 0 :(得分:4)
有多种方法可以解决这个问题,一个是你的,另一个是:
1:设置文档的网址。您调用renderer.setDocument(doc, null);
第二个参数是基本网址,资源将与之相关。
一个例子:
<link href="my.css" ..
http://example.com/something/my.css
renderer.setDocument(doc, "http://example.com/something/page.html");
2:实施UserAgentCallback界面并将其设置为renderer.getSharedContext().setUserAgentCallback(myUserAgentCallback);
答案 1 :(得分:1)
我决定只将服务器端的CSS文件读入String。
readFile
方法基于Jon Skeet在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>");