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

如何用iText v5.0.6将TXT文件内容转为指定PDF表格格式?

如何用iText v5.0.6将TXT内容转换为PDF表格格式

你的问题核心在于当前代码是把所有文本内容当成纯文本块(Paragraph)添加到PDF里,自然没法实现结构化的表格。要解决这个问题,我们需要用iText v5的PdfPTable和PdfPCell组件,先解析TXT里的每行数据,再把它们结构化到表格中。

关键思路

  1. 识别TXT中的表格结构:你的TXT每行前10位是前缀,后面是表格内容,还有HEAD开头的表头行、下划线开头的分隔线。我们需要区分这些行,分别处理表头和数据行。
  2. 用PdfPTable构建表格:根据TXT里的列固定宽度,定义表格的列数和列宽,然后把每行内容拆分成单元格,逐个添加到表格中。
  3. 替换原有的纯文本添加逻辑:把原来攒buffer然后加Paragraph的逻辑,改成逐行构建表格,最后把表格添加到文档。

修改后的核心代码示例

首先,我们需要调整数据解析和表格构建的逻辑,替换你原来的循环部分:

RowIterator ri = new RowIterator(myData);
PdfPTable currentTable = null;
int pageNum = 1;
final int COLUMN_COUNT = 5; // 根据你的TXT实际列数调整
final float[] COLUMN_WIDTHS = {40f, 60f, 80f, 100f, 120f}; // 对应TXT里的固定列宽

// 初始化文档部分保持你原来的代码
Document document = new Document(PageSize.A4, 20f, 10f, 100f, 0f);
PdfWriter writer = PdfWriter.getInstance(document, baosPDF);
// 保留你原来的页眉页脚、边框事件设置...
document.open();
Font titleFont = new Font(Font.FontFamily.COURIER, 4.6f, Font.NORMAL);
Font headerFont = new Font(Font.FontFamily.COURIER, 7, Font.BOLD);
Font pageDetailsFont = new Font(Font.FontFamily.COURIER, 7, Font.BOLD);

while (ri.hasNext()) {
    String line = ri.next();
    String prefix = line.substring(0, 10).trim();
    String content = line.substring(10);

    // 处理表头行:初始化新表格
    if (prefix.startsWith("HEAD")) {
        // 如果已有表格,先添加到文档再新建
        if (currentTable != null) {
            document.add(currentTable);
        }
        // 新建页面并添加页头信息
        document.newPage();
        document.add(new Paragraph("Page : " + pageNum, pageDetailsFont));
        document.add(new Paragraph("Country : " + country.toUpperCase(), pageDetailsFont));
        document.add(Chunk.NEWLINE);
        pageNum++;

        // 初始化表格
        currentTable = new PdfPTable(COLUMN_COUNT);
        currentTable.setWidths(COLUMN_WIDTHS);
        currentTable.setWidthPercentage(100); // 表格占满页面宽度

        // 拆分表头内容为单元格
        String[] headerCells = splitContentToCells(content);
        for (String cellText : headerCells) {
            PdfPCell cell = new PdfPCell(new Paragraph(cellText, headerFont));
            cell.setHorizontalAlignment(Element.ALIGN_CENTER);
            cell.setBackgroundColor(BaseColor.LIGHT_GRAY);
            currentTable.addCell(cell);
        }
    }
    // 跳过分隔线行(用表格边框替代视觉分隔)
    else if (content.startsWith("_")) {
        continue;
    }
    // 处理数据行:添加到当前表格
    else if (currentTable != null) {
        String[] dataCells = splitContentToCells(content);
        for (String cellText : dataCells) {
            PdfPCell cell = new PdfPCell(new Paragraph(cellText, titleFont));
            cell.setBorder(Rectangle.BOX); // 显示单元格边框
            currentTable.addCell(cell);
        }
    }
}

// 添加最后一个表格到文档
if (currentTable != null) {
    document.add(currentTable);
}

document.close();

辅助方法:拆分TXT内容为表格单元格

你需要根据TXT里的固定列位置,实现一个拆分内容的方法,比如:

private String[] splitContentToCells(String content) {
    // 这里的索引要严格对应你TXT文件里的列分隔位置
    String cell1 = content.substring(0, 15).trim();
    String cell2 = content.substring(15, 35).trim();
    String cell3 = content.substring(35, 60).trim();
    String cell4 = content.substring(60, 90).trim();
    String cell5 = content.substring(90).trim();
    return new String[]{cell1, cell2, cell3, cell4, cell5};
}

关键说明

  • 你需要根据实际TXT的列宽度调整COLUMN_COUNT和COLUMN_WIDTHS,以及splitContentToCells里的截取索引。
  • 原来的buffer、newPage等变量可以去掉,表格的分页会由iText自动处理,如果需要强制分页,可以在特定条件下调用document.newPage()。
  • 表格的边框、背景色可以根据需要调整,比如表头用灰色背景突出,数据行显示完整边框。

内容的提问来源于stack exchange,提问作者Am Novice

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.20 10:23:41