NodeJS环境下如何实现PDF转XML以满足签名API的base64要求
本地离线PDF转XML实现方案
适配需求
完全本地运行,无需上传PDF到外部服务器,无付费依赖,可直接生成符合要求的XML后转base64供签名API调用。
1. Python 实现方案
- 依赖开源离线库
pdfplumber,支持提取文本、表格、字体位置等多维度PDF信息 - 安装命令:
pip install pdfplumber - 代码示例:
import pdfplumber import xml.etree.ElementTree as ET import base64 # 本地读取PDF文件 with pdfplumber.open("target.pdf") as pdf: # 构造XML根节点,可根据API要求修改节点结构 root = ET.Element("pdf_document") # 写入PDF基础元数据 meta_node = ET.SubElement(root, "metadata", page_count=str(len(pdf.pages))) # 遍历所有页面写入内容 for page_idx, page in enumerate(pdf.pages, start=1): page_node = ET.SubElement(root, "page", number=str(page_idx)) # 提取页面文本,也可按需提取表格、元素坐标等信息写入 page_text = page.extract_text() text_node = ET.SubElement(page_node, "content") text_node.text = page_text # 生成XML字符串 xml_str = ET.tostring(root, encoding="utf-8", method="xml").decode("utf-8") # 转base64格式直接供API调用 base64_xml = base64.b64encode(xml_str.encode("utf-8")).decode("utf-8")
2. Node.js 实现方案
- 依赖开源离线库
pdf2json,无外部网络请求 - 安装命令:
npm install pdf2json xmlbuilder2 - 代码示例:
const PDFParser = require("pdf2json"); const { create } = require('xmlbuilder2'); const pdfParser = new PDFParser(); // 本地加载PDF文件 pdfParser.loadPDF("./target.pdf"); pdfParser.on("pdfParser_dataReady", pdfData => { // 构造XML结构,可根据API要求调整节点规则 const root = create({ version: '1.0' }) .ele('pdf_document') .ele('metadata', { page_count: pdfData.Pages.length }).up(); // 写入页面内容 pdfData.Pages.forEach((page, index) => { const pageNode = root.ele('page', { number: index + 1 }); // 拼接页面文本内容 const pageContent = page.Texts.map(textItem => decodeURIComponent(textItem.R[0].T)).join(' '); pageNode.ele('content').txt(pageContent); }); // 生成XML字符串 const xmlStr = root.end({ prettyPrint: true }); // 转base64格式直接供API调用 const base64Xml = Buffer.from(xmlStr).toString('base64'); });
特殊场景说明
- 如果签名API要求XML符合特定规范(比如XAdES签名标准结构),需要对应调整上述代码中的XML节点结构,补充API要求的元数据字段。
- 如果是扫描版PDF,可搭配离线OCR库
tesseract本地识别文本后再生成XML,无需上传外部服务器。
内容的提问来源于stack exchange,提问作者mdmb
相关产品推荐
相关产品推荐

