起因
最近工作中有个任务,在word里面插入PDF对象,比较郁闷的是,同事发的很多PDF文件,里面的图片不是正的,于是自己用PDF浏览软件——Adobe Reader XI,把图像翻转一下,但是发现保存的选项是灰色的。翻转后另存为一个新文件,打开新文件,却还是未翻转的状态,百度搜了一下,发现这个免费的软件只能查看不能编辑,所以翻转图片也算是编辑咯?想了想也没毛病,毕竟相对于原文件来说,发生了改变。
同事给我推荐了一下国内比较有名气的某昕软件,使用了一下,发现和“Adobe Reader XI”一样,未登录用户只能查看不能编辑,注册登录成为免费会员后,虽然解锁了部分编辑的功能,但是更头疼的还会有他们的水印,需要付费才能去除水印。这时我就想起来自己在上家公司做的一个批量把jpg和tif格式的文件合成pdf 文件时所用的一个Python第三方库——PyPDF2,随手网上搜了一下,代码不多,随后“cv”大法下来,然后跑起代码后却报了很多错误(对于近半年没搞过开发的我来说,七八行报错确实算多的了)最下面的错误代码是“Expected object ID (5 0) does not match actual (4 0); xref table not zero-indexed.”,度娘搜到的结果都不符合要求,于是搬梯子上谷歌,结果也不尽人意,要么是未解决,要么是类似的问题(充其量只能算个类似的警告:“PdfReadWarning: Xref table not zero-indexed. ID numbers for objects will be corrected”),纠结了一天,难道是这个库很久没更新?pdf有了新技术,导致这个库一些功能用不了了?
过程
重新学习这个库(其实就是找个pdf 文件,照着官方文档,或者百度其他人的代码把部分功能跑一边),这里有个问题,这边我学习跑代码的时候,用的是另外一个我在网上下载的一款交换机的pdf产品彩页,并没有用同事发给我的那几个(需要翻转)pdf文件测试(当时我也不知道自己怎么想的),学习使用中,发现一些方法(比如pdf文件信息,总页数等等)都是没问题的。
测试没问题,把代码中源文件的路径由同事发给我的pdf文件改为了这个交换机的产品彩页,结果报了另外的错误:“UnicodeDecodeError: 'utf-8' codec can't decode byte 0xba in position 8: invalid start byte和PyPDF2.utils.PdfReadError: Illegal character in Name Object”虽然生成了我要生成pdf文件,但是新的文件打开后提示“文件损坏”,且文件大小为0,搜了一下,有位大神在18年6月份的通过改源码的方式,解决了这bug(https://github.com/mstamy2/PyPDF2/issues/438),看的不是很懂,直到在csdn上看到另外一篇今年10月份 的博客(https://blog.csdn.net/kmesky/article/details/102695520), 格式上更容易读懂一些, 跟着看了一下源码,作者只改了“PyPDF2generic.py", line 484”一处,另一处“PyPDF2/utils.py 第238行”没有改,于是我改了一下,重新跑,发现结果是一样的。
接下来无聊的测试中,发现使用“Adobe Reader XI”直接另存为一个PDF文件,虽然内容是一样的,但是文件的大小发生了变化,且使用代码去翻转的时候,没有报错。所以目前的解决办法是使用代码实现这个软件的另存为功能。但是使用Python的复制方法,都达不到我要的效果(https://www.cnblogs.com/keeptg/p/10944109.html)。
结果
暂时先把这几个BUG给使用捕获异常加弹窗的形式给跳过去吧。
GitHub:https://github.com/Gnbp/handlePDF
如果有大神能帮忙解决这个BUG,不胜感激~