pdf2htmlEX linux 安装踩坑指南

组里让调研在 linux 上实现 PDF 转 html 的工具,弄了差不多快四天,疯狂踩坑,不停地 Debug,终于把这个小小的活给搞定了,头都大了,觉得实在有必要复盘记录一下,不沉淀的话就没办法消化进步。一开始是在组里的服务器(Linux系统)上进行试验的,两个服务器已经被我装包装的乱七八糟了,所以装了 Ubuntu 18.04 的虚拟机,又按照自己写的文档试验了一遍,然鹅还是遇到了各种各样的 bug,再让我装一遍也不保证能一下成功。其实还有一些其他的 pdf 转 html 的工具,但是因为之前在 Windows 上用的 pdf2htmlEX 这个包师兄反馈说效果还不错,所以还是首选选择这个包在 Linux 上的安装,实在不行再去研究其他的包。

在 linux 上安装 pdf2htmlEX 有两种方案,一种是直接拉取 docker,另一种是源码安装。如果不是实在闲的没事干真的不建议源码安装,因为一装,大半天就没了,处理各种包的依赖报错着实是一件非常头大的事情。经历过这次工作,真正体会到了 docker 的香!

方案一:利用 docker

优点:非常简单,直接拉取pdf2htmlEX 的 Docker 镜像后即可使用;隔离环境,不用事先安装各种包及考虑各种包之间的依赖。
缺点:需要事先安装 Docker
参考:https://github.com/coolwanglu/pdf2htmlEX/wiki/Download
https://hub.docker.com/r/bwits/pdf2htmlex/

步骤:

  1. 在装有 Docker 的 linux 系统上运行:docker pull bwits/pdf2htmlex
    (可能需要 root权限)

运行 docker images 可以看到 bwits/pdf2htmlex 已经被拉取下来了:

  1. 使用 pdf2htmlEX 进行 pdf 转 html

将 pdf_files 文件夹传到 linux 上,并新建一个 html_files 用于存放转换好的 html 文件。

运行:docker run -ti --rm -v ~/pdf2html:/pdf2html bwits/pdf2htmlex pdf2htmlEX --dest-dir /pdf2html/html_files /pdf2html/pdf_files/test_1.pdf 就可以将 “~/pdf2html/pdf_files/test_1.pdf” 转换为 “test_1.html” 存放在 “~/pdf2html/html_files” 文件夹里面了。

这里注意,docker -v 命令是将宿主机的目录挂载到容器目录,即指定本地目录与 docker 目录的一一对应,冒号左边是宿主机目录,右边是容器的目录。--dest-dir 指定生成的 html 文件存放的位置,要用容器目录的绝对路径“/pdf2html/html_files”;最后一个参数 “/pdf2html/pdf_files/test_1.pdf” 也是用容器目录指示出 pdf 文件存放的位置。

也可以在 python 中运行 docker 命令:

import os
files = os.listdir('./pdf_files/')
for file in files:
    cmd = r"docker run -ti --rm -v ~/pdf2html:/pdf2html bwits/pdf2htmlex pdf2htmlEX --dest-dir /pdf2html/html_files /pdf2html/pdf_files/" + file
    # print(cmd)
os.system(cmd)

方案二:源码安装

[源码安装就是没有固定的套路,不知道会遇到什么样的报错,也不知道是哪一步/哪几步使得问题被解决,有时候成功了就是瞎猫碰上死耗子,再来一遍可能又不行了,但我还是忍不住在这上面花了很长时间琢磨,一个一个解决报错,debug,其实是自己在跟自己较劲,不过能解决掉的话,即使其中有运气成分,也还是会有豁然开朗的成就感的,在这个过程中,自认为是有收获的,没有虚度时光的空虚感。]

优点:不需要 Docker
缺点:安装非常非常非常麻烦,要预先安装各种包,可能要解决包之间的依赖冲突。
参考:https://github.com/coolwanglu/pdf2htmlEX/wiki/Building
https://gist.github.com/mohammedyunus009/914ea2b3cb32d0a196bb58d5892f6325
(主要是参考的第二个链接中的脚本,但是里面有的步骤存在问题,会导致安装出错,所以请按照下面的步骤安装)

源码的安装主要分为如下四步:(需要在root权限下)

  1. 安装依赖包:(这里是在 Ubuntu上进行测试的,所以使用 apt-get,其他Linux 系统请使用对应的安装命令)
apt-get update
apt-get install -qq -y cmake gcc libgetopt++-dev git   # 脚本中的 -qq不行的话改为 -f,-f 表示强制执行
apt-get install -qq -y pkg-config libopenjpeg-dev libfontconfig1-dev libfontforge-dev poppler-data poppler-utils poppler-dbg
# 这里安装了很多包,如果偶有一两个没装成功的,可以先放过
  1. 安装 poppler 包(这部分和脚本中的一样)
wget http://poppler.freedesktop.org/poppler-0.33.0.tar.xz
tar -xvf poppler-0.33.0.tar.xz
cd poppler-0.33.0/
./configure --enable-xpdf-headers
make
make install
  1. 安装 fontforge(注意这一步不是按照脚本中的git clone 方式来的,因为git clone下来的包安装会出错)
    打开 pdf2htmlEX 的作者提供的 fontforge 包的链接:https://github.com/coolwanglu/fontforge/tree/pdf2htmlEX
    手动下载,并传到 linux 系统上
    然后按照里面的 INSTALL-git.md 进行安装:
./autogen.sh
./configure
make
sudo make install

【注】fontforge 这个包的安装是关键,之前安装了很多次均失败,上述方式是测试过可以成功安装的,如有报错请尝试解决。这一步安装成功不报错的话,后面就会比较顺利。从这一步往后有参考这个博客:https://blog.csdn.net/paulluo0739/article/details/54286889

  1. 安装 pdf2htmlEX
git clone --depth 1 https://github.com/coolwanglu/pdf2htmlEX.git   # git clone 可能会因为网络原因不成功,换个时间重试)
cd pdf2htmlEX/
export PKG_CONFIG_PATH=/usr/local/lib/pkgconfig    # 这一步要有,脚本上没写
cmake .
make
sudo make install

(到这里就安装成功了,但是还需要最后一步才能正常调用)

echo 'export LD_LIBRARY_PATH=/usr/local/lib:$LD_LIBRARY_PATH' >> ~/.bashrc
source ~/.bashrc

运行 pdf2htmlEX -h 出现 pdf2htmlEX 的帮助信息:

将 pdf_files 文件夹中的 test_1.pdf 转换为 html 放在 html_files:

pdf2htmlEX --dest-dir html_files pdf_files/test_1.pdf

也可以像方案一中一样用 os.system() 在 python 中调用。


上面两个方案写完了文档就交工了,然后又自己在虚拟机上进行测试,结果还是遇到各种各样的问题:

  1. 问题:http://poppler.freedesktop.org/poppler-0.33.0.tar.xz 访问不了,下载不下来
    解决:在浏览器中下载,手动放到目录

  2. 问题:./configure --enable-xpdf-headers 报错包缺失:No package 'libopenjp2' found
    解决:虚拟机是 14.04版本,可能没有 libopenjp2 包,计划安装18.04版本的虚拟机再试试。

[以下为在新安装的 linux 18.04 测试安装遇到的问题]

  1. 问题:’ libgetopt++-dev’ 安装不成功


解决:和问题4一样,更换了源就可以安装了

  1. 问题:apt-get install -qq -y pkg-config libopenjpeg-dev libfontconfig1-dev libfontforge-dev poppler-data poppler-utils poppler-dbg 这条命令中,有几个没有安装成功。
    解决:更换源(https://www.jianshu.com/p/f2d386bc0d5c),Linux 自带的源很少,很多包都没有。
    apt-get install poppler-dbg 成功安装 popper-dbg
    apt-get install libopenjpeg-dev 成功安装 libopenjpeg-dev
    (因为有些包找不到而卡了好久,如果早点换源早就解决了。。。)

  2. 同样遇到了问题2:No package 'libopenjp2' found
    解决:apt-get install libopenjp2-7 不管用,还是需要 ‘libopenjp2’
    apt-get install libopenjp2-tools 不管用
    apt-get install libopenjp2-7-dev 可以了,不知道是单这一步起作用了,还是加上前两步一起

  3. 回头解决问题3:apt-get install libgetopt++ (心得:多试试多撞撞,总能碰上死耗子)
    继续解决问题4:apt-get install libfontforge-dev 安装好了 libfontforge-dev

  4. 安装 fontforge 时运行 ./autogen.sh 出现:

    解决:apt-get install automake 成功解决

  5. fontforge 安装中的 make 这一步:

    (先不要一上来就去搜报错信息,尝试仔细看和分析报错信息,深入研究,找到问题根源。)
    直觉应该是缺包,然鹅并不是,整了一天还是没有解决orz。已经在这个小工作上耗费了快一周的时间了,还是没有摸索出源码安装的可用套路。十一月已经过去三分之一了,主线工作却还没有做,所以不能够继续在这里花费时间了,暂时把这个幽灵一样的bug放一放,以后有心情再回来解决吧,虽然大概率是不会回来了。


感想:客观评价这件事可以做到的话,只要不放弃,就一定会解决问题达到目标。这次的任务自认为完成得还不错,花了很多时间,更多的是在较着一股劲,所以坚持到了最后。Docker 安装的教训:成功运行的命令一定要立刻记录下来,不要顾着嘚瑟,否则很快就会忘记,后面遇到同样的坑还是会往里跳。唯一可以超越别人的长处:吸取教训并牢记,不再犯同样的错误。在解决bug的过程中,不知道是哪个/哪几个步骤导致成功,训练出的是一种找原因和解决问题的套路。再复杂的事情都是有规律可循的:粉色和蓝色表示警告,不用管;红色表示错误;make 步骤也是在每个文件夹中迭代做同样的步骤。既然知道了复杂的事情都是有规律的,再面对复杂的信息就不必手足无措了,有时候只是因为时间有限,没办法研究很久,所以无法解决,只是一种时间和精力的取舍罢了。一周的折腾,最大的经验教训就是,在 linux 上装东西,千万不要想不开用源码安装,用 docker 不香吗

posted @ 2021-11-10 09:22  胡萝不青菜  阅读(2351)  评论(5编辑  收藏  举报