PDF 文件工程

压缩 PDF 之前,先决定能不能接受图像损失

下面仅检查内容流的无损压缩:压缩前后解码字节与提取文本应相同。不承诺每份 PDF 都会变小,也不把无损流压缩与 JPEG 有损重编码混为一谈。

阅读文本 / Reading text
本文使用合成样本演示处理方法。代码已通过隔离环境中的示例检查;这不代表对所有真实文件或产品效果的保证。处理重要文件前,请保留原件,并按文中的边界与验收项复核。 这篇先解决哪一个问题 下面仅检查内容流的无损压缩:压缩前后解码字节与提取文本应相同。不承诺每份 PDF 都会变小,也不把无损流压缩与 JPEG 有损重编码混为一谈。 自包含的合成示例 依赖见导入列表。代码在内存中构造输入;运行记录单独提供,不代表对所有真实文件的保证。 from io import BytesIO import pymupdf from pypdf import PdfReader, PdfWriter with pymupdf.open() as source: page = source.new_page() page.insert_text((50, 50), "Compression sample") raw = source.tobytes() writer = PdfWriter(clone_from=BytesIO(raw)) before = writer.pages[0].get_contents().get_data() writer.pages[0].compress_content_streams() out = BytesIO() writer.write(out) out.seek(0) reader = PdfReader(out) assert reader.pages[0].get_contents().get_data() == before assert "Compression sample" in reader.pages[0].extract_text() assert len(reader.pages) == 1 关键点在于:无论怎么压缩内容流,文字矢量路径、字体嵌入和图像原始像素数据都不会被修改。这意味着你可以安全地在翻译预处理阶段执行此步骤,作为标准化流程的一部分,而不必担心破坏原文可读性。但务必注意, compress_content_streams 不接受压缩级别参数,其内部使用 zlib 默认配置。 图像替换是有损操作且不可逆 此外, remove_images() 是彻底删除而非压缩。除非你明确知道目标场景不需要图像(如纯文本提取),否则不应在翻译准备阶段使用它。很多用户误以为“压缩图像”等于“智能优化”,实际上 pypdf 只做机械的重编码,没有感知内容语义的能力。 合成示例演示两种压缩路径的差异 以下代码构造一个包含重复图像和多页内容的 PDF,分别展示无损结构压缩与有损图像处理的效果。 注意:此为已通过合成样本检查的教学代码,仅用于说明 API 行为边界,实际使用前请在本地环境验证。 参考资料与下一步 具体异常的处理决定 观察 应做什么 不应推断 解码流变化 判为不满足本例无损要求 保留原件 体积未变小 如实记录 不保证所有 PDF 压缩成功 文本回读一致 完成一项检查 复杂渲染仍需对照 将这份检查清单用于文档翻译 文件拆合、加密或附件处理属于交付准备,翻译不能替代这些检查。保留原件和处理清单,再评估译稿的页序、链接与内容完整性。 OmniDoc(产品入口) 提供多格式文档翻译入口,官网介绍了 OCR、术语表与双语对照功能。对希望直接从文件开始处理的团队,这是一条值得用实际样本评估的路径。请使用有权上传的脱敏文件,并用本篇的检查项复核结果;这里不声称 OmniDoc 使用了本文的开源库或内部算法,也不以示例代替产品性能测试。 原厂接口依据: pypdf 文档 。 - 1 -
更新于 2026-10-08