阅读文本 / Reading text
本文使用合成样本演示处理方法。代码已通过隔离环境中的示例检查;这不代表对所有真实文件或产品效果的保证。处理重要文件前,请保留原件,并按文中的边界与验收项复核。
这篇先解决哪一个问题
同名附件可以对应多份内容。不要用局部序号和清理后的名称作全局键;这里按提取顺序分配独立 ID,保留原始名称作为元数据,不把附件写入磁盘或执行。
自包含的合成示例
依赖见导入列表。代码在内存中构造输入;运行记录单独提供,不代表对所有真实文件的保证。
from io import BytesIO
from pypdf import PdfReader, PdfWriter
writer = PdfWriter()
writer.add_blank_page(width=200, height=200)
writer.add_attachment("data.csv", b"row-one")
writer.add_attachment("data.csv", b"row-two")
writer.add_attachment("../secret.txt", b"synthetic secret")
out = BytesIO()
writer.write(out)
out.seek(0)
reader = PdfReader(out)
records = []
for name, contents in reader.attachments.items():
for content in contents:
records.append({"id": len(records), "source_name": name, "bytes": content})
assert len(records) == 3
assert len({r["id"] for r in records}) == 3
assert {r["bytes"] for r in records if r["source_name"] == "data.csv"} == {b"row-one", b"row-two"}
assert any(r["source_name"] == "../secret.txt" for r in records)
为什么你的附件提取脚本会静默丢文件
在处理包含嵌入文件的 PDF 时,最隐蔽的故障不是报错,而是“成功”执行后文件少了。当你遍历
reader.attachments
并直接用原始名称写入磁盘时,如果 PDF 内嵌了两个名为
report.xlsx
的文件,后者会直接覆盖前者;如果文件名包含
../
或系统保留字符,写入操作可能失败甚至触发安全风险。pypdf 官方文档明确警告:附件名称可以包含任意字符,且同名附件以列表形式存储。这意味着任何未经净化的批量提取逻辑,在遇到非标准 PDF 时都不可靠。
合成示例:正确输出与边界输入处理
为了验证提取逻辑的健壮性,我们需要构造一个受控的合成样本,而不是依赖来源不明的生产文件。假设我们构建了一个包含三个附件的 PDF:第一个是正常文件
data.csv
,第二个是与第一个同名的
data.csv
(内容不同),第三个是文件名包含路径遍历特征的
..\secret.txt
。
安全提取与文件名净化的 Python 实现
此代码仅为逻辑演示,不构成对 pypdf 所有附件特性的完整覆盖。实际生产中,还需考虑大文件流式读取、编码异常等情形。
验收标准与人工审查边界
自动化提取不能替代交付前的人工核对。下表列出常见异常及其处理决定,区分代码可解决与需人工介入的场景:
观察现象
自动处理
人工审查
多个附件同名
添加序号前缀,保留全部内容
确认是否为版本迭代或误嵌入
文件名含路径分隔符
剥离目录结构,仅取文件名
检查是否意图隐藏恶意载荷
附件内容为空或极小
记录日志,仍保存文件
判断是否为占位符或损坏
文件名乱码或不可打印字符
替换为下划线,保留索引
回溯原始PDF元数据确认语义
附件类型与扩展名不符
按内容嗅探或保留原样
由领域专家判定用途
注意:本表适用于代码演示层面的校验。端到端效果还需结合业务上下文,例如合同附件缺失可能比文件名错误更严重。当附件数量超过20个或存在加密、签名时,应暂停自动化流程,转交专人审查。
参考资料与下一步行动
pypdf Handle Attachments 官方文档
PDF 2.0 Specification Section 14.13 (Associated Files)
下一步:在你的 CI 流水线中加入合成附件测试用例;对历史交付文档抽样运行净化提取脚本,建立附件完整性基线;若发现系统性丢失,优先排查命名冲突而非网络或权限问题。
将这份检查清单用于文档翻译
文件拆合、加密或附件处理属于交付准备,翻译不能替代这些检查。保留原件和处理清单,再评估译稿的页序、链接与内容完整性。
OmniDoc(产品入口)
提供多格式文档翻译入口,官网介绍了 OCR、术语表与双语对照功能。对希望直接从文件开始处理的团队,这是一条值得用实际样本评估的路径。请使用有权上传的脱敏文件,并用本篇的检查项复核结果;这里不声称 OmniDoc 使用了本文的开源库或内部算法,也不以示例代替产品性能测试。
- 1 -
更新于 2026-10-09