Java 使用servlet编写pdf文件(模板)
所以我刚刚听说了名为iText的API,我对它的用法并不十分熟悉 所以我现在的问题是我想在现有的pdf文件(模板)上写下jsp表单中提供的信息。 我尝试了一些在互联网上找到的代码,它可以正常工作,但不能在servlet上运行。 谢谢 编辑这里是我找到并试图放入servlet的代码Java 使用servlet编写pdf文件(模板),java,servlets,jakarta-ee,itext,Java,Servlets,Jakarta Ee,Itext,所以我刚刚听说了名为iText的API,我对它的用法并不十分熟悉 所以我现在的问题是我想在现有的pdf文件(模板)上写下jsp表单中提供的信息。 我尝试了一些在互联网上找到的代码,它可以正常工作,但不能在servlet上运行。 谢谢 编辑这里是我找到并试图放入servlet的代码 protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOExc
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"))
这意味着您正在向服务器上的文件系统写入文件。我看不到您向响应
对象发送任何字节,因此浏览器中没有显示任何内容
您声称iText“在servlet中不起作用”,但这是不正确的:如果没有引发异常,则会在服务器端的工作目录中创建一个名为“test.pdf”的文件。这不是很聪明,因为使用servlet的人越多,服务器上保存的PDF就越多。你可能不想那样。您可能希望在内存中创建PDF,并将PDF字节提供给浏览器
您的问题的简短答案是,您应该将PDF写入响应
对象的输出流
,而不是文件输出流
:
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”,您将找到以下常见问题解答条目:
- (正文5)
- (文本7)
String content = request.getParameter("aa");
Paragraph paragraph = new Paragraph(content);
document.add(paragraph);
与:
我的猜测是,在获取参数“aa”时出错,导致没有向文档添加任何内容。我查看了您的servlet,发现:
new FileOutputStream(new File("test.pdf"))
这意味着您正在向服务器上的文件系统写入文件。我看不到您向响应
对象发送任何字节,因此浏览器中没有显示任何内容
您声称iText“在servlet中不起作用”,但这是不正确的:如果没有引发异常,则会在服务器端的工作目录中创建一个名为“test.pdf”的文件。这不是很聪明,因为使用servlet的人越多,服务器上保存的PDF就越多。你可能不想那样。您可能希望在内存中创建PDF,并将PDF字节提供给浏览器
您的问题的简短答案是,您应该将PDF写入响应
对象的输出流
,而不是文件输出流
:
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”,您将找到以下常见问题解答条目:
- (正文5)
- (文本7)
String content = request.getParameter("aa");
Paragraph paragraph = new Paragraph(content);
document.add(paragraph);
与:
我的猜测是,在获取参数“aa”时出错,导致文档中没有添加任何内容。您可以分享您尝试的内容吗?我尝试了一些在internet上找到的代码-告诉我们您在哪里找到的代码,以便我们也可以尝试。我相应地更新了我的帖子。您的意思是它在servlet上不起作用?任何异常,您是否将lib jar添加到类路径中?有可能PDF文件实际上是创建的,但在其他地方(不是您期望的地方),如果从servlet调用,您认为
新文件(“test.PDF”)
将在哪里创建?哦,是的,我很糟糕,我忘了提到我得到了“HTTP 500-文档没有页面”即使文件存在。你能分享你的尝试吗?我尝试了一些在互联网上找到的代码-告诉我们你在哪里找到的代码,这样我们也可以尝试。我相应地更新了我的帖子。你说它在servlet上不起作用是什么意思?任何异常,您是否将lib jar添加到类路径中?有可能PDF文件实际上是创建的,但是在其他地方(不是你期望的地方),如果从servlet调用,你认为新文件(“test.PDF”)
将在哪里创建?哦,是的,我很糟糕,我忘了提到我得到了“HTTP 500-文档没有页面”。即使文件存在。嗨,谢谢你的广泛回复:D我尝试了你提到的内容,效果很好,非常感谢。嗨,谢谢你的广泛回复:D我尝试了你提到的内容,效果很好,非常感谢。