0

0

XML上传后生成PDF Java/Python如何用XML数据填充PDF模板

星降

星降

发布时间:2026-02-05 10:50:02

|

784人浏览过

|

来源于php中文网

原创

PDF模板必须是XFA或AcroForm格式才能用XML填充,普通PDF不支持;AcroForm为当前主流,XFA已逐步淘汰;字段名须与XML节点名严格一致(含大小写及嵌套扁平化),且需校验XML结构。

xml上传后生成pdf java/python如何用xml数据填充pdf模板

PDF模板必须是XFA或AcroForm格式才能用XML填充

普通PDF无法直接用XML数据填充,只有两种PDF支持XML数据绑定:Adobe的XFA表单(已逐步淘汰但仍有遗留系统在用)和标准AcroForm表单(带命名字段)。如果你手里的PDF是“导出为PDF”的Word生成物、截图转PDF或纯版式PDF,xml根本不会被识别——工具会静默失败或报Field not found类错误。

验证方法:用Adobe Acrobat打开PDF → 右键任意表单域 → “属性” → 查看“常规”页签中的“字段名称”是否非空;或用pdfinfo -f 1 your.pdf(Linux/macOS)检查是否含Form: AcroForm字样。

Java推荐iText7 + xmlworker(仅限AcroForm)

iText7本身不解析XML,需配合xmlworker或手动映射字段。更稳妥的做法是用PdfAcroForm加载XML后逐字段赋值。注意:iText7.2+已移除对XFA的支持,只处理AcroForm。

  • 确保PDF字段名与XML节点名严格一致(区分大小写),例如XML中INV-2024-001,PDF字段名也必须是invoice_no
  • 嵌套XML(如Alice)需扁平化字段名,如PDF字段应为customer.namecustomer_name(取决于你解析逻辑)
  • 日期/数字字段需提前格式化为PDF字段接受的字符串,比如date字段填"2024-05-20"而非"2024-05-20T00:00:00Z"
PdfDocument pdfDoc = new PdfDocument(new PdfReader("template.pdf"), new PdfWriter("filled.pdf"));
PdfAcroForm form = PdfAcroForm.getAcroForm(pdfDoc, true);
Document xmlDoc = Jsoup.parse(new File("data.xml"), "UTF-8");
Elements fields = xmlDoc.select("*");
for (Element e : fields) {
    String name = e.tagName();
    String value = e.text();
    if (form.getField(name) != null) {
        form.getField(name).setValue(value);
    }
}
pdfDoc.close();

Python用pypdf + lxml(轻量、无依赖、仅AcroForm)

pypdf(v3.0+)可读写AcroForm字段,不依赖Java环境,比reportlabweasyprint更适合已有PDF模板的场景。XML解析用lxml.etree最稳,避免xml.etree.ElementTree对命名空间或编码的隐式处理出错。

立即学习Java免费学习笔记(深入)”;

琅琅配音
琅琅配音

全能AI配音神器

下载
  • 字段名含空格或点号(如ship.to.city)需用form.get_fields()确认实际键名,PDF可能自动转为ship_to_city
  • 多值字段(如复选框)要设"/Yes""/Off",不能只传字符串"Yes"
  • 中文XML务必声明编码:,否则lxml可能误判为ASCII导致乱码
from pypdf import PdfReader, PdfWriter
from lxml import etree

reader = PdfReader("template.pdf")
writer = PdfWriter()
writer.append(reader)

tree = etree.parse("data.xml")
root = tree.getroot()

for field in reader.get_fields().values():
    key = field.field_name
    elem = root.find(key)
    if elem is not None and field.field_type == "/Tx":
        field.value = elem.text or ""

with open("filled.pdf", "wb") as f:
    writer.write(f)

别跳过XML Schema校验这一步

生产环境里,XML结构错一个层级、少一个必填字段,PDF填充就可能漏填或崩溃。用xsd文件做预校验比事后查PDF更高效。Python可用lxml.is_valid(),Java可用SchemaFactory

常见陷阱:XML默认命名空间(xmlns="http://example.com/ns")会让find("field")返回None,必须注册命名空间前缀或用.xpath("//ns:field", namespaces={"ns": "..."} )

如果模板字段名来自数据库或配置中心,XML结构又常变,建议把字段映射关系抽成JSON配置,而不是硬编码字段名到Java/Python里——改一次PDF字段就得改两处代码,非常容易脱节。

热门AI工具

更多
DeepSeek
DeepSeek

幻方量化公司旗下的开源大模型平台

豆包大模型
豆包大模型

字节跳动自主研发的一系列大型语言模型

通义千问
通义千问

阿里巴巴推出的全能AI助手

腾讯元宝
腾讯元宝

腾讯混元平台推出的AI助手

文心一言
文心一言

文心一言是百度开发的AI聊天机器人,通过对话可以生成各种形式的内容。

讯飞写作
讯飞写作

基于讯飞星火大模型的AI写作工具,可以快速生成新闻稿件、品宣文案、工作总结、心得体会等各种文文稿

即梦AI
即梦AI

一站式AI创作平台,免费AI图片和视频生成。

ChatGPT
ChatGPT

最最强大的AI聊天机器人程序,ChatGPT不单是聊天机器人,还能进行撰写邮件、视频脚本、文案、翻译、代码等任务。

相关专题

更多
json数据格式
json数据格式

JSON是一种轻量级的数据交换格式。本专题为大家带来json数据格式相关文章,帮助大家解决问题。

426

2023.08.07

json是什么
json是什么

JSON是一种轻量级的数据交换格式,具有简洁、易读、跨平台和语言的特点,JSON数据是通过键值对的方式进行组织,其中键是字符串,值可以是字符串、数值、布尔值、数组、对象或者null,在Web开发、数据交换和配置文件等方面得到广泛应用。本专题为大家提供json相关的文章、下载、课程内容,供大家免费下载体验。

540

2023.08.23

jquery怎么操作json
jquery怎么操作json

操作的方法有:1、“$.parseJSON(jsonString)”2、“$.getJSON(url, data, success)”;3、“$.each(obj, callback)”;4、“$.ajax()”。更多jquery怎么操作json的详细内容,可以访问本专题下面的文章。

313

2023.10.13

go语言处理json数据方法
go语言处理json数据方法

本专题整合了go语言中处理json数据方法,阅读专题下面的文章了解更多详细内容。

78

2025.09.10

pdf怎么转换成xml格式
pdf怎么转换成xml格式

将 pdf 转换为 xml 的方法:1. 使用在线转换器;2. 使用桌面软件(如 adobe acrobat、itext);3. 使用命令行工具(如 pdftoxml)。本专题为大家提供相关的文章、下载、课程内容,供大家免费下载体验。

1914

2024.04.01

xml怎么变成word
xml怎么变成word

步骤:1. 导入 xml 文件;2. 选择 xml 结构;3. 映射 xml 元素到 word 元素;4. 生成 word 文档。提示:确保 xml 文件结构良好,并预览 word 文档以验证转换是否成功。想了解更多xml的相关内容,可以阅读本专题下面的文章。

2095

2024.08.01

xml是什么格式的文件
xml是什么格式的文件

xml是一种纯文本格式的文件。xml指的是可扩展标记语言,标准通用标记语言的子集,是一种用于标记电子文件使其具有结构性的标记语言。想了解更多相关的内容,可阅读本专题下面的相关文章。

1098

2024.11.28

js 字符串转数组
js 字符串转数组

js字符串转数组的方法:1、使用“split()”方法;2、使用“Array.from()”方法;3、使用for循环遍历;4、使用“Array.split()”方法。本专题为大家提供js字符串转数组的相关的文章、下载、课程内容,供大家免费下载体验。

381

2023.08.03

Java 微服务与 Spring Cloud 实战
Java 微服务与 Spring Cloud 实战

本专题讲解 Java 微服务架构的开发与实践,重点使用 Spring Cloud 实现服务注册与发现、负载均衡、熔断与限流、分布式配置管理、API Gateway 和消息队列。通过实际项目案例,帮助开发者理解 如何将传统单体应用拆分为高可用、可扩展的微服务架构,并有效管理和调度分布式系统中的各个组件。

0

2026.02.05

热门下载

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

精品课程

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

共48课时 | 8.5万人学习

Git 教程
Git 教程

共21课时 | 3.3万人学习

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

Copyright 2014-2026 https://www.php.cn/ All Rights Reserved | php.cn | 湘ICP备2023035733号