我也是 PDF 标注重度依赖用户,看到有人抱怨扫描版的 pdf 太大了同步不起,我来分享下一个压缩 PDF 的方法,根据使用经验最多可以压缩到原来的十分之一。
使用工具:
PDFPatcher (PDF拆分与合并) 下载地址:[https://github.com/wmjordan/PDFPatcher/issues/2](https://github.com/wmjordan/PDFPatcher/issues/2)
imgyaso (PDF压缩) 项目地址:[https://github.com/apachecn/imgyaso](https://github.com/apachecn/imgyaso)
WPS (OCR 功能)
pdfdir (非必须,仅为没有目录的PDF制作目录)下载地址:[https://github.com/chroming/pdfdir/releases](https://github.com/chroming/pdfdir/releases)
步骤:
-
使用 PDFPatcher 将文件的目录等元信息导出到一个 xml 文件中,如果没有目录要迁移,此步可忽略。
-
拆分。使用 PDFPatcher 将文件拆分成 jpg 图片, 它的导出方式是无损的。
-
压缩图片。这可能是最有门槛的一步,需要安装 Python 环境,以及要在命令行模式(shell)执行命令。
-
首先需要安装 Python,自行百度。
-
安装压缩工具
**imgyaso**
,在命令行模式下执行命令(对于开发人员建议使用虚拟环境,为了防止因网络原因失败,这里使用了阿里的下载源):pip.exe install imgyaso -i http://mirrors.aliyun.com/pypi/simple/ --trusted-host mirrors.aliyun.com
。如果安装成功,执行
python -m imgyaso
命令会出现如下信息:
-
在命令行环境下执行压缩命令:
python -m imgyaso -mthres 0001.jpg
,一次调用只能压缩一张图片,可以通过这种方式来测试压缩的效果。若批量的处理所有的 jpg 文件,将下面的代码保存为一个后缀为 .py 的文件,然后将它放入第 1 步中的图片目录,然后双击它就可以一键压缩当前目录下所有图片了。
(单线程处理大几百页还是有些慢,有能力的同学自行完成并发方案)
import os import subprocess def process_jpg_files(): jpg_files = [f for f in os.listdir() if f.lower().endswith('.jpg')] for jpg_file in jpg_files: subprocess.run(["python", "-m", "imgyaso", "-mthres", jpg_file]) if __name__ == "__main__": process_jpg_files()
-
-
合并。使用 PDFPatcher 将压缩后的图片合并为一个 pdf 文档,注意在操作 3 中指定了步骤 0 中的信息文件,这样生成的 PDF 文档会自动导入原文档的目录等元信息。
-
用 WPS 里的扫描件识别功能,将 PDF 转化为 OCR 版。这是个会员功能,没有会员的可以去咸鱼搞个一天号,或者使用其他工具的 OCR 方式。
-
可能还有点缺憾,因为有些扫描件一开始就没有目录,这时候就可以通过 pdfdir 工具手动导入目录啦。
很多工具都可以编辑目录如上面的 PDFPatcher,但 pdfdir 的优势在于可以从京东、豆瓣等复制下来书籍的目录信息,一键完成导入。
到这里所有的工作都已经完成了。效果图如下:
压缩率:
欢迎来到这里!
我们正在构建一个小众社区,大家在这里相互信任,以平等 • 自由 • 奔放的价值观进行分享交流。最终,希望大家能够找到与自己志同道合的伙伴,共同成长。
注册 关于