PDF转XML无统一标准,需先明确目标格式;pdf2xml可输出带坐标的块级XML,pdfplumber则适合自定义结构化XML生成。

PDF 本身不是结构化格式,直接“转成 XML”没有标准定义——你得先明确要什么 XML:是保留排版的 XML_PDF(如 PDF/A-3 的附属文件)、语义结构化的 DocBook 或 JATS,还是仅提取文本+基础标签(如 page/text 层级)的自定义 XML?工具和结果差异极大。
用 pdf2xml(PDFtoXML)提取带坐标的块级结构
这是最接近“PDF → 带位置信息的 XML”的成熟方案,底层基于 Poppler,输出类似 Adobe XML 的结构,含 page、text>、font、bbox 等字段。
- Linux/macOS 直接装:
sudo apt install poppler-utils(Ubuntu)或brew install poppler(macOS),然后运行pdftohtml -xml input.pdf output.xml - Windows 用户建议用预编译二进制(如
pdf2xml-win),避免编译 Poppler;注意默认输出是 HTML,必须加-xml参数,否则得不到 XML - 输出 XML 中的
bbox是 “x1 y1 x2 y2” 坐标,单位是 PDF 的 1/72 英寸,不是像素;若 PDF 有旋转或裁剪盒(CropBox),坐标可能偏移,需检查page节点的width/height - 不处理扫描件(图像型 PDF)——会输出空文本;需先 OCR,再用
tesseract输出hocr格式,它本身就是 XML
用 pdfplumber + Python 自定义生成 XML
当你要控制字段命名、合并逻辑(如把同一行的多个 text 对象拼成一个 line)、或注入业务标签时,pdfplumber 比命令行工具更灵活。
本文档主要讲述的是Android数据格式解析对象JSON用法;JSON可以将Java对象转成json格式的字符串,可以将json字符串转换成Java。比XML更轻量级,Json使用起来比较轻便和简单。JSON数据格式,在Android中被广泛运用于客户端和服务器通信,在网络数据传输与解析时非常方便。希望本文档会给有需要的朋友带来帮助;感兴趣的朋友可以过来看看
-
pip install pdfplumber后,用pdfplumber.open("file.pdf")加载,遍历pages,再对每页调用extract_words()或extract_table() - 关键点:PDF 中文字常被拆成单个字符或碎片,
extract_words()默认按空格合并,但中英文混排、表格内、斜体字容易断错;建议传参use_text_flow=True并调整x_tolerance/y_tolerance - 生成 XML 时别直接拼字符串,用
xml.etree.ElementTree构建,避免特殊字符(如&、)导致 XML 解析失败;对文本内容务必调用etree.SubElement(...).text = text.replace("&", "&").replace(" - 性能上,
pdfplumber解析 100 页 PDF 可能比pdftohtml -xml慢 3–5 倍,但可加page_numbers=[0,1]只处理前两页调试
PDF/A-3 里嵌入 XML 文件 ≠ 把 PDF 转成 XML
有人搜 “XML_PDF” 会误以为 PDF/A-3 支持“PDF 内置 XML”,其实它只是允许把任意 XML 文件作为附件嵌入(类似 ZIP 里塞个 XML),PDF 主体仍是不可编辑的流。这不是转换,是打包。
- 用
qpdf可附加文件:qpdf --attach-file data.xml --attached-filename metadata.xml input.pdf output.pdf - Adobe Acrobat 手动操作路径:文件 → 属性 → 附加文档 → 添加;但嵌入后无法通过常规 PDF 解析器读取该 XML,需用支持 PDF/A-3 附件的库(如
pypdf的reader.attachments)单独提取 - 这种做法适合存证场景(如发票 PDF + 结构化 XML 元数据),但不能用于从 PDF 提取内容——嵌入的 XML 是你事先准备好的,不是从 PDF 文字生成的
真正难的不是生成 XML 标签,而是让 XML 里的层级、顺序、归属关系符合业务预期。比如表格跨页、脚注连字符、多栏文本,所有工具都会出错。先用小样例 PDF 跑通流程,再看输出 XML 是否能被下游系统(比如 XSLT 处理器或解析脚本)稳定消费,比追求“一键全自动”更重要。









