2015-03-09 14:44:50
网上的在线文档有许多需要积分才能下载. 我对此颇有微词, 就不在这里说了. 网上也有一些免积分下载在线文档的软件, 如冰点文库和豆丁下载器之类, 但使用的时候不时会出现问题. 我了解了一下这些软件的原理, 发现它们采取的方式大概是先得到swf文件, 然后转成图片, 再处理得到文本或是转成pdf保存. 这种自动的方法如果整个流程中有一处过程出了问题的话就没有办法了.
为了避免这样的问题, 我们可以采用半自动的办法, 模拟软件的做法, 先得到文件的地址, 再直接抓屏得到图片, 图片也可以转成pdf文档保存. 如果你想从图片得到文本还是比较困难的, OCR识别只有一定的准确度, 需要校稿. 当然最好是能得到原始文档, 对百度文库好像还可以得到原始文档, 但对豆丁就不行了, 因为豆丁使用了压缩的swf文件. 虽然可以将其解压成swf, 但需要破解豆丁格式. 破解的方法, 网络上有一些过时的资料, 解压豆丁 V3 格式的 docin 文件的 Python 代码, 豆丁及百度文件格式描述. 虽然这些方法不适用于豆丁最新的文档格式, 但根据相同的原理还是可以破解豆丁的最新格式.
上面破解的办法难度稍大, 还有点麻烦, 我决定还是不绕这个弯了, 采取最笨最直接的办法, 直接抓屏保存图片. 这样的话什么限制也没有, 只要能看到, 就能得到.
如果文档页数很少, 手动操作就可以了, 但如果文档页数很多, 就需要借助一些自动化工具了. AutoHotKey做这件事最合适, 写个简单的脚本一键抓屏, 抓完后借助图像处理软件处理一下, 再转成pdf就可以了.
要自动抓屏, 首先是需要知道文档每一页的地址. 对于豆丁, 根据其网页源代码, 我发现每篇文档的地址格式如下:
<object type="application/x-shockwave-flash" data="http://pics.wanlibo.com/players/PageViewer.swf?rand=20150203" width="1050px" height="1500px"><param name="flashvars" value="productId=1064215702&pagenum=0&loadurl=page.douding.cn/docinfile2"></object>
只要将上面的productId
改为相应的文档编号, pagenum
改为相应的页数(从0开始), 保存为HTML文件, 用浏览器打开就可以看到每页文档的内容了.
知道了地址, 就可以写个脚本自动改变页面并抓屏保存图片了. 示例的脚本如下. 这只是原理性的示例脚本, 所有采用了最简单的实现方法, 你可以在此基础上改进改进.
# Language: ahk
!x::
Loop, 11 {
Page :=A_Index -1
FileName = A_%Page%.html
file := FileOpen(FileName, "w")
TestString =
file.Write(TestString)
file.Close()
run %FileName%
sleep 5000
send ^!{PrintScreen}
MouseMove, 510, 510
MouseClick, left, 520, 510
sleep 4000
send {ESC}
}
对百度文库的下载, 可能更简单一些, 参考如何免费下载百度文库的收费文档. 我没有实际试过, 不知道效果如何.