通过上一篇文章的操作(
用Python制作“菜鸟学Python”电子书-上篇
),我们对每篇文章进行了滚动截图,并分目录保存了下来(下图),现在要做的就是对每篇文章的截图进行处理和拼接,然后转换并整合到一个pdf文档中做成电子书。
1
图片处理及拼接
在这一步,需要对一篇文章的所有截图按顺序拼接,当然在拼接之前需要去除像简书的顶部栏这种多余的部分,这样才能拼接出一幅内容完整、排版美观的图片。
1).按顺序获取图片文件
我们知道使用os.listdir方法可以获取指定目录下的文件名列表,但是这个列表是按文件名字符串排序的,也就是说,如果有一个名为【1、2、3、....10、11】的文件列表,它的默认顺序会是【1、10、11、2、.....9】,以这个顺序来进行图片拼接结果可想而知。
获得正确顺序的办法有很多,我选择使用文件的生成时间为KEY值来进行排序,因为所有的图片都是按顺序截取的,文件的生成时间肯定是没问题的。
另外使用这种方法不但可以对图片排序,还可以对后期生成的PDF文件进行排序,通用性较强。具体代码如下,其中path是目录路径,param是想要获取的文件类型。
2).图片裁剪
在页面滚动截取的过程中,每次翻动的步长设定为“页面显示高度-顶部栏元素高度”,这样做虽然有效杜绝了文章内容被遮挡的问题,但是每幅图片顶部都有条一“横幅”,这样的图片拼接后必然严重影响阅读效果。
因此在拼接前要先对图片进行裁剪,可以使用Image对象的crop()方法完成该操作,crop接收一个tuple作为输入参数——(left, top, right, bottom),四个参数分别代表图片的左端、顶部、右端、底部所在的坐标,其坐标系如下图所示,左上角为(0, 0),数值沿右、下方向增加。如果仅仅把上端的顶部栏剪掉,只需要调整top参数即可,如果对美观度有要求,还可以把文章内容两侧的多余部分剪掉。
3).图片拼接
图片拼接的方法也有很多,我个人比较倾向于使用numpy来完成拼接操作(感觉效率更高一些)。对于每张图片读入后将其转换为numpy格式的数组,numpy数据的连接就非常容易了(直接append),然后再将numpy数组转化为图片保存即可。由于图片较长,这里只展示一部分作为演示:
由于我们每次截图、裁剪后的图片尺寸完全相同,在拼接过程中无须考虑尺寸的一致性问题,否则还需要对图片尺寸进行统一,另外在图片拼接完成后为了节省空间可以将原文件即时删除,图片裁剪及拼接代码如下:
2
转换并整合为PDF文档
现在我们得到的是一堆长图(一篇文章一幅图),虽然完整地保存了资料,但是阅读图片毕竟不方便,所以考虑将他们转换并合并为一个PDF文档。
1).图片转换为pdf文件
将图片转换为pdf需要借助一个第三方库reportlab,reportlab是用python语言生成pdf文件的重量级模块,有免费版和商业版两个版本,对我们来说免费版的功能绝对绰绰有余了。
使用pip安装reportlab(如果安装出现问题可以尝试更新pip版本),在转换过程中需要首先获取图片尺寸,以该尺寸为参照建立pdf文件,然后将图片绘制到pdf之中,pdf文件以对应的文章名称命名。与图片拼接过程类似,为了节省存储空间,在pdf文件生成后可以直接删除图片文件,代码如下:
2)合并pdf文档并添加书签
经过上面的步骤我们已经获得了以文章为存储单位的独立pdf文件,现在要做的就是将他们合并成一个完整的文档,并添加书签,即方便存储管理也便于阅读查询。
reportlab主要用于pdf文件的创建,在python中还有专门用于对pdf文件进行读取,切割,合并,转换等操作的库——PyPDF2 。
PyPDF2 同样可以使用pip直接安装,使用时首先建立一个PdfFileMerger对象,然后按顺序依次添加pdf文件,这里pdf文件列表的获取方式与文章第一部分截图文件列表的获取方式相同,同样是按照文件的生成时间排序!
到目前为止,将几千张分散的页面截图转换成一份完整的pdf文档的主要功能函数已经全部实现了,还记得上篇文章中提到的入口函数么?我们可以把图片和pdf文件处理的相关函数融入到入口函数中去,实现一边滚动截图、一边生成pdf的操作!
有兴趣的朋友还可以加入多线程提高运行效率,这里我就不演示了,直接看下最后生成的pdf文件效果: