最近有需求將包含latex格式的html文檔轉換成pdf和docx文檔的需求,由于之前完全沒接觸過颅眶,最近幾天調研和實驗了一番后將格式轉換的關鍵點都實驗成功都哭,總結記錄一下。
轉換原理
各種轉換工具對比之后選擇了號稱“格式轉換瑞士軍刀”的pandoc吁伺,pandoc功能強大且開源饮睬,從官方說明文檔就知道多厲害了。
由于歷史原因箱蝠,需要轉換的html格式文件比較復雜续捂,直接用pandoc轉換到docx,有極少數格式會出問題宦搬,導致轉換后的docx文件打開會提示格式錯誤牙瓢。最后研究發(fā)現mathjax對各種格式的兼容處理比較強大,采用mathjax將原始latex文件轉換成mml格式后间校,再給到pandoc轉換docx就可以了矾克。
mathjax轉換部分找同事搭建了一個node.js服務提供轉換接口和css控制,只需要調用接口將原始latex數據轉換成mml格式憔足,再講轉換后的格式替換掉原始html文件中的latex部分胁附,最終生成包含mml格式的html文件。
環(huán)境搭建
轉換環(huán)境包括:
- mathjax node.js服務
- pandoc
- TeX Live
- stack工具(Haskell Platform)
mathjax服務是用來將原始html文件轉換成mml格式(如果你面對的latex格式并不復雜且很標準滓彰,那么不需要這部分控妻,直接用pandoc處理問題也不大),我們這里需要mathjax處理是因為我們有遇到各種奇怪的latex格式揭绑,且pandoc對latex格式判斷比較嚴格弓候,通過兼容性較好的mathjax處理一遍后有明顯效果。
pandoc是最終用來做格式轉換的工具他匪,為了安裝pandoc菇存,需要用到Haskell環(huán)境,因此需要安裝stack來部署和管理整個Haskell邦蜜。
pandoc不提供docx到pdf的直接轉換依鸥,只能采用mml到pdf的轉換方式,但是需要額外的latex轉換引擎支持才能做到悼沈,pandoc官方推薦使用TexLive贱迟。
TexLive安裝
首先下載安裝包
解壓后執(zhí)行install-tl按照提示輸入I進行安裝姐扮,經過漫長下載等待后完成。安裝成功后xelatex可執(zhí)行程序目錄在/usr/local/texlive/2016/bin/x86_64-linux/ 衣吠,需要記得將這個目錄加入到PATH環(huán)境變量中溶握。
pandoc安裝
我是選擇源碼安裝方式,自己下載了pandoc-1.19.2
先安裝Stack工具:
curl -sSL https://get.haskellstack.org/ | sh
按照pandoc安裝說明文檔蒸播,切換到pandoc解壓目錄睡榆,執(zhí)行:
stack setup
stack install --test
安裝成功后,需要注意pandoc可執(zhí)行文件默認放到了/root/.local/bin袍榆,需要修改PATH環(huán)境變量才能找到胀屿。
轉換命令
轉換到docx的命令如下:
pandoc -s --mathml filename.mml -o output.docx
轉換到pdf的命令如下:
pandoc --latex-engine=xelatex filename.html -o output.pdf
還有很多其他pandoc轉換命令和兼容格式,具體參考官方文檔包雀。
轉換結果示例:
轉換pdf中文編碼處理
pandoc默認轉換到pdf的時候宿崭,中文處理會有問題,顯示不出來才写,需要添加字體支持葡兑。
pandoc -s old.html.html --latex-engine=xelatex -V mainfont=SimHei -o 20.pdf
上述命令指定用黑體轉換中文,通過mainfont參數指定中文字體赞草,但是前提是你的系統(tǒng)里面已經安裝了相關的中文字體支持讹堤,我在centos安裝中文,采用了這個鏈接的方法厨疙。查看系統(tǒng)支持的字體命令是 fc-list洲守。
從word中提取latex公式
同樣可以通過pandoc將word中的latex提取出來,具體做法就是將pandoc轉換為markdown格式之后就可以寫程序匹配出latex公式數據($$之間的部分)
pandoc -s aaa.docx -t markdown -o aaa.md