ARTICLE DETAIL

资讯详情

深耕编程入门与网站建设的一线实战洞察。

pypdf 读取与修改 PDF 元数据实战:常规元数据与 XMP 完整指南

pypdf 读取与修改 PDF 元数据实战:常规元数据与 XMP 完整指南 pypdf 读取与修改 PDF 元数据实战常规元数据与 XMP 完整指南【免费下载链接】pypdfA pure-python PDF library capable of splitting, merging, cropping, and transforming the pages of PDF files项目地址: https://gitcode.com/GitHub_Trending/py/pypdf最近整理一批扫描件打开才发现标题、作者、创建日期全是空的想批量核对又无从下手。这类问题 pypdf 都能处理PdfReader把文档元数据读成 Python 对象PdfWriter则支持追加、增量修改甚至整段清空。常规元数据与 XMP 元数据是两条独立的通道搞清楚各自的定位读取和修改就不会乱。两种 PDF 元数据的分工这一节先回答我该写哪一种避免两种都写或只写一种导致信息不一致。对比项常规元数据Info 字典XMP 元数据定位PDF 格式自带的基础字段键值对形式基于 XML 的结构化容器支持命名空间典型字段标题、作者、主题、创建者、生成工具、日期多语言标题、创建者列表、UUID、PDF/A 声明读取入口reader.metadatareader.xmp_metadata适用场景只想快速补齐谁、何时、用什么工具需要多语言文本、列表、归档合规声明同一个文件里两者可以同时存在。一般业务写常规元数据就够了涉及多语言或 PDF/A 归档时才动用 XMP。3 行代码读取 PDF 元数据拿到文件先看 Info 字典。代码很短真正的坑在于什么都可能没有from pypdf import PdfReader reader PdfReader(example.pdf) meta reader.metadata if meta: # 元数据整体也可能缺失先挡一层 print(meta.title) print(meta.creation_date)title、author、subject、creator、producer、creation_date、modification_date这些属性逐个都可能返回None打印前留个判断批量脚本就不会在这里中断。XMP 的读取入口是reader.xmp_metadata同样要判空有些文件只带 XMP 没有 Info两边都查一遍比较稳妥。三种写 PDF 元数据的做法这一节按你想改到什么程度分三条路整体写入、增量更新、彻底清空对应的 API 各不相同。整体写入add_metadata 一次给全新建文档或重写页面时先把旧文件的关键字段带过来再覆盖新值from datetime import datetime from pypdf import PdfReader, PdfWriter reader PdfReader(example.pdf) writer PdfWriter() # 搬页面同时继承旧元数据 for page in reader.pages: writer.add_page(page) writer.add_metadata(reader.metadata or {})日期字段沿用D:前缀的写法转义冒号即可now D\\072 datetime.now().strftime(%Y%m%d%H%M%S) 0800 writer.add_metadata({/Title: 年度总结, /Author: 张三, /ModDate: now}) writer.write(out.pdf)add_metadata是合并逻辑只更新的键会被覆盖其余键保持原样还能塞进自定义键比如/CustomField。增量更新clone_from 只动想动的只想改一两个字段、页面完全不动克隆后加字段最省事from pypdf import PdfWriter writer PdfWriter(clone_fromexample.pdf) writer.add_metadata({/Title: 新版标题}) writer.write(out.pdf)也可以直接给writer.metadata赋一个全新的字典用新集合整体替换现有条目。一键清空 PDF 元数据合规场景里要抹掉来源信息一行就够from pypdf import PdfWriter writer PdfWriter(example.pdf) writer.metadata None # 整个 Info 条目从文档里删除 writer.write(out.pdf)注意metadata None只删常规元数据XMP 走的是另一个属性xmp_metadata需要清理的话单独处理。XMP 元数据进阶四种数据形态XMP 字段的值不全是字符串写之前先认清楚形态赋值才不会报错。实现集中在 pypdf/xmp.py入口是一个类方法from pypdf.xmp import XmpInformation xmp XmpInformation.create() # 从内置模板起步命名空间已配好四类形态各看一个例子多语言字典标题按语言键存放x-default是缺省语言xmp.dc_title {x-default: 报告, en: Annual Report}数组创建者是有序列表追加元素即可xmp.dc_creator [张三, 李四]日期时间直接传datetime对象库负责序列化成 ISO 格式from datetime import datetime xmp.xmp_create_date datetime.now()简单文本生产者就是一个字符串xmp.pdf_producer pypdf字段大体分五个类别每类只记一个代表Dublin Core 用dc_title多语言标题、XMP 基础字段用xmp_creator_tool生成工具、PDF 字段用pdf_pdfversion版本号、XMP Media Management 用xmpmm_document_id文档级 UUID、PDF/A 用pdfaid_part合规部分编号。字段名以 docs/user/metadata.md 为准。改已有 XMP 时建议读出-改-写回保留其余条目title xmp.dc_title or {} title[en] Annual Report xmp.dc_title title写完挂到文档上writer.xmp_metadata xmp然后writer.write(...)。常见坑与自查最后四条都是真实踩过的按现象 → 原因 → 处理对照排查。现象打印元数据时程序抛AttributeError。原因reader.metadata本身是None损坏或加密文件常见。处理先if meta:再访问字段批量场景加个try兜底。现象写入的日期在 Adobe Acrobat 里显示00000000或乱码。原因字符串缺了D:前缀查看器无法解析。处理按D\\072%Y%m%d%H%M%S的模板拼前缀不能省。现象不同机器读出来的创建时间对不上。原因日期只写了本地时间、没有时区偏移。处理尾部补上偏移量如0800或统一按 UTC 存。现象metadata None之后文件属性里还能看到标题。原因残留的是 XMPInfo 和 XMP 是两条独立通道。处理需要清空时用writer.xmp_metadata None单独处理。改完自查一遍用 pypdf 重新读一遍再打开 PDF 查看器目视确认双重保险。更完整的字段清单和示例在 docs/user/metadata.md想深入 XMP 字段规则可以直接翻 pypdf/xmp.py 的源码。【免费下载链接】pypdfA pure-python PDF library capable of splitting, merging, cropping, and transforming the pages of PDF files项目地址: https://gitcode.com/GitHub_Trending/py/pypdf创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考
返回列表