Java 使用servlet编写pdf文件(模板)

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

所以我刚刚听说了名为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"))
这意味着您正在向服务器上的文件系统写入文件。我看不到您向
响应
对象发送任何字节,因此浏览器中没有显示任何内容

您声称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)
由于您是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);
与:


我的猜测是,在获取参数“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)
由于您是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);
与:


我的猜测是,在获取参数“aa”时出错,导致文档中没有添加任何内容。

您可以分享您尝试的内容吗?我尝试了一些在internet上找到的代码-告诉我们您在哪里找到的代码,以便我们也可以尝试。我相应地更新了我的帖子。您的意思是它在servlet上不起作用?任何异常,您是否将lib jar添加到类路径中?有可能PDF文件实际上是创建的,但在其他地方(不是您期望的地方),如果从servlet调用,您认为
新文件(“test.PDF”)
将在哪里创建?哦,是的,我很糟糕,我忘了提到我得到了“HTTP 500-文档没有页面”即使文件存在。你能分享你的尝试吗?我尝试了一些在互联网上找到的代码-告诉我们你在哪里找到的代码,这样我们也可以尝试。我相应地更新了我的帖子。你说它在servlet上不起作用是什么意思?任何异常,您是否将lib jar添加到类路径中?有可能PDF文件实际上是创建的,但是在其他地方(不是你期望的地方),如果从servlet调用,你认为
新文件(“test.PDF”)
将在哪里创建?哦,是的,我很糟糕,我忘了提到我得到了“HTTP 500-文档没有页面”。即使文件存在。嗨,谢谢你的广泛回复:D我尝试了你提到的内容,效果很好,非常感谢。嗨,谢谢你的广泛回复:D我尝试了你提到的内容,效果很好,非常感谢。