电子发票格式PDF转XML_电子发票PDF转XML专用方案

12次阅读

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

电子发票格式PDF转XML_电子发票PDF转XML专用方案

PDF 里的电子发票能直接用 pdf2xmlpdftotext 提取结构化 XML 吗?

不能。普通 PDF 转换工具输出的是布局文本或简单 html,不含发票语义(如 InvoiceNoBuyerTaxIDLineItem),更不会生成符合国家税务总局《电子发票公共服务平台接口规范》的 XML 结构。直接硬转只会得到乱序段落、错位表格、缺失签名字段。

真正可用的路径只有两条:OCR + 规则解析,或调用税务系统 API

国内合规电子发票(OFD/PDF 格式)本质是「带数字签名的结构化数据容器」,PDF 层只是渲染视图。关键信息实际藏在嵌入的 InvoiceData XML 流或 OFD 的 Document.xml 中。

  • 如果是 OFD 格式:用 ofd-parserpython)或 libofdc++)解包,直接读取 /Doc_0/Document.xml 内的原始 XML
  • 如果是 PDF 格式(含税务数字签名):必须用支持国密 SM2/SM3 的 SDK(如 esig-sdk-java)验证签名并提取嵌入的 InvoiceXML 字段,不是解析可视文本
  • 若只有扫描件 PDF(无嵌入 XML):必须走 OCR(推荐 PaddleOCR + 自定义发票模板定位),再按字段映射规则生成标准 XML,准确率依赖版式一致性

InvoiceXML 的字段命名和层级不能手写拼接

国家税务总局对 XML 的根节点、命名空间、必填字段(如 fpqqlshghfmc)、校验规则(如 jese 必须匹配)有强制要求。手动生成极易因大小写、空格、编码(必须 GB18030)、签名值缺失导致验签失败。

  • 务必使用官方提供的 InvoiceXMLGenerator 工具或开源库(如 gitHub 上的 china-invoice-xml)生成
  • 特别注意 qqrq(开票日期)格式必须为 yyYYMMDDfpdm(发票代码)必须为 12 位纯数字
  • 所有金额字段需保留两位小数,且不能含千分位符;xfdzjh(销售方地址电话)若为空,字段仍需保留但值设为 (空标签),不可省略

别忽略数字签名和验签环节

生成的 XML 必须附带有效的税务数字签名才能被税局系统接受。签名不是加个 标签就行——它依赖原始 PDF 中的证书链、时间戳服务(TSA)和 SM3 摘要算法

  • 离线环境无法生成合法签名,必须调用税务 UKey 驱动或云签名服务(如百旺、航信的 SignService 接口)
  • 常见错误:Signature verification failed: invalid digest 多因 XML 序列化时缩进/换行/编码不一致导致摘要值变化
  • 测试阶段可用总局提供的 InvoiceXMLValidator 工具本地验签,但上线前必须走真实环境沙箱验证

实际落地时,90% 的失败卡在签名环节或 XML 字段值格式不合规,而不是解析本身。先确认 PDF 是否含嵌入 XML,再决定走解析还是 OCR;生成 XML 后必须过验签,否则整套流程无效。

text=ZqhQzanResources