gpt4 book ai didi

css - servlet 中的 Flying Saucer/iText PDF 找不到 css 文件

转载 作者:行者123 更新时间:2023-11-28 09:29:09 25 4
gpt4 key购买 nike

代码片段在问题的底部

我成功地能够使用 servlet 和 Flying Saucer/iText 在客户端的浏览器中呈现 PDF。但是,我无法弄清楚如何将样式表包含在 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 表。

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

此外,我在呈现 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>&#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 方法基于 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>");

这似乎是一种可行的替代方法吗?

编辑二

我为 iText 创建了一个聊天室,我希望你们中的一些人可以时不时地看一看。我在 iText/flying-saucer 方面遇到了几个问题,我认为在你们中的一些专家的帮助下可以很容易地解决这些问题。如果有机会,请查看并发布您可能能够解决 iText 问题的任何有用 Material :https://chat.stackoverflow.com/rooms/8945/itext

最佳答案

有多种方法可以解决这个问题,一种是你的,其他的是:

1:设置文档的 url。你打电话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接口(interface)并用renderer.getSharedContext().setUserAgentCallback(myUserAgentCallback);设置它

关于css - servlet 中的 Flying Saucer/iText PDF 找不到 css 文件,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/9722038/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com