最近有需求将包含latex格式的html文档转换成pdf和docx文档的需求,由于之前完全没接触过,最近几天调研和实验了一番后将格式转换的关键点都实验成功,总结记录一下。
转换原理
各种转换工具对比之后选择了号称“格式转换瑞士军刀”的pandoc,pandoc功能强大且开源,从官方说明文档就知道多厉害了。
由于历史原因,需要转换的html格式文件比较复杂,直接用pandoc转换到docx,有极少数格式会出问题,导致转换后的docx文件打开会提示格式错误。最后研究发现mathjax对各种格式的兼容处理比较强大,采用mathjax将原始latex文件转换成mml格式后,再给到pandoc转换docx就可以了。
mathjax转换部分找同事搭建了一个node.js服务提供转换接口和css控制,只需要调用接口将原始latex数据转换成mml格式,再讲转换后的格式替换掉原始html文件中的latex部分,最终生成包含mml格式的html文件。
环境搭建
转换环境包括:
- mathjax node.js服务
- pandoc
- TeX Live
- stack工具(Haskell Platform)
mathjax服务是用来将原始html文件转换成mml格式(如果你面对的latex格式并不复杂且很标准,那么不需要这部分,直接用pandoc处理问题也不大),我们这里需要mathjax处理是因为我们有遇到各种奇怪的latex格式,且pandoc对latex格式判断比较严格,通过兼容性较好的mathjax处理一遍后有明显效果。
pandoc是最终用来做格式转换的工具,为了安装pandoc,需要用到Haskell环境,因此需要安装stack来部署和管理整个Haskell。
pandoc不提供docx到pdf的直接转换,只能采用mml到pdf的转换方式,但是需要额外的latex转换引擎支持才能做到,pandoc官方推荐使用TexLive。
TexLive安装
首先下载安装包
解压后执行install-tl按照提示输入I进行安装,经过漫长下载等待后完成。安装成功后xelatex可执行程序目录在/usr/local/texlive/2016/bin/x86_64-linux/ ,需要记得将这个目录加入到PATH环境变量中。
pandoc安装
我是选择源码安装方式,自己下载了pandoc-1.19.2
先安装Stack工具:
curl -sSL https://get.haskellstack.org/ | sh
按照pandoc安装说明文档,切换到pandoc解压目录,执行:
stack setup
stack install --test
安装成功后,需要注意pandoc可执行文件默认放到了/root/.local/bin,需要修改PATH环境变量才能找到。
转换命令
转换到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参数指定中文字体,但是前提是你的系统里面已经安装了相关的中文字体支持,我在centos安装中文,采用了这个链接的方法。查看系统支持的字体命令是 fc-list。
从word中提取latex公式
同样可以通过pandoc将word中的latex提取出来,具体做法就是将pandoc转换为markdown格式之后就可以写程序匹配出latex公式数据($$之间的部分)
pandoc -s aaa.docx -t markdown -o aaa.md