使用 servlet 覆盖 pdf 文件(模板)



所以我刚刚听说过名为iText的API,我对它的用法并不熟悉。

所以我现在的问题是我想在现有的 pdf 文件(模板)上写下以 jsp 形式提供的信息。 我尝试了一些在互联网上找到的代码,它工作正常,但在servlet上不能。 谢谢。

编辑这是我找到并尝试放入 servlet 的代码。

protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {

Document document = new Document(PageSize.A4);
try {
PdfWriter.getInstance(document, new FileOutputStream(new File(
"test.pdf")));
document.open();
String content = request.getParameter("aa");
Paragraph paragraph = new Paragraph(content);
document.add(paragraph);
} catch (DocumentException e) {
e.printStackTrace();
} catch (FileNotFoundException e) {
e.printStackTrace();
} finally {
document.close();
}
}

我看着你的servlet,我看到:

new FileOutputStream(new File("test.pdf"))

这意味着您正在将文件写入服务器上的文件系统。我没有看到您向response对象发送任何字节,因此浏览器中没有显示任何内容。

您声称iText"在servlet中不起作用",但这是不正确的:如果没有抛出异常,则会在服务器端的工作目录中创建一个名为"test.pdf"的文件。这不是很聪明,因为使用你的servlet的人越多,服务器上保存的PDF就越多。你可能不想这样。您可能希望在内存中创建 PDF,并将 PDF 字节提供给浏览器。

对您的问题的简短回答是,您应该将 PDF 写入response对象的OutputStream而不是FileOutputStream

public class Hello extends HttpServlet {
protected void doGet(HttpServletRequest request, HttpServletResponse response)
throws ServletException, IOException {
response.setContentType("application/pdf");
try {
// step 1
Document document = new Document();
// step 2
PdfWriter.getInstance(document, response.getOutputStream());
// step 3
document.open();
// step 4
document.add(new Paragraph("Hello World"));
document.add(new Paragraph(new Date().toString()));
// step 5
document.close();
} catch (DocumentException de) {
throw new IOException(de.getMessage());
}
}
}

但是,为了避免此方法的已知问题,您还应该阅读官方文档。搜索关键字"servlet",你会发现这些FAQ条目:

  • 如何在不将文件存储在服务器端的情况下向浏览器提供 PDF?(文本 5)
  • 如何在不将文件存储在服务器端的情况下向浏览器提供 PDF?(文本 7)

由于您是iText的新手,因此您选择使用iText 5而不是较新的iText 7是令人惊讶的。 iText 7与iText 5不兼容;它是对库的完全重写。我建议您使用 iText 7,因为我们已经停止了 iText 5 上的积极开发。

更新:

称为"文档没有页面"的错误表示您正在尝试创建没有任何内容的文档。

取代:

String content = request.getParameter("aa");
Paragraph paragraph = new Paragraph(content);
document.add(paragraph);

跟:

document.add(new Paragraph("Hello"));

我的猜测是获取参数时出了问题"aa",导致没有内容添加到文档中。

最新更新