ARTICLE DETAIL

资讯详情

深耕郑州网站建设与运营推广的一线实战洞察。

pypdf 处理 PDF 元数据完整指南:5 分钟补齐作者与版权,Info 与 XMP 读写一次讲清

pypdf 处理 PDF 元数据完整指南:5 分钟补齐作者与版权,Info 与 XMP 读写一次讲清 pypdf 处理 PDF 元数据完整指南5 分钟补齐作者与版权Info 与 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上周做文档归档时我发现一批合同 PDF 里既没有作者、也没有创建时间和版权说明。缺少这些 PDF 文档信息后续的版权核查和交接全部卡壳。这类先查后补的场景里pypdf 是最省事的工具读出已有信息、写回缺失部分全程不过十几行代码。一份 PDF 的两层信息先分清要改哪一层一份 PDF 文件最多带两层文档信息。第一层叫 /Info可以理解为出厂铭牌标题、作者、创建工具、创建时间都是固定字段名结构简单。第二层叫 XMP可扩展元数据平台它像一个可扩展的档案袋除了标题和作者还支持多语言字段、关键词列表、生产者信息甚至自定义命名空间。两层可以在同一文件里共存也互相独立——改一层不会动另一层。所以动手前先判断只补作者、版权这类基础项改 /Info 就行需要结构化、多语言、可审计的归档描述才上 XMP。3 行代码读出 PDF 元数据标题、作者、创建时间读取最省事。用 PdfReader 的 metadata 属性常用字段都按属性名访问from pypdf import PdfReader reader PdfReader(archive.pdf) meta reader.metadata if meta: print(meta.title, meta.author, meta.creation_date)唯一的坑metadata 本身和每个字段都可能是 None。比如网页导出的 PDF 往往只有标题和生产者作者、主题全是空的。批量处理前先判空别让一百份文件里的第二份就把你绊倒。想看 XMP 就换 xmp_metadata 属性文件里有 XMP 时返回 XmpInformation 对象没有就是 None。三种写回方式怎么选pypdf add_metadata 还是整体替换、清空修改 PDF 元数据的入口是 PdfWriter最常用的是 add_metadata它是增量合并传什么字段就增改什么字段已有字段原样保留最适合只补缺失项from pypdf import PdfReader, PdfWriter reader PdfReader(archive.pdf) writer PdfWriter(clone_fromreader) writer.add_metadata({/Author: 档案组, /Subject: 内部存档}) writer.write(archive-filled.pdf)想要更强的控制可以直接给 writer.metadata 属性赋值。三种写法对照如下目标写法效果增改个别字段writer.add_metadata({...})增量合并其余字段保留重建 Info 条目writer.metadata {/Author: 档案组}整体替换旧字段消失清空但保留条目writer.metadata {}Info 还在内容为空彻底删掉 /Infowriter.metadata None整个铭牌被移除一个容易漏的细节/CreationDate 和 /ModDate 不是 ISO 日期串而是 PDF 自己的格式形如D:202609160830000800。自己写时间时得先按这个格式拼好不然下游工具可能解析不了。创建与更新 pypdf XMP 元数据把信息装进档案袋当 /Info 装不下需求时就轮到档案袋登场。先用 XmpInformation.create() 建对象再按属性一个个设值。字段名和常规元数据风格一致只是标题这类字段是语言 → 文本的字典创建者这类是列表from pypdf.xmp import XmpInformation xmp XmpInformation.create() xmp.dc_title {x-default: 季度报告} xmp.dc_creator [李雷, 韩梅梅] xmp.pdf_producer pypdf # 建好 writer 后赋值即可writer.xmp_metadata xmp把它赋给 writer 的 xmp_metadata写盘时 XMP 包就会随文件一起保存。日期字段直接收 datetime 对象内部会转成 UTC 格式不用你操心时区。增量更新的节奏是先取旧值 → 追加 → 写回比如给 dc_title 补法语版本先取 xmp.dc_titleNone 时回退成空字典加一个 fr 键再赋回去dc_subject 这类列表字段同理取出列表、append 再写回。此外 XMP 里还有 PDF/A 合规声明、文档实例 ID 等少量字段常规场景可以不管完整实现见 pypdf/xmp.py。元数据操作要避的 5 个坑 ️忘判 Nonereader.metadata 和每个字段都可能是 NoneXMP 字段同理追加前先or {}或or []。日期格式写错/Info 用D:YYYYMMDDHHmmSS±hhmmXMP 用 ISO 8601UTC两者别混着填。改完没落盘所有修改都在内存里调用 writer.write(...) 之前等于白改。两层混淆改 /Info 不影响 XMP反之亦然。文档两层都有时部分查看器优先显示 XMP只改 Info 可能看起来没生效。该追加却整体替换想补一个字段却给 writer.metadata 赋了新字典旧字段全丢。只补不改的场景一律用 add_metadata 更稳。到这里读取、修改、清空 PDF 元数据的完整链路已经齐了Info 用 add_metadata 增量补全结构化信息交给 XMP最后用任意查看器打开成品核对一遍。想继续深入的话官方文档 docs/user/metadata.md 里有直接改 XMP XML 结构的完整示例pypdf 文档中的 XmpInformation 章节则给出了全部字段的读写说明。【免费下载链接】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),仅供参考
返回列表