批量把pdf转换为txt并格式化

今天看到骨头兄的《一个命令把几千张照片压缩了》,我也在用相似的命令,我一句命令把几十本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还需要整理一下,需要做如下格式化

  1. 把开头不是空格的句子合并到上一行的结尾,毕竟用“-layout”后,一个段落就被拆成多行了。
  2. 删掉空行和只有一个数字的行(是pdf的页码)
  3. 把每行的开头统一为4个半角空格(即两个中文)
  4. 部分文本的英文双引号“””转换出来后变成中文的全角双引号“"”,要把它转换回来
  5. 把转换好的结果输出到上一级目录的“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

几十个文本格式化一气呵成,太爽了!

This entry was posted in 经验技巧 and tagged , . Bookmark the permalink.

8 Responses to 批量把pdf转换为txt并格式化

  1. chenfengyuan says:

    不错,感觉pdftotext速度蛮快的。不过,可以在其中加一个echo $i,这样就可以看到进度拉。

    回复回复
  2. muzuiget says:

    @chenfengyuan
    好主意。

    回复回复
  3. tchaikov says:

    调用多次 sed,为什么不用 -e 参数一次搞定呢?

    回复回复
  4. muzuiget says:

    @tchaikov
    是本人水平问题,我看了一下手册,测试一下,文章已修改,多谢提示!

    回复回复
  5. xiooli says:

    这样简单些:for i in *.pdf; do pdftotext -layout -nopgbrk “$i”; done
    ps:你的验证很考算数呢。

    回复回复
  6. muzuiget says:

    @xiooli
    oh yeah,这样确实简单点,如果用find的话能同时处理子目录下的pdf吧。
    PS:不开这个插件很容易收到垃圾评论啊。

    回复回复
  7. bones7456 says:

    哈哈,linux又胜利了,脚本党又胜利了~

    回复回复
  8. 雪落 says:

    我的天啊,找死我了!终于让我在google结果第10页找到了

    回复回复

发表评论

您的电子邮箱不会被公开。 标记为 * 的区域必须填写

*

您可以使用这些 HTML 标签和属性: <a href="" title=""> <abbr title=""> <acronym title=""> <b> <blockquote cite=""> <cite> <code> <del datetime=""> <em> <i> <q cite=""> <strike> <strong> <pre lang="" line="" escaped="">