【问题标题】:serve merged pdf (in byte[]) on servlet在 servlet 上提供合并的 pdf(以字节 [] 为单位)
【发布时间】:2012-05-09 22:43:20
【问题描述】:

这是包含堆栈跟踪的代码: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)

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

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

更新:真实性指出没有调用 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)

UPDATE2

感谢@mprabhat 和@Zhanger,我从here 下载了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 写入文件而不是将其存储为字节数组,一切正常...

【问题讨论】:

  • fix 什么?解释您的问题并在此处发布最少的代码。目前你有一个wall of code
  • @KingsIndian 我已经更新了我的问题
  • 赔率是 mergePDF()doGet() 之前不会被调用,PDFnull
  • @trutheality OMG 你是对的

标签: java apache servlets


【解决方案1】:

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

InputStream is = new ByteArrayInputStream(PDF);

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

【讨论】:

  • 在您的 Web 应用程序 lib 文件夹中,itext.jar 不存在
  • 您以前使用过 iText 吗?你能看看我的UPDATE2吗?
  • sorry,我之前没用过iText,但是浏览repo好像确实有这个类,基本上就是说没找到,我看看有没有可以找到其他任何东西:(虽然,this 链接表明可能有额外的罐子(哦,哇哦,评论错误的答案)
  • @Zhanger 谢谢 :) 你说得对,它在 repo 中,但现在你告诉我我正在查看 zip 中的 jar 内容,它不存在!
  • 好吧,一种可能的解决方案是自己从源代码编译它,但您也应该提交某种报告,说明该类丢失 编辑:我只是自己查看了 jar,它似乎是那里!见here
【解决方案2】:

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

static {
     mergePDF();
}

HttpServlet.

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

【讨论】:

  • 感谢您的提示!实际上我从官方网站下载了 iText zip。我不知道为什么缺少一些依赖项
  • 正如 UPDATE2 所提到的,如果我将合并的 PDF 写入文件,那么一切正常......所以我确信必须满足所有依赖关系......直到现在
【解决方案3】:

宾果游戏!

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

【讨论】:

  • 在 Web 应用程序中,您需要的 jars 位于服务器路径中,或者它们应该位于 WEB-INF/lib 文件夹中,很高兴您发现它可以正常工作
  • 很高兴您找到了解决方法!我永远不会知道,我对 java web 应用程序没有任何经验 :(
猜你喜欢
  • 1970-01-01
  • 2017-07-25
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2017-04-27
  • 1970-01-01
相关资源
最近更新 更多