How-to約 2 分鐘閱讀

不裝 Pandoc 與 LaTeX,把 Markdown 轉成 PDF

Markdown 轉 PDF 不需要 Pandoc 或 LaTeX:上傳 .md 檔案,得到 A4 頁面。表格與任務清單會排出來,註腳、公式與 Mermaid 不會。

By the PDF123 team · Updated 2026-11-03

把 .md 檔案上傳到 Markdown 轉 PDF,下載一份 A4 的 PDF。本機不必安裝任何東西,伺服器端也沒有使用 Pandoc 或 LaTeX:它解析 CommonMark,轉成 HTML,再交給 WeasyPrint 列印。測試時,一份含表格、刪除線與任務清單的筆記轉出來是一頁,三樣都畫出來了;註腳、emoji 短代碼、公式與 Mermaid 圖則原樣以你輸入的文字出現。

怎樣不用 Pandoc 或 LaTeX,把 Markdown 轉成 PDF?

在網站上選好 .md 檔案,按下處理即可。這個頁面沒有紙張大小、主題或字型的選項。用指令碼時,把檔案作為 fileInput 送給端點:

curl -X POST https://pdf123.xyz/api/v1/convert/markdown/pdf \
  -F [email protected] \
  -o notes.pdf

用 pdfx 命令列(以 npm install -g @pdf123/cli 安裝):

pdfx markdown-to-pdf notes.md -o notes.pdf

兩條指令都在 2026-10-23 對本機執行的一份伺服器跑過,第一條裡的位址換成了 https://pdf123.xyz。curl 回傳 HTTP 200,content-type: application/pdf。pdfx 輸出 notes.pdf 並以 0 結束。pdfinfo 回報 1 頁,595.276 x 841.89 點,也就是 A4,Producer 欄位是 WeasyPrint 70.0。結果依上傳的檔名命名:notes.md 得到 notes.pdf。

哪些內容能排出來,哪些維持原樣

測試檔裡有標題、粗體與斜體、表格、刪除線、任務清單、圍欄程式碼區塊、註腳、emoji 短代碼、公式、Mermaid 區塊與一行 <script>。我用 pdftotext 擷取結果裡的文字,並看了頁面的轉譯圖來核對。

Markdown 裡寫的 PDF 裡的樣子
標題、粗體、斜體、行內程式碼 正常排出
表格 排出,有儲存格框線與淺灰表頭列,標為靠右對齊的欄位數字靠右
~~刪除線~~ 排成帶刪除線的文字
- [x] 與 - [ ] 任務清單 排出,已完成是填滿的方框,未完成是空方框
圍欄程式碼區塊 排在灰色方框裡,沒有語法上色
註腳([^1] 與其定義) 沒有轉換:[^1] 留在句子裡,定義行當作一行普通文字列印
emoji 短代碼(:smile:) 沒有轉換:原樣列印 :smile:
公式($E = mc^2$) 沒有排版:原樣列印
標註為 mermaid 的圍欄區塊 沒有畫圖:當作程式碼區塊列印原始碼
<script> 標籤 沒有執行,它的文字也沒有出現在頁面上

表格、刪除線與任務清單是 GitHub Flavored Markdown 規格在 CommonMark 之上列出的擴充(章節「Tables (extension)」「Strikethrough (extension)」與「Task list items (extension)」)。轉換器開啟的就是這三項。它解析的基礎是 CommonMark 規格。其他 Markdown 工具各自加入的語法,一律不轉換。

長表格會保留表頭。一個 90 列、兩欄表頭的表格列印成 4 頁,pdftotext 在第 2、3 頁頂端也找到了表頭列。想了解反方向,以及來回轉換後保留什麼,見Markdown 與 PDF 來回:格式轉換保留什麼。

頁面尺寸、頁邊距與字型是怎麼決定的?

頁面是 A4,頁邊距 2 cm,內文 11 pt,行高 1.6,顏色是接近黑色的 #111。這些值是固定的。在 144 dpi 下量測轉譯出的測試頁,最左的墨跡離左邊緣 62.5 pt,最右的離右邊緣 63.5 pt。比 2 cm(56.7 pt)多出約 6 pt,正好是預設的 8 px 內文外距,內建樣式表沒有把它歸零。

字型清單以 Noto Sans CJK 與其他中日韓、阿拉伯文、泰文、天城文字型家族開頭,後面是 Noto Sans 與 DejaVu Sans。PDF 裡嵌入的是伺服器上實際有的那一個。在我的測試機上,pdffonts 列出的是 Hiragino Sans,所以 pdf123.xyz 上的字型可能與我看到的不同。轉換器還會檢查你的文字,把文件語言設為英文、簡體或繁體中文、日文、韓文、阿拉伯文、泰文或印地文,阿拉伯文由右向左排。一份用簡體中文寫成、同一句裡夾著英文單字與數字的測試筆記,轉出來是一頁,擷取出的文字與輸入一致。如果你使用的文字,伺服器上可能沒有對應字型,請檢查輸出裡有沒有空方框。

需要別的紙張大小、頁邊距或字型,這裡沒有設定項。可以自己把 Markdown 轉成 HTML,加上自己的 CSS,再用 HTML 轉 PDF,它會依你的 CSS 要求的頁面大小與頁邊距列印。

圖片怎麼處理?

只上傳一個 .md 檔案時,帶過去的只有文字,所以 images/logo.png 這樣的本機路徑沒有東西可載入。測試裡,![local](images/logo.png) 列印出替代文字 local,沒有圖片。公開的 http 或 https 位址可以載入:一張來自公開網站的圖片被嵌入,尺寸 72 x 48 像素。私有或內部網路的位址會被攔截,呼叫仍然回傳 200,頁面上是替代文字、沒有圖片,所以圖片重要時請檢查頁面。

要用本機圖片,就向 API 送一個 ZIP。ZIP 只轉譯一個 Markdown 檔案:壓縮檔根目錄有 index.md 就用它,否則用轉換器走訪資料夾時找到的第一個 .md。有多個 .md 都可能被選中時,把想要的那個命名為 index.md。圖片路徑從壓縮檔根目錄算起,不是從 .md 所在的資料夾算起:

curl -X POST https://pdf123.xyz/api/v1/convert/markdown/pdf \
  -F [email protected] \
  -o a.pdf

第一個測試裡,a.zip 含 index.md 與 images/logo.png,index.md 指向 images/logo.png,結果是一頁 A4,嵌入了一張 300 x 120 的圖片。第二個測試裡,b.zip 含 docs/guide.md 與 docs/logo.png,引用 logo.png(相對於檔案)只列印出替代文字,引用 docs/logo.png(相對於壓縮檔根目錄)則嵌入了圖片。工具頁與 pdfx 只接受 .md;pdfx markdown-to-pdf a.zip -o a.pdf 停在 accepts .md files, but "a.zip" is .zip,結束碼 2。ZIP 需要像上面那樣直接呼叫 API。

有三種輸入會被拒絕,回傳 HTTP 400,reason 為 unsupported_file_type:檔名既不是 .md 也不是 .zip(The file must be Markdown (.md) or a ZIP archive.)、.md 不是 UTF-8 文字(The Markdown file is not valid UTF-8 text.)、ZIP 裡沒有 .md(The ZIP archive must contain a .md file.)。回應本體與其他呼叫一樣是 application/problem+json,見錯誤碼。

常見問題

能改頁面大小或頁邊距嗎?

這個工具不能。A4 加 2 cm 頁邊距是內建的。要別的尺寸,用 HTML 轉 PDF,寫自己的 @page 規則。

支援註腳、公式與 Mermaid 圖嗎?

不支援。測試裡,註腳標記、emoji 短代碼與公式都原樣列印,Mermaid 區塊列印成程式碼區塊。圖或公式請先自己轉譯好,作為圖片放進 ZIP。

Markdown 裡夾的 HTML 裡的 JavaScript 會執行嗎?

不會。測試檔裡的 <script> 行沒有執行,也沒有往頁面裡加入任何內容。WeasyPrint 列印 HTML 與 CSS,沒有 JavaScript 引擎。

為什麼我上傳的 .md 回傳了 400?

三種原因都在上面講圖片的那一節:檔名、不是 UTF-8 的檔案,或是裡面沒有 .md 的 ZIP。把檔案另存為 UTF-8,再檢查副檔名。

Open tool
Process in the browser — no watermark, files removed after the job.
Open tool