Latex格式html文件转换pdf和docx文档

最近有需求将包含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
最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 202,905评论 5 476
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 85,140评论 2 379
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 149,791评论 0 335
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 54,483评论 1 273
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 63,476评论 5 364
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 48,516评论 1 281
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 37,905评论 3 395
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 36,560评论 0 256
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 40,778评论 1 296
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 35,557评论 2 319
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 37,635评论 1 329
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 33,338评论 4 318
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 38,925评论 3 307
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 29,898评论 0 19
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 31,142评论 1 259
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 42,818评论 2 349
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 42,347评论 2 342

推荐阅读更多精彩内容

  • Pandoc 使用 前段时间换了电脑,直接拷过来的MarkDownPad出了点问题,再加上VSCode的MarkD...
    haop阅读 34,089评论 2 17
  • 使用Markdown写东西很简单,但是一直以来在写东西时使用数学公式是一件很麻烦的事情。这也限制了许多内容在网上的...
    luke_bei_阅读 14,117评论 0 9
  • 文件格式(或文件类型)是指电脑为了存储信息而使用的对信息的特殊编码方式,是用于识别内部储存的资料。比如有的储...
    一只不靠谱的猿_阅读 3,633评论 0 10
  • 今天听了一个电台的节目,节目的名字的叫你的付出,时光都会懂。人呢,总会抱怨,这时候肯定会有人说自己的付出总会得不到...
    Jange阅读 1,984评论 0 5
  • 经常在新闻里看到“高校男生10000朵玫瑰求爱被拒”、“大学生当众向同性示爱”、“某男子当街求婚,结局出人意外”等...
    甘棠gt阅读 681评论 6 10