0

スタックトレースを含むコードは次のとおりです:https ://gist.github.com/2649430

2つのJavaクラスがあります。1つは複数のPDFをマージし、結果のマージされたPDFのバイト配列を返すことです。もう1つは、結果の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に感謝します。ここからiTextzipをダウンロードして、プロジェクトに入れました。それは私にこれらの瓶を提供するだけです: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

ビンゴ!

@Zhangerと@mprabhatに感謝します、それはすべて愚かなRUNTIMEパスです。WEB-INF/libそこで、プロジェクトにiTextjarを配置することでこれを解決しました。今すぐ動作します!

于 2012-05-10T00:33:30.943 に答える
1

あなたのコードでは、スタックトレースは自明です

InputStream is = new ByteArrayInputStream(PDF);

doGet実装の一部として、byte[] PDF渡されている間は初期化されていないため、null であるため NPE です。

于 2012-05-09T23:03:48.843 に答える
1

真実が述べたように、mergePDF()呼び出されることはないように見えるので、おそらく静的初期化子に配置する必要があります(この方法では、GETリクエストが行われるたびに呼び出されるのではなく、1回だけ呼び出され、効率/ページの読み込み時間が増加します)

static {
     mergePDF();
}

HttpServlet

あなたの他の問題については、必要な依存関係が見つからないようです。おそらく、.jar が適切な場所/ディレクトリにあることを確認してください。

于 2012-05-09T23:09:06.613 に答える