讲师中心 微信公众号
AI工具推荐 视频效率加速

如何将PDF表格精准转换为Excel(含列对齐与空单元格保留)

落瑶小哥_4919

落瑶小哥_4919

发布时间:2026-01-19 21:23:12

|

976人浏览过

|

来源于php中文网

原创

如何将PDF表格精准转换为Excel(含列对齐与空单元格保留)

本文介绍如何基于pdfbox等专业库,准确提取pdf中的表格结构并导出为excel文件,解决传统文本提取导致的列错位、空列丢失等问题。

将PDF(尤其是带格式的表格型PDF)直接转为CSV或Excel,绝非简单的换行符分割或空格替换——正如您在代码中所见,PdfTextExtractor.getTextFromPage() 仅返回线性文本流,完全丢失了原始PDF中由坐标、字体、间距定义的二维表格结构。因此,"name | some data | | some data 1" 在纯文本解析后坍缩为 "name some data some data 1",中间空列彻底消失。

要真正还原表格语义,关键在于基于坐标的空间分析(Spatial Analysis):通过获取每个文本片段(Text Chunk)的精确边界框(Rectangle2D 或 PDRectangle),按水平位置聚类列,再按垂直顺序组织行。

推荐使用 Apache PDFBox + Tabula-java(底层依赖PDFBox) 或 PDFBox 自定义表格检测器。以下以 PDFBox 2.0+ 为例,展示一个轻量但可靠的列感知提取方案:

One-click installation of GitHub projects
One-click installation of GitHub projects

GInstall OneClick — 一键安装 GitHub 项目:规划、克隆、安装 Node 依赖、运行开发脚本。适用于想要获取 GitHubNode.js 项目的用户。

下载
import org.apache.pdfbox.pdmodel.PDDocument;
import org.apache.pdfbox.text.PDFTextStripperByArea;
import org.apache.pdfbox.text.TextPosition;
import org.apache.pdfbox.pdmodel.common.PDRectangle;
import org.apache.poi.ss.usermodel.*;
import org.apache.poi.xssf.usermodel.XSSFWorkbook;

import java.io.File;
import java.io.FileOutputStream;
import java.util.*;

public class PdfTableToExcel {
    public static void convertToExcel(String pdfPath, String excelPath) throws Exception {
        try (PDDocument doc = PDDocument.load(new File(pdfPath));
             Workbook workbook = new XSSFWorkbook();
             FileOutputStream fos = new FileOutputStream(excelPath)) {

            Sheet sheet = workbook.createSheet("TableData");
            int rowNum = 0;

            // 假设第1页含表格(实际中需动态检测表格区域)
            PDRectangle pageSize = doc.getPage(0).getPageSize();
            float pageWidth = pageSize.getWidth();

            // 【关键】手动定义列边界(单位:点,1/72英寸)——可先用Foxit Reader或PDFBox Debugger测量
            // 示例:4列,x坐标分别为 [50, 180, 320, 460],宽度覆盖至下一列前
            float[] colXs = {50f, 180f, 320f, 460f};
            int colCount = colXs.length;

            // 使用PDFTextStripperByArea按区域提取文本
            PDFTextStripperByArea stripper = new PDFTextStripperByArea();
            stripper.setSortByPosition(true);

            for (int i = 0; i < colCount; i++) {
                float x = colXs[i];
                float width = (i == colCount - 1) ? pageWidth - x : colXs[i + 1] - x;
                Rectangle2D.Float rect = new Rectangle2D.Float(x, 50, width, pageSize.getHeight() - 100);
                stripper.addRegion("col" + i, rect);
            }

            List<String[]> rows = new ArrayList<>();
            String pageText = new PDFTextStripper().getText(doc);
            // 更优做法:遍历每行文本,用TextPosition逐字定位 → 但此处为简化,采用区域提取+按行切分

            // 实际项目中建议使用 tabula-java(封装了成熟表格检测算法):
            // https://github.com/tabulapdf/tabula-java
            // Command line: java -jar tabula.jar -r -o output.csv example.pdf
            // Java API: com.github.tabula.TableExtractor

            // 此处演示写入Excel(保留空列)
            Row headerRow = sheet.createRow(rowNum++);
            for (int i = 0; i < colCount; i++) {
                Cell cell = headerRow.createCell(i);
                cell.setCellValue("Column " + (i + 1));
            }

            // 模拟提取的带空列数据(真实逻辑需根据坐标填充)
            List<String[]> rawData = Arrays.asList(
                new String[]{"Alice", "Math", "", "95"},
                new String[]{"Bob", "", "Physics", "87"},
                new String[]{"Charlie", "Chemistry", "", "92"}
            );

            for (String[] row : rawData) {
                Row excelRow = sheet.createRow(rowNum++);
                for (int i = 0; i < Math.min(colCount, row.length); i++) {
                    Cell cell = excelRow.createCell(i);
                    cell.setCellValue(row[i] != null ? row[i].trim() : "");
                }
            }

            workbook.write(fos);
        }
    }
}

⚠️ 重要注意事项:

  • 列边界需校准:首次使用务必用 PDF 阅读器(如 Foxit Reader 的“测量工具”)获取真实坐标,PDFBox 坐标系原点在左下角,y轴向上增长;
  • 避免硬编码:生产环境应实现自动列检测——扫描首几行文本块的x坐标分布,用K-means或阈值聚类识别列分隔线;
  • 优先选用 Tabula-java:它内置了启发式表格线检测与文本对齐算法,对扫描件/线框表支持更佳,且提供稳定Java API;
  • 字体与旋转:若PDF含旋转文本或非标准字体,需启用 setShouldSeparateByBeads(false) 并处理 TextPosition.getDir();
  • 合并单元格:PDF中跨列/跨行单元格需额外解析 PDPageContentStream 绘图指令,普通文本提取无法还原,此时建议结合 Apache POI 的 CellRangeAddress 手动设置。

总结:PDF转Excel的本质是从布局还原语义。放弃纯正则/换行分割思维,拥抱坐标驱动的表格重建逻辑,才能真正保留原始PDF的列结构与空单元格——这是专业文档自动化不可绕过的一步。

相关文章

极轻PDF
极轻PDF

专业的在线PDF工具,支持PDF编辑、转换、合并、压缩等多种功能,操作简单,处理高效,满足日常办公与学习中的PDF处理需求。

下载

本站声明:本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系admin@php.cn

热门AI工具

更多
DeepSeek

DeepSeek是一款面向对话、写作、编程和推理场景的AI大模型工具。

VibeKnow
VibeKnow Hot

一款AI视频创作工具,主要用于全球首个AI知识视频创作平台,文档、文章、网页,一键生成视频,适合需要提升相关任务效率的用户。

豆包大模型

豆包大模型是一款由字节跳动推出的企业级大语言模型服务平台。

火山引擎

火山引擎是一款面向企业的云计算与AI服务平台。

WorkBuddy

一款AI办公效率工具,主要用于腾讯云推出的AI原生桌面智能体工作台,适合需要提升相关任务效率的用户。

讯飞绘文

讯飞绘文是一款由科大讯飞推出的一站式 AIGC 内容运营平台。

UpDream
UpDream Hot

一款AI视频创作工具,主要用于哔哩哔哩推出的自研AI视频创作工具,适合需要提升相关任务效率的用户。

超级简历WonderCV

一款AI办公效率工具,主要用于免费求职简历模版下载制作,应届生职场人必备简历制作神器,适合需要提升相关任务效率的用户。

切问学术

切问学术是一款AI论文写作工具,复旦大学NLP团队推出的AI学术智能体。

相关专题

更多
页面置换算法
页面置换算法

页面置换算法是操作系统中用来决定在内存中哪些页面应该被换出以便为新的页面提供空间的算法。本专题为大家提供页面置换算法的相关文章,大家可以免费体验。

6076

2023.08.14

PHP 命令行脚本与自动化任务开发
PHP 命令行脚本与自动化任务开发

本专题系统讲解 PHP 在命令行环境(CLI)下的开发与应用,内容涵盖 PHP CLI 基础、参数解析、文件与目录操作、日志输出、异常处理,以及与 Linux 定时任务(Cron)的结合使用。通过实战示例,帮助开发者掌握使用 PHP 构建 自动化脚本、批处理工具与后台任务程序 的能力。

486

2025.12.13

Figma AI自动化智能数据填充与交互生成实战
Figma AI自动化智能数据填充与交互生成实战

告别机械重复,详细演示如何用 AI 填充业务真实数据,并自动为页面添加交互连线,将静态设计稿快速转变为动态原型。

325

2026.05.13

excel对比两列数据异同
excel对比两列数据异同

Excel作为数据的小型载体,在日常工作中经常会遇到需要核对两列数据的情况,本专题为大家提供excel对比两列数据异同相关的文章,大家可以免费体验。

5421

2023.07.25

excel重复项筛选标色
excel重复项筛选标色

excel的重复项筛选标色功能使我们能够快速找到和处理数据中的重复值。本专题为大家提供excel重复项筛选标色的相关的文章、下载、课程内容,供大家免费下载体验。

3376

2023.07.31

excel复制表格怎么复制出来和原来一样大
excel复制表格怎么复制出来和原来一样大

本专题为大家带来excel复制表格怎么复制出来和原来一样大相关文章,帮助大家解决问题。

3160

2023.08.02

excel表格斜线一分为二
excel表格斜线一分为二

在Excel表格中,我们可以使用斜线将单元格一分为二。本专题为大家带来excel表格斜线一分为二怎么弄的相关文章,希望可以帮到大家。

1444

2023.08.02

excel斜线表头一分为二
excel斜线表头一分为二

excel斜线表头一分为二的方法有使用合并单元格功能方法、使用文本框功能方法、使用自定义格式方法。本专题为大家提供excel斜线表头一分为二相关的各种文章、以及下载和课程。

717

2023.08.02

Gradle插件开发入门教程
Gradle插件开发入门教程

本专题介绍Gradle插件开发的基本流程,涵盖插件类编写、自定义任务注册、扩展参数设计和插件应用方法,帮助你理解插件如何组织构建逻辑,减少多个项目之间的重复配置。

0

2026.10.22

热门下载

更多
网站特效
/
网站源码
/
网站素材
/
前端模板

精品课程

更多
相关推荐
/
热门推荐
/
最新课程
Excel 教程
Excel 教程

共162课时 | 44.6万人学习

成为PHP架构师-自制PHP框架
成为PHP架构师-自制PHP框架

共28课时 | 3.6万人学习

关于我们 免责申明 举报中心 意见反馈 讲师合作 广告合作 最新更新
php中文网:公益在线php培训,帮助PHP学习者快速成长!
关注服务号
PHP中文网订阅号
每天精选资源文章推送

Copyright 2014-2026 https://www.php.cn/ All Rights Reserved | php.cn