1. 程式人生 > 其它 >pdf2htmlEX linux 安裝踩坑指南

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 不香嗎

萬丈高樓平地起,守好一畝三分田。