在servlet上提供合并的pdf(在byte []中)

时间:2012-05-09 22:43:20

标签: java apache servlets

以下是包含堆栈跟踪的代码: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链接中)

你能帮我解决一下如何做到这一点吗?

UPDATE :trutheality指出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();

    }
}

仍然没有解决问题:

root cause

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)

root cause

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)

UPDATE2

谢谢@mprabhat和@Zhanger,我从here下载了iText zip并将其放入项目中。它只为我提供了这些jar: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写入文件而不是将其存储为字节数组,那么一切正常......

3 个答案:

答案 0 :(得分:1)

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

InputStream is = new ByteArrayInputStream(PDF);

作为doGet实现的一部分,当您传递byte[] PDF它尚未初始化时,它的空值因此是NPE。

答案 1 :(得分:1)

正如所提到的那样,似乎永远不会调用mergePDF(),所以你可能应该将它放在static initializer中(这样每次发出GET请求时都不会调用它,而是只有一次,提高效率/页面加载时间)

static {
     mergePDF();
}
HttpServlet中的

至于你的其他问题,似乎无法找到所需的依赖关系。也许检查.jars是否在正确的位置/目录?

答案 2 :(得分:1)

宾果!

谢谢@Zhanger和@mprabhat,这是所有愚蠢的RUNTIME路径。所以我通过将iText jar放在项目的WEB-INF/lib中来解决这个问题。现在就行!