次のサーブレットを使用して、動的なPDFファイルを生成しようとしています。
import Java.io.*;
import javax.servlet.ServletException;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
// Document Object
import com.itextpdf.text.Document;
//For adding content into PDF document
import com.itextpdf.text.Paragraph;
import com.itextpdf.text.pdf.PdfWriter;
import com.itextpdf.text.DocumentException;
public class CreatePDFExample extends HttpServlet {
//invoked from doGet method to create PDF through servlet
protected void processRequest(HttpServletRequest request, HttpServletResponse response)
throws ServletException, IOException {
//Set content type to application / pdf
//browser will open the document only if this is set
response.setContentType("application/pdf");
//Get the output stream for writing PDF object
OutputStream out=response.getOutputStream();
try {
Document document = new Document();
/* Basic PDF Creation inside servlet */
PdfWriter.getInstance(document, out);
document.open();
document.add(new Paragraph("Tutorial to Generate PDF using Servlet"));
document.add(new Paragraph("PDF Created Using Servlet, iText Example Works"));
document.close();
}
catch (DocumentException exc){
throw new IOException(exc.getMessage());
}
finally {
out.close();
}
}
@Override
protected void doGet(HttpServletRequest request, HttpServletResponse response)
throws ServletException, IOException {
processRequest(request, response);
}
@Override
protected void doPost(HttpServletRequest request, HttpServletResponse response)
throws ServletException, IOException {
processRequest(request, response);
}
@Override
public String getServletInfo() {
return "This Servlet Generates PDF Using iText Library";
}
}
しかし、次のエラーが表示されます。
Error 500--Internal Server Error
Java.lang.NoClassDefFoundError: com/itextpdf/text/DocumentException
at CreatePDFExample.processRequest(CreatePDFExample.Java:24)
at CreatePDFExample.doPost(CreatePDFExample.Java:47)
at javax.servlet.http.HttpServlet.service(HttpServlet.Java:760)
at javax.servlet.http.HttpServlet.service(HttpServlet.Java:853)
at weblogic.servlet.internal.ServletStubImpl$ServletInvocationAction.run(ServletStubImpl.Java:1053)
at weblogic.servlet.internal.ServletStubImpl.invokeServlet(ServletStubImpl.Java:387)
at weblogic.servlet.internal.ServletStubImpl.invokeServlet(ServletStubImpl.Java:305)
at weblogic.servlet.internal.WebAppServletContext$ServletInvocationAction.run(WebAppServletContext.Java:6310)
at weblogic.security.acl.internal.AuthenticatedSubject.doAs(AuthenticatedSubject.Java:317)
at weblogic.security.service.SecurityManager.runAs(SecurityManager.Java:118)
at weblogic.servlet.internal.WebAppServletContext.invokeServlet(WebAppServletContext.Java:3622)
at weblogic.servlet.internal.ServletRequestImpl.execute(ServletRequestImpl.Java:2569)
at weblogic.kernel.ExecuteThread.execute(ExecuteThread.Java:197)
at weblogic.kernel.ExecuteThread.run(ExecuteThread.Java:170)
weblogic application server 8.1 ....を使用しています。iTextPDFを使用しています。そのため、jarファイルのCLASSPATHを設定しました。
CLASSPATH:
D:\itextpdf-5.3.4.jar;D:\servlet-2-3.jar;.;
PATH:
C:\Program Files (x86)\Java\jdk1.6.0_14\bin;.;
このエラーが発生する理由を教えてください????.
ありがとうございました
推奨事項を実行した後、次のエラーが表示されます
Error 500--Internal Server Error
Java.lang.ExceptionInInitializerError
at com.itextpdf.text.pdf.PdfWriter.(PdfWriter.Java:1403)
at CreatePDFExample.processRequest(CreatePDFExample.Java:26)
at CreatePDFExample.doPost(CreatePDFExample.Java:47)
at javax.servlet.http.HttpServlet.service(HttpServlet.Java:760)
at javax.servlet.http.HttpServlet.service(HttpServlet.Java:853)
at weblogic.servlet.internal.ServletStubImpl$ServletInvocationAction.run(ServletStubImpl.Java:1053)
at weblogic.servlet.internal.ServletStubImpl.invokeServlet(ServletStubImpl.Java:387)
at weblogic.servlet.internal.ServletStubImpl.invokeServlet(ServletStubImpl.Java:305)
at weblogic.servlet.internal.WebAppServletContext$ServletInvocationAction.run(WebAppServletContext.Java:6310)
at weblogic.security.acl.internal.AuthenticatedSubject.doAs(AuthenticatedSubject.Java:317)
at weblogic.security.service.SecurityManager.runAs(SecurityManager.Java:118)
at weblogic.servlet.internal.WebAppServletContext.invokeServlet(WebAppServletContext.Java:3622)
at weblogic.servlet.internal.ServletRequestImpl.execute(ServletRequestImpl.Java:2569)
at weblogic.kernel.ExecuteThread.execute(ExecuteThread.Java:197)
at weblogic.kernel.ExecuteThread.run(ExecuteThread.Java:170)
Caused by: Java.lang.NullPointerException
at Java.lang.Class.privateGetDeclaredFields(Class.Java:1488)
at Java.lang.Class.getDeclaredFields(Class.Java:1073)
前回の回答では、jarが欠落していることを伝えましたが、これは、iTextクラスの1つが見つからなかったことをエラーメッセージが明確に示しているため、悪い推測ではありませんでした。
残念ながら、そのエラーメッセージは誤解を招くものです。 Javaは、あいまいさがあればクラスを見つけることができないと言っています。これは、CLASSPATHに複数のiText jarがある場合です。
さらに別のiText jarをCLASSPATHに追加して、問題を悪化させました。これで、weblogicインスタンスのJVMで使用可能なiTextの2つの異なるバージョンが原因で問題が発生しました。
すべてのCLASSPATHを検索し、サーバーのCLASSPATHを忘れないでください。weblogicがPdfWriterクラスを検索する場所はD:\ itextpdf-5.3.4.jarだけではないことがわかります。残りが1つになるまで、CLASSPATHからすべてのiText jarを削除します。
システムのクラスパスではなく、Webアプリケーションのクラスパスに配置する必要があります。
サーバーが実行時に取得できるように、jarファイルをクラスパスに配置する最も簡単な方法は次のとおりです。
- 置く itextpdf-5.3.4.jar
内
YOUR_WEBAPP_ROOT --> WEB-INF --> lib
フォルダ
jarファイルがここに表示されるはずです
YOUR_WEBAPP_ROOT --> WEB-INF --> lib --> itextpdf-5.3.4.jar
ライブラリをWEB-INF/libフォルダー内の戦争に追加します。
私の場合、iText v.2.1.7は機能しましたが、運が悪くても5.5.3と5.5.4を試しました。
Primefaces V.5.0ユーザーガイド、p.12「依存関係」からの抜粋
「リストされたバージョン(itext 2.1.7、Apache poi 3.7)はテストされ、PrimeFacesで動作することがわかっています。これらの依存関係の他のバージョンも動作する可能性がありますが、テストされていません。」
私は同様の問題を抱えていました。あるシステムではpdf生成が正常に機能し、別のシステムではこの例外が発生していました。少し調べてみると、動作中のサーバーにはサイズ1105KBのitext-2.1.7.js6.jarがあり、動作していないサーバーには12Kbがあることがわかりました。 jarを小さなサイズのjarに交換すると、正常に機能し始めました。 2つの異なるサイズの同じバージョンのjarになった方法がわかりません。お役に立てれば