今天看到骨头兄的《一个命令把几千张照片压缩了》,我也在用相似的命令,我一句命令把几十本pdf格式的小说转换成txt,再一句命令把所有txt都格式化好。
之所以把pdf转成txt,是我打算放到手机上看,我这等穷人买不起支持pdf的手机,只好最大限度榨取手机的剩余价值了。在乘地铁的无聊时打发时间,话说我是很少在电脑上看小说的, 有电脑用当然做些只能电脑做的事。
虽然很多网站号称提供txt小说下载,不过很多格式都很乱,还到处插上自己的网址,还不如自己下载pdf自己转换整理。
安装转换软件pdftotext
开始我在google里搜一下有什么pdf转txt的软件,不用说肯定会搜到一大堆所谓绿色破解版的东西啦,还不知道支不支持批量转换,一个一个手动转岂不累死?我加“linux”关键字看看有没有linux下使用的。果然,找到了一个“pdftotext”命令,是命令就好办,能配合脚本批处理了。
查了下,archliux库里已经有了,在“poppler”这个包里,还需要这个编码包“poppler-data”来支持中文,立马安装
sudo pacman -S poppler poppler-data
ubuntu大概也是这两个包吧
sudo apt-get install poppler poppler-data
Windows的用户也可以到这个页面下载编译好的压缩包,其实这个程序是xpdf项目的一部分。
安装好后直接运行“pdftotext”,就能看到简要用法,这个包里还有几个装换到其它格式的工具,如html,装好后用“pdf2”或“pdfto”然后按TAB键查看。
批量转换
因为pdftotext不支持同时处理多个pdf,所以用批处理要脚本搞定,打开终端,进入放置pdf的目录,运行下面命令
find ./ -name '*.pdf' | while read i; do pdftotext -layout -nopgbrk $i; done
很快就在当前目录下输出很多txt文件,“-layout”参数表示保留页面布局,“-nopgbrk”表示不输出换行符,自己对比一下就知道区别了。
文本格式化
我是有点完美主义的,转换好的txt还需要整理一下,需要做如下格式化
- 把开头不是空格的句子合并到上一行的结尾,毕竟用“-layout”后,一个段落就被拆成多行了。
- 删掉空行和只有一个数字的行(是pdf的页码)
- 把每行的开头统一为4个半角空格(即两个中文)
- 部分文本的英文双引号“””转换出来后变成中文的全角双引号“"”,要把它转换回来
- 把转换好的结果输出到上一级目录的“txt”文件夹
要知道用要实现以上步骤用鼠标手动修改是怎样一件恐怖的事吗?简单地找一段片断做测试,搞定好应用到全部文件,执行下面代码(上述要求按管道符分割来看)
find ./ -name '*.txt' | while read i; do cat $i | awk '{if ($0 ~ "^[[:space:]]") {printf "\n"$0} else {printf $0}}' | sed -e '/^[[:space:]]*[[:digit:]]*$/d' -e 's/^[[:space:]]\+/ /' -e 's/"/"/g' > "../txt/$i"; done
几十个文本格式化一气呵成,太爽了!

不错,感觉pdftotext速度蛮快的。不过,可以在其中加一个echo $i,这样就可以看到进度拉。
@chenfengyuan
好主意。
调用多次 sed,为什么不用 -e 参数一次搞定呢?
@tchaikov
是本人水平问题,我看了一下手册,测试一下,文章已修改,多谢提示!
这样简单些:for i in *.pdf; do pdftotext -layout -nopgbrk “$i”; done
ps:你的验证很考算数呢。
@xiooli
oh yeah,这样确实简单点,如果用find的话能同时处理子目录下的pdf吧。
PS:不开这个插件很容易收到垃圾评论啊。
哈哈,linux又胜利了,脚本党又胜利了~
我的天啊,找死我了!终于让我在google结果第10页找到了