不能。PDF电子发票无法用pdf2xml或pdftotext直接提取合规XML,因其仅输出布局文本,不含语义结构;必须通过OCR+规则解析或调用税务API提取嵌入的InvoiceData XML,且生成XML须符合国税规范并完成数字签名验签。

PDF 里的电子发票能直接用 pdf2xml 或 pdftotext 提取结构化 XML 吗?
不能。普通 PDF 转换工具输出的是布局文本或简单 HTML,不含发票语义(如 InvoiceNo、BuyerTaxID、LineItem),更不会生成符合国家税务总局《电子发票公共服务平台接口规范》的 XML 结构。直接硬转只会得到乱序段落、错位表格、缺失签名字段。
真正可用的路径只有两条:OCR + 规则解析,或调用税务系统 API
国内合规电子发票(OFD/PDF 格式)本质是「带数字签名的结构化数据容器」,PDF 层只是渲染视图。关键信息实际藏在嵌入的 InvoiceData XML 流或 OFD 的 Document.xml 中。
- 如果是 OFD 格式:用
ofd-parser(Python)或libofd(C++)解包,直接读取/Doc_0/Document.xml内的原始 XML - 如果是 PDF 格式(含税务数字签名):必须用支持国密 SM2/SM3 的 SDK(如
esig-sdk-java)验证签名并提取嵌入的InvoiceXML字段,不是解析可视文本 - 若只有扫描件 PDF(无嵌入 XML):必须走 OCR(推荐
PaddleOCR+ 自定义发票模板定位),再按字段映射规则生成标准 XML,准确率依赖版式一致性
InvoiceXML 的字段命名和层级不能手写拼接
国家税务总局对 XML 的根节点、命名空间、必填字段(如 fpqqlsh、ghfmc)、校验规则(如 je 和 se 必须匹配)有强制要求。手动生成极易因大小写、空格、编码(必须 GB18030)、签名值缺失导致验签失败。
- 务必使用官方提供的
InvoiceXMLGenerator工具或开源库(如 GitHub 上的china-invoice-xml)生成 - 特别注意
qqrq(开票日期)格式必须为YYYYMMDD,fpdm(发票代码)必须为 12 位纯数字 - 所有金额字段需保留两位小数,且不能含千分位符;
xfdzjh(销售方地址电话)若为空,字段仍需保留但值设为(空标签),不可省略
别忽略数字签名和验签环节
生成的 XML 必须附带有效的税务数字签名才能被税局系统接受。签名不是加个 标签就行——它依赖原始 PDF 中的证书链、时间戳服务(TSA)和 SM3 摘要算法。
- 离线环境无法生成合法签名,必须调用税务 UKey 驱动或云签名服务(如百旺、航信的
SignService接口) - 常见错误:
Signature verification failed: invalid digest多因 XML 序列化时缩进/换行/编码不一致导致摘要值变化 - 测试阶段可用总局提供的
InvoiceXMLValidator工具本地验签,但上线前必须走真实环境沙箱验证










