[转]截屏法制作pdf——更新python代码和效果图

现在网上卖电子书的越来越多了,亚马逊京东,当当,淘宝……且不说他们书多不多,质量如何,但就是跨平台这一点就有很多要吐槽的地方。一般网站上提供的电子书只能在电脑手机阅读,电脑上读书的效果要说自然是最好的、屏幕大、 彩色、等等。但是估计现在很少有人能坚持对着电脑连续看上几个小时的书了吧?于是,手机也作为人们读书的一个途径,但是同电脑一样,我是坚持不了多长时间 眼睛就会累了。还有很重要的一点,很多电子书根本就不考虑手机上面的排版问题,手机那么小的屏幕显示不了一个完整的页面,结果看个书手要不停的划来划 去……

     综上,我认为最理想的看书设备无疑是kindle,这种好东西自不用多说。但是上面几个书商极少提供kindle平台的,就连亚马逊都不支持自家的kindle,叫kindle用户情何以堪呢……

     没关系,本文就是来解决这个问题的!方法很原始、很暴力,既然电子书能在电脑上阅读,那么我就截屏,截屏,弄好多图片,然后制作成为pdf(针对亚马逊中国的电子书已经有人给了更好的办法)。

     呵呵,听起来是挺美好,但是这里有很多问题:

  • 一本书通常有几百页之多,能手工一一截图的果然是神级一样的奇葩,我们肯定要使用自动化的方法。
  • 怎么对于超出屏幕大小的页面,怎么连续截图?

其实主要就是这两个问题,至于截图之后怎么合成pdf,怎么切白边都有很多现成的资料了。

下面说下我采用的方法,比较之下还是很不错的哦~
首先我们对电子书要有一个大致的认识,对于一本电子书,通常有两类:

  • 第一是类是以文字为主的,比如众多的小说。这种书的版式不是太重要,通常版式也不是固定的,也就是可以在阅读软件中调节字体,字号的。本质上这类书就是文本加一些格式标记制作的。
  • 第 二类是含有大量的符号的,这类书主要是以工具书为主。里面含有众多的数学公式,图形,代码……这类书的排本是很重要的,这类书一般都是固定排版了的 pdf。所以只能放大,放大再放大,但是较之扫描书籍不同是,一般购买的电子书以文字版pdf为主,也就是说它们放大之后依然很清晰。

第一类电子书,我们只需要调整到合适的版式,所谓合适主要是指你在kindle上用你习惯的阅读方式效果比较好。第二类电子书,我们只能放大到最大,然后截屏,只有这样后期得到的pdf才比较清晰。

     然后是怎么实现自动化截屏的问题了,这里对于大部分人(大部分人==非程序员)只能采用现成的工具。主要有两类工具,第一类是可以记录你的操作历 史,然后重复n多遍的,比如tinytask这个软件,很是适合小白中的小白。第二类,可以编写并执行一个脚本,脚本的命令都是很简单易学的,比如 AutoHotkey,功能强大,使用简单。
第一类最多适合截取第一类的电子书,因为可以调节版式,所以截图的时候不必那么精确。但是对于第二类,通常放大到最大之后,一页肯定会超出屏幕的显示范围,那么我们需要一页多次截图,后期合成一页,那么截图的时候就要很精确了,不然后期很难自动化的完成合成图片。

     我采用的是AutoHotkey,毕竟脚本还是很灵活的,使用方法不多说了。如果你之前对它一点都不知道的话,这里有一个中文的新手入门教程。
需要注意的事情,是最好不要使用鼠标操作,感觉这样会不精确,也不好控制。电子书阅读软件一般都支持的键盘操作有{Down}{PgDn},这两个就足够 用了,我们需要计算出至少一个页面需要几次截图才能覆盖,然后计算出每次需要按下多少次{Down},完成一页的时候一定要发送一次{PgDn},这样才 能避免多次{Down}之后出现向下的像素误差。每一{PgDn}相当于是重新对齐一页,这样几乎不会出现一点误差,非常适合后面的页面合并的自动化完 成。另外需要注意,在比较费时间的操作之后要加上合适的延时时间,要不然电脑会忙不过来的哦~

     哦,当然还要有一个比较强大的截图软件啦,这里选择还是比较多的,但是我比较推荐FSCapture,试用了多个截图软件之后感觉这个最合手。注意 默认截图方式是不适合干这种自动化的工作的,我们要在设置里面改成自动保存模式。设置好保存路径,名字命名等之后就可以自动保存了。

     然后就是打开电子书阅读软件,开始让执行脚本,不断的翻页截屏了~

     对于第一类的电子书,我推荐直接压缩zip,然后放到kindle里面就可以看了。对于第二类,我们要先进行页面合并,这里我还没找到现成的工具,不过还好前面截图比较精确,十分有利于程序完成,因此几行matlab程序就可以很轻松的完成这件事情了。

 

     上面说的对于一般的电子书都足够用了,但是如果你还有更高的追求。比如感觉截图的pdf还是不够清晰,还有截图的时候不能动电脑,,这里还有一个更 好的办法。要使pdf更清晰,我们要做的是让pdf显示在更高分辨率的显示器上,一般的电脑显示器,比如我14寸的本本,分辨率只有1366×768,折 算下来ppi只有100多点,可是对于清晰的要求我们是要300ppi的啊,怎么办,买一个分辨率很高的显示器吗?必然很贵,很不现实。那么,何不用虚拟 机呢?!!虚拟机一般支持很多分辨率,最高的能达到2560×1900,这样明显就好了很多,还有我们可以让这个截图过程在虚拟机中进行,而我们在截图的 时候可以自由的使用电脑了。

 

update:这个方法对于论坛的大牛来说或许很猥琐,,但是之所以发出来,第一:这个是我自己写的。。。第二:现在的环境是网上正版的电子书资源越来越多了,这样的方法也有了更多的适用环境。感觉这个方法还是很靠谱的~

写 完这个之后我用使用了其它方法,主要是减少软件的依赖,我发现在虚拟机里虽然风辨率可以提高很到,但是随之软件的速度也慢了好多,所以我一直想用代码去实 现这些功能,第一更加灵活,第二可以提高速度~目前已经实现python+matlab代码完成所有前期工作了,然后用老马的pic2pdf神器目前来看 效果很好.

UpUpdate:看到大家很多想了解细节的,我在这里就仔细的说下吧。

希望提出问题的网友先仔细的通读前面的内容,这样你可以知道工作的大致流程。

我再强调几点:

截图发有它的优点,几乎不会失效。各种解密、破解之类的不是我的擅长,而且我感觉那些方法封杀起来也很容易。

具 体方法中,我侧重的是截图的清晰度,也就是分辨率。我的理解是分辨率越高,得到的图片质量就越好(前提是网站提供的电子书本身不是扫描的,要是本身就是扫 描版,而且质量很差,那谁也没办法),pdf也越好,不管是要OCR还是阅读这样无疑都比较方面。所以一切的一切以分辨率为重。

还有,我希望所有的工作尽可能的用代码实现,因为现实情况是复杂的,现成的软件的适应性肯定不如自己写代码来的灵活方便,而且这样也省去了你找各种软件,各种破解的问题。

问题一、怎么获得电子书。本身在我看来,购买正版是对的,我也支持这么做,虽然现在还是穷学生一枚,但是我已经尽力避免看盗版书,用破解软件了……

之 所以还研究这个,第一是网站太坑,不提供kindle版本的电子书。第二,最近看到版里面讨论的一个问题,也就是我们购买电子书到底是购买的什么?我们购 买之后有哪些权益?貌似这些个网站都没有详细说明。我们当然可以假设,如果某一天你买书的那个网站倒闭了,,那你的书怎么办?另外,我是否可以小范围的跟 我的朋友分享我购买的书籍?这个问题比较大……

所以图书的获得我希望大家去购买正版。

问题二、怎么把电子书截图成图片。前面大致说了用截图工具+AutoHotKey的实现。但是我感觉那样不是很好。下面说下python代码的实现方法。

以Windows(貌似没有哪家提供linux的客户端)为例。

先现在你书籍提供方的PC客户端。

然后在你的电脑上安装python环境,这里采用python2.7。同时需要PIL(Python Imaging Library)库的支持。

测试代码:

  1. import ImageGrab
  2. img = ImageGrab.grab()
  3. img.save('test.jpg','JPEG')
复制代码

如果能够正确截图,那就说明前面都配置好了~

然后打开客户端,调节书的版式,调节的目的有两个,第一是提高截图的质量,第二方便截图。所以尽可能的采用单页模式,把内容放大到和你的屏幕等宽。

分析下页面,需要几次(比如是a次)才能截取一张完整的页面。根据总页数(k),计算截图次数n=a×k。

然后写python代码,也就是把上面的测试代码循环执行n次。

当然这里面还要考虑下拉,翻页等……

这里我放一个示例代码。

  1. import win32api,win32gui,win32con
  2. import ImageGrab
  3. import time
  4. time.sleep(10)#开始运行后先休眠10秒钟,以便调整出要截图的窗口。
  5. x=1
  6. for i in xrange(1,3):
  7.         win32api.keybd_event(34,0,0,0)#发送一次翻页键(pgdn键,键值是34
  8.         win32api.keybd_event(34,0,win32con.KEYEVENTF_KEYUP,0)#释放按下的键。
  9.         time.sleep(1)#翻页后休眠一段时间(此处1s,可以自己调节),目的是让客户端完成页面的渲染。
  10.         im = ImageGrab.grab()#截图。
  11.         im.save(str(x)+".png","png")#保存,自动命名成1,2,3,……格式是png。
  12.         x=x+1
  13.         time.sleep(1)#休眠一段时间,以免电脑IO太慢,造成保存失败,时间可以根据自己的电脑性能调节。
  14.         for j in xrange(1,3):#控制一个页面截图的次数。
  15.                 for k in xrange(1,11):#按下向下的次数,自己根据页面大小调节。
  16.                         win32api.keybd_event(40,0,0,0)#按下下方向键。
  17.                         win32api.keybd_event(40,0,win32con.KEYEVENTF_KEYUP,0)
  18.                         time.sleep(0.2)#休眠  
  19.                 im = ImageGrab.grab()
  20.                 im.save(str(x)+".png","png")
  21.                 x=x+1
  22.                 time.sleep(1)
复制代码

 

放几个我自己的截图~

120.png

121.png

122.png

可以看到,三部分有重叠,但是完全覆盖了一个页面。

问题三,页面合成,由于上面为了提高清晰度,造成一个页面分在多个截图中,所以我们要对截图进行合成。拼出完整的页面。

这个工作我是用matlab完成的,其实python也可以,但是我python学的不怎么样,,matlab用的比较多,所以大家见谅~

 

  1. clc,clear
  2. Ak=[];
  3. p1=imread('100.png');
  4. p2=imread('101.png');
  5. p3=imread('102.png');
  6. Ak=[p1(1:640,60:1250,:);p2(2:641,60:1250,:);p3(2:745,60:1250,:)];
  7. imwrite(Ak,['A.png']);
复制代码

 

A.png

B.png

 

这是合成的效果图。代码中的拼接数据得多次试验看效果才能确定,但是好在所以也没都是一样的,所以只要一个页面拼好了,其它的都一样可以用~

 

如果还有什么疑问,接着提出,我再解释~

模块:

http://www.pythonware.com/products/pil/

http://sourceforge.net/projects/pywin32/files/

by:

http://www.hi-pda.com/forum/viewthread.php?tid=1170354&extra=page%3D1

转载于:https://www.cnblogs.com/nbalive2001/archive/2013/05/21/3090098.html

  • 0
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值