iText 5.1.3 PDF生成在Web应用中报500错误排查请求
排查iText 5.1.3在Web环境生成PDF报500错误的问题
先梳理下你的核心问题:本地通过main方法运行能正常生成PDF,但在Web应用中调用相同逻辑时,前端抛出HTTP 500错误(提示Dispatch[/Invoice] to method funcName returned an exception),而且控制台没有异常输出。结合你提供的代码,我整理了几个关键排查方向:
1. 优先检查文件路径与权限问题
你代码里使用了相对路径DEST = "results/tables/simple_table.pdf",这个路径在Web应用中的指向和本地main方法完全不同:
- 本地运行时,路径是相对于你的项目根目录;
- Web环境中,路径是相对于应用服务器的工作目录(比如Tomcat的
bin目录),大概率这个目录不存在或者没有写入权限,导致IO异常,但可能被上层框架吞掉了。
解决建议:
- 不要生成到本地文件,Web场景下直接把PDF写入到
HttpServletResponse的输出流(这才是下载的正确姿势); - 如果必须存本地,使用绝对路径,或者通过
ServletContext.getRealPath("/")获取Web应用的根目录来构建路径。
2. 强制捕获并打印异常
Web框架(比如Struts、Spring MVC)可能会捕获异常但不在控制台打印,而是记录到服务器日志文件里。你需要手动在PDF生成方法里添加异常捕获,强制输出堆栈信息:
public void generateInvPDF() { try { // 你的原有生成逻辑 createPdf(DEST); } catch (Exception e) { // 强制打印到控制台 e.printStackTrace(); // 把异常包装后抛出,让框架能正确捕获并记录 throw new RuntimeException("生成PDF失败,请检查日志", e); } }
同时去查看Web服务器的日志文件(比如Tomcat的logs/catalina.out),那里大概率会有完整的异常堆栈。
3. 排查依赖冲突与类加载问题
Web应用中很容易出现依赖冲突,比如其他jar包包含了不同版本的iText类,导致类加载异常。
- 检查你的
WEB-INF/lib目录,确保只有iText 5.1.3的相关jar包; - 确认
IlexReportPDFConstants、PDFUtils这些自定义类都在Web应用的类路径下,没有缺失。
4. 修正Web场景下的响应流处理
你现在的代码是生成到本地文件,Web下载需要直接输出到浏览器,示例代码如下(假设是在Servlet或Controller中调用):
public void handlePDFDownload(HttpServletResponse response) throws IOException, DocumentException { // 设置响应头,告诉浏览器这是PDF文件 response.setContentType("application/pdf"); response.setHeader("Content-Disposition", "attachment; filename=\"invoice.pdf\""); Document document = new Document(PageSize.A4.rotate(), IlexReportPDFConstants.PAGE_LEFT_MARGIN, IlexReportPDFConstants.PAGE_TOP_MARGIN, IlexReportPDFConstants.PAGE_RIGHT_MARGIN, IlexReportPDFConstants.PAGE_BOTTOM_MARGIN); // 直接写入响应输出流,不需要本地文件 PdfWriter.getInstance(document, response.getOutputStream()); document.open(); PdfPTable table = new PdfPTable(76); table = populateHeader(table); for (int aw = 0; aw < 150 * 76; aw++) { table.addCell(getNormalCell("Some Text Here", 1.5f)); } table.setTotalWidth(800f); table.setLockedWidth(true); document.add(table); document.close(); response.getOutputStream().flush(); }
附你提供的完整代码(格式化后)
import com.ilex.invoice.reporting.common.IlexReportPDFConstants; import com.ilex.report.pdf.helper.PDFUtils; import com.itextpdf.text.BaseColor; import com.itextpdf.text.Chunk; import com.itextpdf.text.Document; import com.itextpdf.text.DocumentException; import com.itextpdf.text.Font; import com.itextpdf.text.PageSize; import com.itextpdf.text.Phrase; import com.itextpdf.text.html.WebColors; import com.itextpdf.text.pdf.PdfPCell; import com.itextpdf.text.pdf.PdfPTable; import com.itextpdf.text.pdf.PdfWriter; import java.io.File; import java.io.FileInputStream; import java.io.FileOutputStream; import java.io.IOException; import java.io.InputStream; import java.io.OutputStream; import org.apache.commons.io.IOUtils; public class SimpleTable { public static final String DEST = "results/tables/simple_table.pdf"; public static void main(String[] args) throws IOException, DocumentException, Exception { File file = new File(DEST); file.getParentFile().mkdirs(); new SimpleTable().createPdf(DEST); new SimpleTable().generateInvPDF(); } public void createPdf(String dest) throws IOException, DocumentException, Exception { Document document = new Document(PageSize.A4.rotate(), IlexReportPDFConstants.PAGE_LEFT_MARGIN, IlexReportPDFConstants.PAGE_TOP_MARGIN, IlexReportPDFConstants.PAGE_RIGHT_MARGIN, IlexReportPDFConstants.PAGE_BOTTOM_MARGIN); PdfWriter.getInstance(document, new FileOutputStream(dest)); document.open(); PdfPTable table = new PdfPTable(76); table = populateHeader(table); for (int aw = 0; aw < 150 * 76; aw++) { table.addCell(getNormalCell("Some Text Here", 1.5f)); } table.setTotalWidth(800f); table.setLockedWidth(true); document.add(table); document.close(); } public static PdfPCell getNormalCell(String string, float size) throws DocumentException, IOException { if (string != null && "".equals(string)) { return new PdfPCell(); } Font f = new Font(); f.setColor(BaseColor.BLACK); f.setSize(size); f.setStyle("normal"); PdfPCell cell = new PdfPCell(new Phrase(string, f)); cell.setNoWrap(false); cell.setBorderWidth(0.1f); return cell; } public static PdfPCell getHeaderCell(String string, float size) throws DocumentException, IOException { Font f = new Font(); f.setSize(size); PdfPCell cell = new PdfPCell(new Phrase(string, f)); cell.setNoWrap(false); BaseColor myColor = WebColors.getRGBColor("#D3D3D3"); cell.setBackgroundColor(myColor); cell.setBorderWidth(0.1f); return cell; } PdfPTable populateHeader(PdfPTable table) throws Exception { table.addCell(getHeaderCell("Invoice #", 1.8f)); table.addCell(getHeaderCell("Approved Date", 1.8f)); table.addCell(getHeaderCell("PO#", 1.8f)); table.addCell(getHeaderCell("Partner", 1.8f)); table.addCell(getHeaderCell("Category", 1.8f)); table.addCell(getHeaderCell("Comcast Vendor ID", 1.8f)); table.addCell(getHeaderCell("Comcast Site Code", 1.8f)); table.addCell(getHeaderCell("Authorized", 1.8f)); table.addCell(getHeaderCell("Invoiced", 1.8f)); table.addCell(getHeaderCell("Approved", 1.8f)); table.addCell(getHeaderCell("Customer", 1.8f)); table.addCell(getHeaderCell("Project", 1.8f)); table.addCell(getHeaderCell("Job", 1.8f)); table.addCell(getHeaderCell("Site", 1.8f)); table.addCell(getHeaderCell("Job Complete", 1.8f)); table.addCell(getHeaderCell("First onsite", 1.8f)); table.addCell(getHeaderCell("Last offsite", 1.8f)); table.addCell(getHeaderCell("PO Complete", 1.8f)); table.addCell(getHeaderCell("PM", 1.8f)); table.addCell(getHeaderCell("Owner", 1.8f)); table.addCell(getHeaderCell("Partner / Invoice", 1.8f)); table.addCell(getHeaderCell("Dup Inv check", 1.8f)); table.addCell(getHeaderCell("Dup PO Number", 1.8f)); table.addCell(getHeaderCell("Layout code", 1.8f)); table.addCell(getHeaderCell("Source Name", 1.8f)); table.addCell(getHeaderCell("Invoice Type", 1.8f)); table.addCell(getHeaderCell("operating Unit", 1.8f)); table.addCell(getHeaderCell("Vendor Number", 1.8f)); table.addCell(getHeaderCell("Vendor Site Code", 1.8f)); table.addCell(getHeaderCell("Invoice Num", 1.8f)); table.addCell(getHeaderCell("Invoice Date", 1.8f)); table.addCell(getHeaderCell("Currency Code", 1.8f)); table.addCell(getHeaderCell("Invoice Amount", 1.8f)); table.addCell(getHeaderCell("Invoice H Desc", 1.8f)); table.addCell(getHeaderCell("Pay Group", 1.8f)); table.addCell(getHeaderCell("Invoice Line Type", 1.8f)); table.addCell(getHeaderCell("Invoice Line Number", 1.8f)); table.addCell(getHeaderCell("Inv L Descri...")); // 注:原代码此处截断,需补充完整逻辑 return table; } }
内容的提问来源于stack exchange,提问作者NoNaMe
相关产品推荐
相关产品推荐

