0

这是包含堆栈跟踪的代码:https ://gist.github.com/2649430

我有 2 个 java 类。一种是合并多个 PDF 并返回结果合并 PDF 的字节数组,然后另一种是在 servlet 上提供结果 PDF 字节数组。当我运行服务器时,我收到此错误:

java.lang.NullPointerException at java.io.ByteArrayInputStream.<init>(ByteArrayInputStream.java:106) at testPackage.TestServlet.doGet(TestServlet.java:37) at javax.servlet.http.HttpServlet.service(HttpServlet.java:621) at javax.servlet.http.HttpServlet.service(HttpServlet.java:722)

(完整的堆栈跟踪包含在 gist 链接中)

你能帮我弄清楚如何做到这一点吗?

更新:真实性指出没有调用 mergePDF() 。所以我更新了文件TestServlet.java:



    public class TestServlet extends HttpServlet {

    private static byte[] PDF;

    public static void mergePDF() {
        try {
            List pdfs = new ArrayList();
            pdfs.add(new FileInputStream("/test.pdf"));
            pdfs.add(new FileInputStream("/test2.pdf"));
            ByteArrayOutputStream output = new ByteArrayOutputStream();
            PDF = PDFMerger.concatPDFs(pdfs, output, true);
        } catch (Exception e) {
            e.printStackTrace();
        }
    }

    @Override
    public void doGet(HttpServletRequest request, HttpServletResponse response)
                    throws ServletException, IOException {
        mergePDF();
        InputStream is = new ByteArrayInputStream(PDF);

        // Set response headers
        response.setHeader("Expires", "0");
        response.setHeader("Cache-Control", "must-revalidate, post-check=0, pre-check=0");
        response.setHeader("Pragma", "public");
        response.setContentType("application/pdf");
        response.setContentLength(PDF.length);

        OutputStream os = response.getOutputStream();
        IOUtils.copy(is, os);

        os.flush();
        os.close();

    }
}

仍然没有解决问题:

根本原因

java.lang.NoClassDefFoundError: com/itextpdf/text/pdf/PdfTemplate
    testPackage.TestServlet.mergePDF(TestServlet.java:28)
    testPackage.TestServlet.doGet(TestServlet.java:37)
    javax.servlet.http.HttpServlet.service(HttpServlet.java:621)
    javax.servlet.http.HttpServlet.service(HttpServlet.java:722)

根本原因

java.lang.ClassNotFoundException:com.itextpdf.text.pdf.PdfTemplate
    org.apache.catalina.loader.WebappClassLoader.loadClass(WebappClassLoader.java:1676)
    org.apache.catalina.loader.WebappClassLoader.loadClass(WebappClassLoader.java:1521)
    testPackage.TestServlet.mergePDF(TestServlet.java:28)
    testPackage.TestServlet.doGet(TestServlet.java:37)
    javax.servlet.http.HttpServlet.service(HttpServlet.java:621)
    javax.servlet.http.HttpServlet.service(HttpServlet.java:722)

更新2

谢谢@mprabhat 和@Zhanger,我从这里下载了 iText zip并将其放入项目中。它只为我提供了这些罐子:itextpdf-5.2.1.jar, itextpdf-5.2.1-javadoc.jar, itextpdf-5.2.1-sources.jar, itextpdf-xtra-5.2.1.jar, itextpdf-xtra-5.2.1-javadoc.jar, itextpdf-xtra-5.2.1-sources.jar

你觉得合适吗?

奇怪的是,如果我将合并的 PDF 写入文件而不是将其存储为字节数组,一切正常......

4

3 回答 3

1

您的堆栈跟踪是不言自明的,在您的代码中

InputStream is = new ByteArrayInputStream(PDF);

作为doGet实现的一部分,当您传递byte[] PDF它时,它还没有被初始化,它的 null 因此是 NPE。

于 2012-05-09T23:03:48.843 回答
1

正如真实性所提到的,它似乎mergePDF()永远不会被调用,所以你可能应该将它放在一个静态初始化程序中(这样它就不会在每次发出 GET 请求时被调用,而只会被调用一次,从而提高效率/页面加载时间)

static {
     mergePDF();
}

HttpServlet.

至于您的其他问题,似乎找不到所需的依赖项。也许检查 .jars 是否在正确的位置/目录中?

于 2012-05-09T23:09:06.613 回答
1

答对了!

谢谢@Zhanger 和@mprabhat,这都是愚蠢的 RUNTIME 路径。所以我通过将 iText jars 放入WEB-INF/lib项目中解决了这个问题。现在工作!

于 2012-05-10T00:33:30.943 回答