gpt4 book ai didi

java - 在 servlet 上提供合并的 pdf(以 byte[] 形式)

转载 作者:行者123 更新时间:2023-12-02 00:23:18 24 4
gpt4 key购买 nike

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

我有 2 个 Java 类(class)。一种是合并多个 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();

}
}

仍然没有解决问题:

root causejava.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 causejava.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,我从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 写入文件而不是将其存储为字节数组,一切都会正常...

最佳答案

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

InputStream is = new ByteArrayInputStream(PDF);

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

关于java - 在 servlet 上提供合并的 pdf(以 byte[] 形式),我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/10525170/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com