MuPDF PDF 写入选项(PDF Write Options)完整指南:从压缩、清理到加密与增量保存
图形学图像处理【免费下载链接】mupdfmupdf mirror项目地址https://gitcode.com/gh_mirrors/mu/mupdf点击查看免费下载MuPDF 提供了一组统一的“PDF 写入选项”PDF Write Options用于精细控制所有 PDF 写出函数的输出行为流的压缩与解压、对象垃圾回收、内容流清理、加密与密码策略、增量更新等。本指南以 docs/reference/common/pdf-write-options.md 为骨架结合仓库中 source/pdf/pdf-write.c 的解析实现与 source/tools/pdfclean.c 的命令行封装逐项讲解每个选项的语义、默认值、使用场景与底层原理。读完本文你将能够用一行选项字符串完成 PDF 瘦身、脱密、修复、加固与可复现导出等任务。选项的载体Option String 三种语法MuPDF 中所有接受“PDF 写入选项”的函数都以一个选项字符串option string作为参数其语法定义见 docs/reference/common/option-strings.md。同一份选项可以用以下三种等价语法之一书写逗号分隔键值对经典语法值可以加双引号以容纳逗号与等号双引号本身用连续两个双引号转义compress,encryptaes-256,owner-passwordHello, world!URL 查询串语法以?开头特殊字符用%HH十六进制转义?compresstrueencryptaes-256owner-passwordHello,%20%22world%22%21JSON 子集语法单个 JSON 对象仅含布尔、数字、字符串与数字数组反斜杠和双引号用\转义{compress:true,encrypt:aes-256,owner-password:Hello, \world\!}布尔值的等价写法包括true/yes/on/enable/1与false/no/off/disable/0且值为空时按 true 处理如garbage与garbage1等价。选项速查总表以下为文档定义的全部写入选项按功能归类功能域选项取值/默认作用压缩decompress布尔解压所有流但 compress-fonts/images 除外压缩compressyes / flate / brotli压缩所有流yes默认为 flate双层图像用 CCITT Fax通用数据用 flate压缩compressflate—用 Flate 压缩流默认算法压缩compressbrotli—用 Brotli 压缩流⚠️ 提议中的 PDF 特性压缩compress-fonts布尔压缩嵌入字体流压缩compress-images布尔压缩图像流压缩compress-effort0–100默认 0压缩投入的工作量100 为最大排版ascii布尔二进制流以 ASCII 十六进制编码写出排版pretty布尔对象带缩进美化打印排版labels布尔打印对象标签标注对象如何从 Root 可达内容流clean布尔美化内容流中的图形命令内容流sanitize布尔净化内容流中的图形命令对象garbage布尔垃圾回收未使用对象对象garbagecompact—垃圾回收 压缩交叉引用表对象garbagededuplicate—垃圾回收 压缩交叉引用表 去除重复对象对象objstms布尔使用对象流与交叉引用流保存incremental布尔以增量更新方式只写变更对象保存linearize布尔为浏览器优化已不再支持注释appearanceyes / all只合成缺失的、或全部注释/控件外观流错误continue-on-error布尔保存过程中出错仍继续加密decrypt布尔已废弃请改用encryptnone加密encryptnone/keep/rc4-40/rc4-128/aes-128/aes-256写出加密文档默认keep加密permissions整数加密时授予的文档权限位加密user-password字符串读取文档所需密码加密owner-password字符串编辑文档所需密码元数据regenerate-id布尔默认 yes重新生成文档 ID元数据reproducible布尔默认 no尽量让写出结果可复现压缩与解压控制文件体积的核心选项decompress会把除字体、图像以外的所有流解压后原样写出适合排查被压缩流掩盖的语法问题compress则相反把全部流压缩双层bi-level图像使用 CCITT Fax 编码通用数据使用 flatecompressflate即默认。compressbrotli使用 Brotli 算法——注意这是提议中的 PDF 特性不是 PDF 规范正式成员兼容性需自行评估见 source/pdf/pdf-write.c 中compressions枚举brotli2、flate1。compress-fonts与compress-images可分别针对字体流、图像流开启压缩compress-effort0|percentage0 为默认100 为最大控制压缩投入的计算量对应写入选项结构体中的compression_effort字段见 include/mupdf/pdf/document.hmutool clean -e即映射该参数。对象布局与可读性ascii / pretty / labelsascii把二进制流做 ASCII 十六进制编码输出变成纯文本便于跨平台传输与 diff 查看代价是体积约翻倍。pretty对字典、数组等对象做缩进美化打印生成“人类友好”的 PDF 源码mutool clean -t/-tt分别对应紧凑与缩进两种风格。labels为每个对象打印标签标注它如何从Root对象可达是调试对象引用关系的好帮手对应结构体字段do_labels。内容流处理clean 与 sanitizePDF 页面内容流content stream是一段解释型语言。clean将内容流中的图形命令重新排版、规范化书写sanitize更进一步做净化处理剔除危险或冗余操作、规范化操作数。两者在安全审计打开未知来源 PDF 前、修复畸形内容流时非常实用分别对应pdf_write_options的do_clean与do_sanitize字段命令行开关为mutool clean -c / -s。对象垃圾回收与交叉引用优化garbage系列解决“PDF 里残留了大量未引用对象”的问题从源码看其实现分级source/pdf/pdf-write.cgarbage1垃圾回收未使用对象garbagecompact2在回收基础上压缩交叉引用表让对象重新编号连续garbagededuplicate3进一步合并内容完全重复的对象通常能把多次嵌入的相同字体、图像合并成一份是mutool clean -ggg背后的机制。objstms则把对象打包进对象流Object Streams并使用交叉引用流XRef Streams这是 PDF 1.5 之后进一步压体积的手段源码中写入器在启用objstms且文档版本低于 1.5 时会自动提升版本号source/pdf/pdf-write.c。保存策略增量更新与已废弃的 linearizeincremental只把“自上次保存以来发生变化的对象”追加写入文件而非整体重写对保留数字签名、快速保存大批量修改至关重要。但并非所有文档都能增量保存pdf_can_be_saved_incrementally显示若文档曾触发过修复repair_attempted或已执行过脱密红actionredacted则不允许增量写source/pdf/pdf-write.c。linearize曾用于生成“线性化web 优化”PDF 以便边下载边渲染但文档明确标注no longer supported!请勿再依赖此选项。注释外观流appearanceyes|allPDF 注释/表单控件需要外观流appearance stream才能在阅读器中正确渲染。appearanceyes或直接appearance只合成缺失的外观流appearanceall强制重建全部外观流源码枚举见 source/pdf/pdf-write.c命令行对应mutool clean -A / -AA。对修复“注释在部分阅读器中显示为空白”的 PDF 非常有效。加密与访问控制encrypt / permissions / 密码encrypt支持以下取值对应PDF_ENCRYPT_*常量见 source/pdf/pdf-write.c取值含义none写出不加密文档脱密keep保持文档原有加密状态默认rc4-4040 位 RC4PDF 1.1 标准加密rc4-128128 位 RC4aes-128128 位 AESaes-256256 位 AES单独写encrypt无值时按 true 处理等价于rc4-40。permissionsNUMBER是以位掩码表示的文档权限默认~0即授予全部权限见 source/pdf/pdf-write.cuser-password是打开文档所需密码owner-password是编辑/修改权限所需密码二者均以 UTF-8 存储于opwd_utf8/upwd_utf8字段长度上限 128。注意decrypt已废弃源码中解析到decrypt会打印警告并建议改用encryptnonesource/pdf/pdf-write.c。元数据可复现性regenerate-id 与 reproducibleregenerate-id默认开启yes每次写出都会重新生成文档的ID条目关闭后可保留原 ID便于追踪同一文档的演化。reproducible默认关闭开启后写入器在文件头注释中不再写出 MuPDF 版本号source/pdf/pdf-write.c配合关闭时间戳类元数据可以让两次导出产生字节级一致的输出——这对自动化测试、构建缓存非常有用。默认值与底层数据结构写入选项在 C API 中的载体是pdf_write_options结构体include/mupdf/pdf/document.h每个字段对应一个选项。仓库内置了两套预置配置pdf_default_write_options全 0 默认即不做增量、不压缩、不清理、不加密permissions为~0全部权限见 source/pdf/pdf-write.cpdf_snapshot_write_optionsdo_incremental1且不重新生成 ID供快照snapshot场景专用。字符串选项到结构体的转换流程为pdf_parse_write_options→pdf_init_write_options清零→pdf_apply_write_options逐键解析source/pdf/pdf-write.c→ 校验无未识别键后返回解析失败会抛出参数错误。命令行提示文本集中在fz_pdf_write_options_usagesource/pdf/pdf-write.c。实战一mutool clean 命令行用法mutool clean是这些写入选项最主要的命令行入口其完整用法见 docs/tools/mutool-clean.md 与 source/tools/pdfclean.c。选项与命令行开关的对应关系如下写入选项命令行开关decompress-dcompress-zcompress-fonts-fcompress-images-icompress-effort-e N0 默认1 最小100 最大ascii-apretty-t紧凑/-tt缩进labels-Lclean-csanitize-sgarbage/ compact / deduplicate-g/-gg/-gggobjstms-Zappearanceyes/ all-A/-AAencryptnone-Dencrypt算法-E rc4-40\|rc4-128\|aes-128\|aes-256owner-password/user-password-O/-Upermissions-P N典型示例# 垃圾回收并压缩全部流输出瘦身后的文件 mutool clean -g -z input.pdf output.pdf # 彻底清理gc 去重 压缩 净化内容流 压缩字体图像 mutool clean -ggg -z -f -i -s input.pdf output.pdf # 用 AES-256 加密设置用户密码与所有者密码 mutool clean -E aes-256 -U readpass -O editpass input.pdf output.pdf # 去掉所有加密脱密 mutool clean -D input.pdf output.pdf注意mutool clean默认设置了dont_regenerate_id 1source/tools/pdfclean.c即默认不重新生成文档 ID。实战二C API 编程调用在 C 代码中先解析选项字符串再调用pdf_save_document写出#include mupdf/fitz.h #include mupdf/pdf.h pdf_write_options opts; pdf_parse_write_options(ctx, opts, compress,garbagededuplicate,encryptaes-256, user-passwordreadpass,owner-passwordeditpass); pdf_save_document(ctx, doc, output.pdf, opts);对应的核心 API 声明见 include/mupdf/pdf/document.hpdf_parse_write_options/pdf_init_write_options/pdf_apply_write_options/pdf_write_document/pdf_save_document。需要把结构体序列化回字符串时可使用pdf_format_write_options。使用注意事项与已知细节linearize已失效选项被保留解析但明确标注不再支持不要依赖其“浏览器优化”效果。decrypt已废弃应使用encryptnone源码会给出弃用警告。objstms有版本要求启用时若文档版本低于 PDF 1.5写入器会自动提升版本见 source/pdf/pdf-write.c。选项键名不一致需留意文档与命令行帮助文本均写作compress-effort但 source/pdf/pdf-write.c 中实际解析的键名为compression-effort对应结构体字段compression_effort。若按文档书写该键被校验拒绝可尝试源码中的键名mutool clean -e则不受影响。未知选项会报错pdf_parse_write_options在解析完成后会校验是否存在未被识别的键source/pdf/pdf-write.c拼写错误的选项不会被静默忽略。continue-on-error开启后保存流程遇到错误仍会继续尝试写出剩余内容适合批量处理脏文件时尽量产出结果但应意识到输出可能不完整。总结PDF 写入选项是 MuPDF 文档写出体系中最常用的一组配置从compress/garbage系列的文件瘦身到clean/sanitize/appearance的内容修复再到encrypt/ 密码 /permissions的安全控制以及incremental/reproducible的保存策略全部可以通过一份简洁的选项字符串在mutool clean、C API 乃至其他支持文档写入的入口中复用。结合 pdf-write-options.md、option-strings.md 与 pdf-write.c 阅读即可对每一项配置做到“知其然也知其所以然”。赞分享图形学图像处理【免费下载链接】mupdfmupdf mirror项目地址https://gitcode.com/gh_mirrors/mu/mupdf点击查看免费下载相关推荐SumatraPDF 中的 MuPDF PDF 写出选项pdf-write-options详解从 Option String 到 pdf_save_document 的完整实战指南SumatraPDF 中的 MuPDF PDF 写出选项pdf write options详解从 Option String 到 pdf_save_doc桌面应用文档MuPDF JavaScript API 详解Font 字体对象从加载、度量到 PDF 嵌入的完整实践指南MuPDF JavaScript API 详解Font 字体对象从加载、度量到 PDF 嵌入的完整实践指南 Font字体对象是 MuPDF JavaScr图形学图像处理SumatraPDF sumatrapdf-tool clean 完全指南压缩、加密、提取与修复 PDFSumatraPDF sumatrapdf tool clean 完全指南压缩、加密、提取与修复 PDF sumatrapdf tool clean 是 Su桌面应用文档上一篇终极英雄联盟本地自动化工具League Akari 完全指南下一篇智能文本对齐终极指南5分钟快速构建高质量平行语料库创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考