如何用iText v5.0.6将TXT文件内容转为指定PDF表格格式?
如何用iText v5.0.6将TXT内容转换为PDF表格格式
你的问题核心在于当前代码是把所有文本内容当成纯文本块(Paragraph)添加到PDF里,自然没法实现结构化的表格。要解决这个问题,我们需要用iText v5的PdfPTable和PdfPCell组件,先解析TXT里的每行数据,再把它们结构化到表格中。
关键思路
- 识别TXT中的表格结构:你的TXT每行前10位是前缀,后面是表格内容,还有
HEAD开头的表头行、下划线开头的分隔线。我们需要区分这些行,分别处理表头和数据行。 - 用
PdfPTable构建表格:根据TXT里的列固定宽度,定义表格的列数和列宽,然后把每行内容拆分成单元格,逐个添加到表格中。 - 替换原有的纯文本添加逻辑:把原来攒
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
相关产品推荐
相关产品推荐

