2012-03-15 114 views
2

代码片断是在问题飞碟/ iText的在servlet的PDF没有找到CSS文件

的底部,我能成功使用servlet并呈现在客户端的浏览器PDF飞碟/ iText的。但是,我无法弄清楚如何获取包含在PDF渲染中的样式表。

我试过以下,因此至今没有工作过。

  • getServletContext()方法getRealPath( “/ PDFservlet.css”),并把 “PDFservlet.css” 在网站根目录
  • 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表单。

你能告诉我我在做什么错吗?

此外,我得到一个java.io.IOException: Stream closed后PDF呈现,并不知道这是从哪里来的。

我在本地测试并运行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>&#160;<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'>$&#160;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>&#160;<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方法是基于关闭乔恩斯基特的帖子在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

回答

1

我刚刚在服务器端读取我的CSS文件到一个String中。

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>"); 
4

有多种方式来解决这个问题,一个是你,别人是:

1:设置网址你的文件。你打电话renderer.setDocument(doc, null);第二个参数是基础url,资源将与那个相关联。

一个例子:

  • 您的文档<link href="my.css" ..
  • 的CSS位于http://example.com/something/my.css
  • 你应该叫renderer.setDocument(doc, "http://example.com/something/page.html");

2:实现UserAgentCallback接口,并renderer.getSharedContext().setUserAgentCallback(myUserAgentCallback);设置

+0

“第二个参数是你的文档的URL” - 我的文档在OutputStream中呈现,所以我不确定这会是什么。现在,我将从Servlet返回的OutputStream转换为iframe。 – 2012-03-16 18:08:42

+0

它不会(也不能)验证,您正在告诉飞碟作为查找相关网址的基础网址。 (我已经用这个信息更新了我的答案) – Adam 2012-03-16 18:29:11