servlet中的飞碟/iText PDF找不到css文件

servlet中的飞碟/iText PDF找不到css文件,css,servlets,itext,flying-saucer,Css,Servlets,Itext,Flying Saucer,问题的底部是一段代码片段 我能够使用servlet和flying-discer/iText在客户端浏览器中成功呈现PDF。但是,我不知道如何在PDF呈现中包含样式表 我尝试了以下方法,但迄今为止没有一种有效: getServletContext().getRealPath(“/PDFservlet.css”)并将“PDFservlet.css”放在web根目录中 buf.append(“”)并将“PDFservlet.css”放在web根目录下,该目录是servlet类文件所在的目录,正好位于

问题的底部是一段代码片段

我能够使用servlet和flying-discer/iText在客户端浏览器中成功呈现PDF。但是,我不知道如何在PDF呈现中包含样式表

我尝试了以下方法,但迄今为止没有一种有效:

  • getServletContext().getRealPath(“/PDFservlet.css”)并将“PDFservlet.css”放在web根目录中
  • buf.append(“”)
    并将“PDFservlet.css”放在web根目录下,该目录是servlet类文件所在的目录,正好位于“classes”目录下
  • 除了
    href='\PDFservlet.css'
    和将“PDFservlet.css”放在我的web根目录下的不同位置之外,与上面相同
不确定在客户端浏览器中呈现PDF时还可以尝试什么,以及如何识别此CSS表

你们谁能告诉我我做错了什么

另外,在呈现PDF之后,我得到了一个
java.io.IOException:Stream closed
,不确定它来自哪里

我正在本地测试并运行WebLogicServer10.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();
    }
}
这似乎是一种可行的替代方法吗

编辑II


我已经为iText创建了一个聊天室,我希望你们中的一些人可以偶尔浏览一下。我在iText/飞碟上遇到了几个问题,我认为在你们一些专家的帮助下可能很容易解决。如果有机会,请看一看,并发布任何对iText问题有用的材料:

我决定将服务器端的CSS文件读入字符串

readFile
方法基于Jon Skeet的帖子:

buf.append(“”);
append(readFile(getServletContext().getRealPath(“/PDFservlet.css”),“UTF-8”);
buf.追加(“”);

解决这个问题有多种方法,一种是你的,另一种是:

1:设置文档的url。调用
renderer.setDocument(doc,null)第二个参数是基本url,资源将位于与此相关的位置

例如:


  • 您的文档有
    “第二个参数是您文档的url”-我的文档在OutputStream中呈现,因此我不确定这是什么。现在,我将OutputStream从一个servlet返回到一个iframe中。它不会(也不能)被验证,您正在告诉飞碟用什么作为定位相对url的基础url。(我已使用此信息更新了我的答案)
    
    buf.append("<head><style>");
    buf.append(readFile(getServletContext().getRealPath("/PDFservlet.css"), "UTF-8"));
    buf.append("</style></head>");
    
    buf.append("<head><style>");
    buf.append(readFile(getServletContext().getRealPath("/PDFservlet.css"), "UTF-8"));
    buf.append("</style></head>");