“菜鸟学Python”几百篇的文章

通过上一篇文章的操作(

用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文件效果:

  • 发表于:
  • 原文链接https://kuaibao.qq.com/s/20181207B0H9V300?refer=cp_1026
  • 腾讯「云+社区」是腾讯内容开放平台帐号(企鹅号)传播渠道之一,根据《腾讯内容开放平台服务协议》转载发布内容。
  • 如有侵权,请联系 yunjia_community@tencent.com 删除。

扫码关注云+社区

领取腾讯云代金券