You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.05.28 06:21:44