Markdown文件批量轉(zhuǎn)PDF
Typora
提供了單文件的PDF轉(zhuǎn)換功能,但沒(méi)有把這個(gè)功能集成到命令行里咐吼,因此對(duì)于需要同時(shí)轉(zhuǎn)換多個(gè)markdown文件時(shí)就比較麻煩了——因此這個(gè)小腳本主要支持批量轉(zhuǎn)換Markdown
為
1.所需工具pandoc、wkhtmltopdf
-
wkhtmltopdf——是一個(gè)使用 Qt WebKit 引擎做渲染的喘沿,能夠把html 文檔轉(zhuǎn)換成 pdf 文檔 或 圖片(image) 的命令行工具奥帘。(強(qiáng)調(diào)一下:是 “命令行工具” )
- 【下載請(qǐng)點(diǎn)擊這里】 【http://wkhtmltopdf.org/downloads.html】
- 設(shè)置環(huán)境變量
- 通過(guò)命令行:
wkhtmltopdf -V
檢驗(yàn)是否安裝成功
-
Pandoc——是一個(gè)由 John MacFarlane 開(kāi)發(fā)的通用文檔轉(zhuǎn)換工具骆莹,可以支持大量標(biāo)記語(yǔ)言之間的格式轉(zhuǎn)換,例如 Markdown 靶草、Microsoft Word蹄胰、PowerPoint、 Jupyter Notebook爱致、HTML烤送、PDF、LaTeX糠悯、Wiki帮坚、EPUB 格式之間的相互轉(zhuǎn)換。官方稱之為該領(lǐng)域中的“瑞士軍刀”互艾,并且給出了一個(gè)格式轉(zhuǎn)換的示意圖试和。
Pandoc 可以自動(dòng)解析 Markdown 文件里的圖片鏈接,所以不論是本地存儲(chǔ)的圖片纫普,還是圖床上的圖片阅悍,都可以正確轉(zhuǎn)換并且顯示到 pdf 文件里。
- 下載:https://github.com/jgm/pandoc
- 設(shè)置環(huán)境變量
- 通過(guò)命令行:
pandoc -v
檢驗(yàn)是否安裝成功
2.文檔
采用之前很火”程序員菜譜”昨稼,其項(xiàng)目結(jié)構(gòu)為多層次的文件夾和markdown文件組成节视。
E:.
├─.github
│ └─workflows
├─dishes
│ ├─braised
│ │ └─紅燒肉
│ ├─breakfast
│ ├─condiment
│ ├─dessert
│ │ ├─提拉米蘇
│ │ └─烤蛋撻
│ ├─drink
│ │ └─百香果橙子特調(diào)
│ │ └─imgs
│ ├─home-cooking
│ │ ├─香干芹菜炒肉
│ │ ├─香菇滑雞
│ │ ├─雞蛋羹
│ │ └─黃油煎蝦
│ ├─semi-finished
│ │ └─速凍湯圓
│ ├─soup
│ │ ├─昂刺魚(yú)豆腐湯
│ │ └─西紅柿土豆燉牛肉
│ ├─staple
│ │ ├─pizza
│ │ ├─日式咖喱飯
│ │ ├─烙餅
│ │ └─老友豬肉粉
│ └─template
│ └─示例菜
└─tips
├─advanced
└─learn
3.批量執(zhí)行腳本
- 提供批量轉(zhuǎn)換功能
- 文件夾嵌套處理
- 統(tǒng)一導(dǎo)出到當(dāng)前目錄的
./output/
下
md2pdf
直接采用Pandoc轉(zhuǎn)PDF的方法不太好使,所以采取了折中的方案:先將
Markdown
用Pandoc轉(zhuǎn)換為HTML
,然后再用wkhtmltopdf完成PDF轉(zhuǎn)換假栓。Pandoc轉(zhuǎn)換為HTML
幾乎完美寻行,但是需要補(bǔ)充HTML頭部以及CSS樣式等。所以前端大佬可以直接修改html_head.txt
中的文件完善匾荆。
import pdfkit
import pypandoc
import os
from argparse import ArgumentParser
# 輸出目錄
OUTPUT_DIR = "output/"
os.makedirs(OUTPUT_DIR, exist_ok=True)
def get_file_name(mk_file_path, file_list, outlist):
"""找到mk_file_path路徑下的所有.md文件"""
print(f'【{mk_file_path}】Markdown文件如下:')
for root, dirs, files in os.walk(mk_file_path):
for f in files:
each = os.path.join(root, f)
if ".md" in each:
file_list.append(each)
filename = each.replace('.md', '.pdf')
f = filename.split("\\")[-1]
outlist.append(os.path.join(OUTPUT_DIR, f))
print('檢索完畢')
print(f"一共有{len(outlist)}個(gè)文件, 分別為{outlist}")
def convert(input_file, output_file):
pypandoc.convert_file(input_file, 'html', outputfile='tmp.html')
html_head_file = open("html_head.txt", "r", encoding='utf-8')
html_head = html_head_file.read()
html_head_file.close()
html_tail = "\n</body>\n</html>"
html_body_file = open('tmp.html', "r", encoding='utf-8')
html_body_txt = html_body_file.read()
html_body_file.close()
html_body = html_head + html_body_txt + html_tail
# 先創(chuàng)建臨時(shí)的html文件
with open('tmp.html', 'w', encoding='utf-8') as f:
f.write(html_body)
f.close()
# 再將html文件轉(zhuǎn)成pdf文件
pdfkit.from_file('tmp.html', output_file, options={"enable-local-file-access": None})
if os.path.exists('tmp.html'):
os.remove('tmp.html')
print(input_file + '轉(zhuǎn)換成功拌蜘!')
def _init_argumentParser():
a = ArgumentParser(usage="Markdown->PDF批量轉(zhuǎn)換助手")
a.add_argument("-p", "--path", required=True, type=str, help="檢索路徑")
return a.parse_args()
if __name__ == '__main__':
# markdown文件路徑
# mk_path = "HowToCook/dishes"
args = _init_argumentParser()
# 修改文件路徑List
mk_file_list = []
# 輸出文件路徑List
output_pdf_file_list = []
# 轉(zhuǎn)換失敗的文件
failed = []
# 獲得文件名
get_file_name(args.path, mk_file_list, output_pdf_file_list)
# 對(duì)文件進(jìn)行轉(zhuǎn)換
for i in range(len(mk_file_list)):
try:
convert(mk_file_list[i], output_pdf_file_list[i])
except Exception as e:
print(f"{mk_file_list[i]} 出現(xiàn)了問(wèn)題 , 原因?yàn)? \n{e}")
failed.append(mk_file_list[i])
print(f"失敗的有{len(failed)}個(gè), {failed}")
Fork from : https://github.com/Dafeigy/md2pdf
demo-batch-markdown-to-pdf
from pathlib import Path
import os
work_dir = Path.cwd()
export_pdf_dir = work_dir / 'pdf'
if not export_pdf_dir.exists():
export_pdf_dir.mkdir()
for md_file in list(work_dir.glob('*.md')):
md_file_name = md_file.name
pdf_file_name = md_file_name.replace('.md', '.pdf')
pdf_file = export_pdf_dir / pdf_file_name
cmd = "pandoc '{}' -o '{}' --pdf-engine=xelatex -V mainfont='PingFang SC' --template=template.tex".format(md_file, pdf_file)
os.system(cmd)
:question:沒(méi)運(yùn)行成功
附錄
問(wèn)題解決
IOError: No wkhtmltopdf executable found: “”
python使用pdfkit中杆烁,如果使用pdfkit.from_url 或者pdfkit.from_string等,就會(huì)出現(xiàn)上述錯(cuò)誤简卧。而且如果你使用pip安裝了 wkhtmltopdf兔魂,還是會(huì)出現(xiàn)這個(gè)問(wèn)題:
IOError: No wkhtmltopdf executable found: “”
- 因此需要去安裝windows版本的*wkhtmltopdf*,此處進(jìn)入下載網(wǎng)址
- 安裝完成之后添加環(huán)境變量后举娩,再運(yùn)行即可
pandoc報(bào)錯(cuò)
No pandoc was found: either install pandoc and add it to your PATH or or call pypandoc.download_pandoc(...) or install pypandoc wheels with included pandoc.
參考了資料 關(guān)于python用pypandoc問(wèn)題(python3)(探索ing)_曉星晨曦-CSDN博客_pypandoc未能解決析校,后面版本安裝,指定pypandoc用的版本1.6.3晓铆,可行勺良。