更優(yōu)雅地把Markdown文件轉為PDF格式

markdown是什么無需在這里多言,一言以蔽之:人生苦短,快用markdown,懂的人自然知道它的眾多好處。

不過雖然markdown很好很強大,但并不是所有人都知道而且還會使用,有時候為了和人交流,還是需要轉為更通用的PDF格式的文檔。本文就是主要記錄一下最近在探索把markdown轉為PDF時候的一些歷程,以及最終找到的一種比較優(yōu)雅的方式。

pandoc及下載和安裝

pandoc是什么

pandoc是一個軟件,是一個能把千奇百怪的文檔格式互相轉換的神器,是一把文檔轉換的瑞士軍刀(swiss-army knife)。不多說,放一張其官網(http://www.pandoc.org)的圖,一圖勝千言,感受一下:

下載pandoc

下面以下載Windows下的pandoc為例:

安裝pandoc

下載pandoc安裝包之后,像安裝普通軟件一樣點開安裝就可以了。安裝完成之后,打開cmd命令行,輸入pandoc -v,如果正常顯示出類似下面的信息就表明安裝成功:

C:\Users\Administrator.PC-20170728DWIF>pandoc -v
pandoc 2.2
Compiled with pandoc-types 1.17.4.2, texmath 0.10.1.2, skylighting 0.7.0.2
Default user data directory: C:\Users\Administrator.PC-20170728DWIF\AppData\Roaming\pandoc
Copyright (C) 2006-2018 John MacFarlane
Web:  http://pandoc.org
This is free software; see the source for copying conditions.
There is no warranty, not even for merchantability or fitness
for a particular purpose.

走過的一些路,趟過的一些坑

下面是使用pandoc把markdown(以下簡稱md)文件轉為PDF所遇到的一系列的坑。

嘗試過的不合適的方案

下面涉及的轉換方法可以參見pandoc的使用文檔(http://www.pandoc.org/MANUAL.html),這里不再敘述細節(jié)。

  • 直接使用pandoc把md轉為PDF。問題:報錯,原因是電腦沒有安裝Latex解析引擎。
  • 裝好了MiKTex這樣一個Latex解析引擎之后,再轉,又失敗了,原因是不支持中文字體(md文件中有中文字體)。
  • 指定字體為宋體后再轉,雖然成功轉為了PDF文件,但是文件的字體、行間距、排版等樣式都比較丑陋,不滿意。
  • 在網上又搜了搜,再加上指定Latex模板文件轉,雖然能夠調整一些參數(shù)了,但一方面模板文件猶如天書般難懂,另一方面很多格式還是不能精細調整。
  • 變換一下思路,采取迂回戰(zhàn)術,按照md->HTML->PDF的路徑轉。于是先把md轉為HTML,HTML的樣式倒是挺美觀,然后在瀏覽器中使用瀏覽器的打印功能把HTML轉為PDF。然而還是存在文檔格式不能精細調整的問題。
  • 發(fā)現(xiàn)轉HTML的時候可以指定css樣式文件,在css樣式文件中可以配置標題、正文、段落的精細格式。奈何這種方法和Latex模板文件的缺點類似,投入/產出比過高,遂放棄。

一個不太合適的方案

在網上搜的時候,發(fā)現(xiàn)有一個Python三方庫叫pypandoc(文檔:https://pypi.org/project/pypandoc/),核心方法叫pypandoc.convert_file,支持一大堆參數(shù)。還是考慮到投入/產出比,我只是想安靜地轉一下md到PDF,并不想開發(fā)一個很吊的文件轉換工具,所以暫時沒必要去研究這個三方庫的API,以后有需要再研究吧。

最終采取的解決方案

最終轉換到另一種思路來,依然采用迂回戰(zhàn)術,不過是按照:md->docx->PDF,一試,發(fā)現(xiàn)這種方式很靠譜,主要是因為:一是md轉為docx很簡單,只需pandoc的一條命令就搞定,不需要額外裝其他的軟件;二是轉為docx文檔后,還可以在其中手動精細調整字體、字號、段落之類的格式,直到自己滿意為止。最后用Word也可以完美地把docx轉為PDF。

而且在生成的docx文檔中手工調完精細格式之后,還可以把docx文檔的格式模板另存為dot文檔模板文件保存,后面再生成docx文檔時不需要再一個個手工調格式了,只需把這個dot模板文件中的樣式全部導入即可(假設這個模板文件的名字為:md2doc-template.dot),導入方法簡要說明如下(這里以Microsoft Word 2013為例進行說明):打開從md文件轉出來的docx文檔(假設文檔名稱為:md-doc.docx),點擊開始菜單 > 樣式右下角的三角,彈出樣式對話框:

點擊樣式對話框下面的管理樣式按鈕,進入樣式管理對話框:

點擊樣式管理對話框左下角的導入/導出按鈕,打開導入/導出對話框:

下面的導入/導出對話框中,保持左邊的不變,點擊右邊的關閉文件按鈕:

然后點擊打開文件,打開剛剛保存的模板文件md2doc-template.dot

然后執(zhí)行下圖的操作:


此時就大功告成了,模板文檔中的樣式都復制到新文檔的樣式中來了。

最后,md轉為docx文檔的pandoc命令類似于這樣:
pandoc text.md -o text.docx

這種方案最為優(yōu)雅,遂采用之。

腳本封裝,支持批量轉換

  • 把轉換命令封裝成bat批處理腳本,以后再進行轉換的時候只需簡單雙擊一下bat腳本即可,比如封裝成convert.bat文件,內容如下:
pandoc text.md -o text.docx && pause
  • 批量處理:假如幾十上百個md文件要批量轉為docx文件,難道要手工一個個復制這些文件名和pandoc命令去轉換嗎?完全不需要,一個bat腳本搞定(convert.bat):
@echo off
:: 遍歷當前文件夾下的所有后綴名為md的文件
for /f %%a in ('dir /b *.md') do (
    :: 執(zhí)行pandoc命令,把每個md文件都轉為docx文件,docx文件的文件名為:md文件名.md.docx
    pandoc %%a -o %%a.docx
)
pause

假設當前文件夾下有3個md文件test1.md、test2.md、test3.md,他們的內容都為:

# 一級標題1
## 二級標題1
* 列表項1
* 列表項2
    
## 二級標題2
正文1-1

# 一級標題2
正文2-1

# 一級標題3
表格1:

姓名|年齡|性別
---|---|---
張三|30|男
李四|28|男
王五|29|男

雙擊執(zhí)行convert.bat后,生成了3個docx文件:

打開test1.md.docx,發(fā)現(xiàn)整體格式還不錯,并且還支持md的表格語法:

小結

  • pypandoc庫以后有需要了可以進一步研究一下。
  • 在決定采取一種方案解決問題之前,首先要考慮投入/產出比,是否值得采用這種方案。
最后編輯于
?著作權歸作者所有,轉載或內容合作請聯(lián)系作者
【社區(qū)內容提示】社區(qū)部分內容疑似由AI輔助生成,瀏覽時請結合常識與多方信息審慎甄別。
平臺聲明:文章內容(如有圖片或視頻亦包括在內)由作者上傳并發(fā)布,文章內容僅代表作者本人觀點,簡書系信息發(fā)布平臺,僅提供信息存儲服務。

相關閱讀更多精彩內容

友情鏈接更多精彩內容