上次用Python写好翻译doc文档小软件后就展示给宝宝,我:“宝宝,过来给你个小软件”
她:“干什么用哒?”
我:“给你翻译Word文档的”
她:“怎么用啊?”
我:“选择一个docx文档,再按翻译按钮就好了”
她:“哇,这么厉害!”
。。。。。。
她:“可以翻译PDF吗?好多文档都是PDF的哦”
我:“这个。。。可以有”
她:“好棒啊!”
然后,又一阵。。。。。。
“自己吹下的牛皮,含泪也要实现。” 不过,这可不是吹牛皮。之前接触过提取PDF内容的事情,所以还是有把握的。
从PDF里面提取文本内容有很多种方法,但是真正适合的还是要研究一番才能做出正确的选择。选择的标准就是:适合Windows,速度要快。
一、对比选取Python抽取pdf文档库
pdfminer是纯Python实现的PDF内容提取的库,很适合Python开发,Linux和Windows上使用都很方便。
去github搜索“pdfminer”,排在第一的是老的版本,只支持Python 2。支持Python 3的版本叫做: pdfminer.six,也支持Python2,它的地址是:
https://github.com/pdfminer/pdfminer.six
然而,它的速度很慢,因为是纯Python写的。有多慢呢?看看下面它与pdftotext的对比测试吧:
测试文件大小: 2.1MB
(1)pdftotext 用时: 1.031s
time ./bin/pdftotext -enc UTF-8 z.pdf z.txt
real 0m1.031s
user 0m1.004s
sys 0m0.008s
(2)pdfminer 用时: 2m29.226s == 149.226s
time pdf2txt.py z.pdf
real 2m29.226s
user 2m29.016s
sys 0m0.064s
两者相差149倍!!我家宝宝是个急脾气,让她等那么长时间,我还能好过吗?果断舍弃pdfminer,选择pdftotext。
二、使用pdftotext来抽取PDF文档
这是一个基于xpdf用C++写的命令行工具,速度杠杠的(见上面的对比)。有人也把它封装成了Python库——pdftotext,但是要编译成动态库才能被Python所用。这个封装基于poppler库(基于xpdf)。
然而,要在Windows上编译这个Python库太不容易了。基本的编译环境有VC和minGW,具体见:
https://wiki.python.org/moin/WindowsCompilers
我选择minGW编译环境,编译Python库时各种依赖太复杂。断断续续整了几天未果,只好放弃使用这个Python封装库。
三、subprocess调用pdftotext.exe
pdftotext命令行工具有Windows版本的可执行文件下载:
https://www.xpdfreader.com/download.html
那我就用subprocess调用即可。这样我开发省事儿,宝宝用着速度也够快,一举两得。
路线定好后,程序写起来就很快了。时间多花在路线定制上,好的路线值得花费时间去制定,往往能得到事半功倍的效果。
四、用pyinstaller发布翻译PDF文档程序
上一个版本用pyinstaller打包程序很容易,因为除了程序文件没有其它附加文件,而这次程序包含了pdftotext.exe等文件,导致打包不是那么顺利。这其中的经验,我将总结为一篇专门讲解pyinstaller的文章,敬请期待。
五、翻译软件:transdocx的运行
(1)从源代码运行:
直接运行transdocx.py即可。当然,相应的Python库要先安装好。
另外,源代码文件夹 bin/ 下面的pdftotext.exe不是翻译软件,而是被翻译软件用来从PDF中提取文本的程序,不要直接运行它。
(2)下载打包好的翻译软件
下载transdocx-*.exe后,直接双击即可运行。
最后,跟上次一样,关注猿人学Python公众号发消息“翻译”获得软件下载地址,发送“翻译源码”获得本软件的源代码。
我的公众号:猿人学 Python 上会分享更多心得体会,敬请关注。
***版权申明:若没有特殊说明,文章皆是猿人学 yuanrenxue.com 原创,没有猿人学授权,请勿以任何形式转载。***