Pandoc 是使用 Haskell 语言编写的一款跨平台、自由开源及命令行界面的标记语言转换工具,可实现不同标记语言间的格式转换,堪称该领域中的“瑞士军刀”。本篇以 Ubuntu 18.04 为例进行演示。

安装

安装 pandoc 可以通过如下方法

1
2
sudo apt update
sudo apt install pandoc

示例

使用 pandoc 可以进行很多种文本格式的转换,如 docx, markdown, textile, pdf 等等。下表更详细的列出:

Pandoc 可读取的源格式 Pandoc 可生成的目标格式
Markdown HTML格式:包括XHTML,HTML5及HTML slide
reStructuredText 文字处理软件格式:包括docx、odt、OpenDocument XML
Textile 电子书格式:包括EPUB(第2版及第3版)、FictionBook2
HTML 技术文档格式:包括DocBook、GNU TexInfo、Groff manpages、Haddock
DocBook 页面布局格式:InDesign ICML
LaTeX 大纲处理标记语言格式:OPML
MediaWiki TeX格式:包括LaTeX、ConTeXt、LaTeX Beamer
OPML PDF格式:需要LaTeX支持
Org-Mode 轻量级标记语言格式:包括Markdown、reStructuredText、textile、Org-Mode、MediaWiki标记语言、AsciiDoc
Haddock 自定义格式:可使用lua自定义转换规则

pandoc 的使用方法如下:

1
pandoc -f/-r 输入格式 -t/-w 输出格式 -o 输出文件 输入文件
  • -f 表示 输入格式:–from 格式,可用 -r 或 –read 格式 代替;
  • -t 表示 输出格式:-to 格式,可用 -w 或 –write 格式 代替;
  • -o 表示 输出文件:–output 文件;
  • -s 表示 输出单个文件: –standalone;

更多参考,可通过如下命令查看

1
man pandoc

下面演示几个转格式的例子

  1. docx 转 textile
1
pandoc -f docx -t textile -o redmine-heading.textile redmine-test.docx
  1. txt 转 pdf
1
2
3
# 需要安装 pdflatex,方法如下
# sudo apt install texlive-latex-base
pandoc test.txt -o test.pdf
  1. markdown 转 ipynb
1
pandoc numpy-test.md -o numpy-test.ipynb
  1. txt 转 html
1
2
3
pandoc -o output.html input.txt
# 生成一个文件
pandoc -s -o output.html input.txt
  1. markdown 转 txt
1
pandoc -f markdown -t latex hello.txt
  1. html 转 markdown
1
pandoc -f html -t markdown hello.html

更多例子参考:

https://pandoc.org/demos.html

如果不想通过命令手动转,可采用在线格式转换:

https://alldocs.app/convert-word-docx-to-textile

中文显示

PDF 中文显示需要安装 xelatex

1
2
sudo apt update
sudo apt install texlive-latex-base texlive-extra-utils texlive-latex-extra texlive-xetex

在 Ubuntu 中需要一些中文字体,可以把 Windows 上的字体拷贝进去,如把 Windows10 的字体拷贝进去

1
2
3
4
5
# 在 Ubuntu 系统上
mkdir -p /usr/share/fonts/truetype/windowsfont

# 把 Windows10 上的字体拷贝上面的目录,我这里以 WSL 为媒介
sudo scp -r /mnt/c/Windows/Fonts/* root@ubuntu-ip:/usr/share/fonts/truetype/windowsfont/

然后安装字体

1
2
3
4
mkfontscale
mkfontdir
# 如果不存在,可以使用命令安装:sudo apt install fontconfig
fc-cache -fv

查看字体

1
fc-list :lang-zh

此时,就可以在PDF中正常显示字体了。

中文换行

默认 pandoc 使用的 LaTeX 模板不支持中文换行,可以通过如下方法解决:

  1. 导出 LaTeX 模板
    1
    pandoc -D latex > template.latex
  2. 把命令:\XeTeXlinebreaklocale “zh” 添加到模板中,类似:
    1
    2
    3
    4
    $if(mathfont)$
    \setmathfont(Digits,Latin,Greek){$mathfont$}
    $endif$
    \XeTeXlinebreaklocale "zh"
  3. 指定新模板:
    1
    2
    # 把 Markdown 转出 PDF
    pandoc readme.md -o readme.pdf --pdf-engine=xelatex -V mainfont="Microsoft YaHei" --template=/disk0/ground/template.latex -M geometry:"top=1in,inner=1in,outer=1in,bottom=1in,headheight=3ex,headsep=2ex"

python 中调用

在 Python 中使用 pandoc,可以安装包 pypandoc 来调用系统安装的 pandoc 软件

1
pip install pypandoc

使用方法

1
2
3
4
5
6
7
8
# 指定 pandoc 软件位置
import os
os.environ.setdefault('PYPANDOC_PANDOC', '/usr/bin/pandoc')

# 把 docx 文件转为 textile 格式
import pypandoc

output = pypandoc.convert_file('somefile.docx', 'textile', outputfile="somefile.textile")

更多使用方法,如添加格式化参数请参考 pypandoc 官网

参考文献

  1. Pandoc a universal document converter
  2. 使用pandoc 生成带中文的pdf
  3. 用pandoc把markdown转化为pdf文档