<?xml version="1.0" encoding="utf-8" standalone="yes"?><rss version="2.0" xmlns:atom="http://www.w3.org/2005/Atom"><channel><title>Marp on aarkegz 技术屋</title><link>https://aarkegz.com/tags/marp/</link><description>Recent content in Marp on aarkegz 技术屋</description><generator>Hugo -- gohugo.io</generator><language>zh-cn</language><lastBuildDate>Tue, 19 May 2026 15:14:21 +0800</lastBuildDate><atom:link href="https://aarkegz.com/tags/marp/index.xml" rel="self" type="application/rss+xml"/><item><title>在 macOS 上使用 Marp 导出 PDF 文件时出现中文字符缺失的问题</title><link>https://aarkegz.com/misc/missing-chinese-characters-building-pdf-with-marp-on-macos/</link><pubDate>Tue, 19 May 2026 15:14:21 +0800</pubDate><guid>https://aarkegz.com/misc/missing-chinese-characters-building-pdf-with-marp-on-macos/</guid><description>&lt;h2 id="0-问题出现"&gt;0. 问题出现
&lt;/h2&gt;&lt;p&gt;&lt;a class="link" href="https://marp.app/" target="_blank" rel="noopener"
 &gt;Marp&lt;/a&gt; 是一个使用 Markdown 语法编写幻灯片的工具，非常适合用于快速创作版式美观但并不复杂的幻灯片。Marp 的官方 CLI 工具 &lt;code&gt;marp-cli&lt;/code&gt; 支持将符合 Marp 格式的 Markdown 文件导出为 HTML 和 PDF 文件。然而，我最近在 macOS 上使用 &lt;code&gt;marp-cli&lt;/code&gt; 导出 PDF 文件时，出现了中文字符缺失的问题，如下图所示：&lt;/p&gt;
&lt;p&gt;&lt;img alt="生成的 PDF 文件缺少中文字符" class="gallery-image" data-flex-basis="361px" data-flex-grow="150" height="1418" loading="lazy" sizes="(max-width: 767px) calc(100vw - 30px), (max-width: 1023px) 700px, (max-width: 1279px) 950px, 1232px" src="https://aarkegz.com/misc/missing-chinese-characters-building-pdf-with-marp-on-macos/image/index/missing-chinese-characters.png" srcset="https://aarkegz.com/misc/missing-chinese-characters-building-pdf-with-marp-on-macos/image/index/missing-chinese-characters_hu_6a6e76ca98fd7162.png 800w, https://aarkegz.com/misc/missing-chinese-characters-building-pdf-with-marp-on-macos/image/index/missing-chinese-characters_hu_613983333fb8193.png 1600w, https://aarkegz.com/misc/missing-chinese-characters-building-pdf-with-marp-on-macos/image/index/missing-chinese-characters.png 2134w" width="2134"&gt;&lt;/p&gt;
&lt;p&gt;经过一段时间的排查（以及与 Gemini 的讨论），我终于锁定了问题的原因，并找到了对应的解决方案。出乎我意料的是，虽然这个问题在 macOS 上可能广泛存在，但却似乎没有人记录过，因此我将解决方法记录于此，希望能够帮助到遇到同样问题的人。&lt;a class="link" href="#3-%e6%80%bb%e7%bb%93" &gt;太长不看&lt;/a&gt;。&lt;/p&gt;
&lt;h2 id="1-marp-还是-chrome"&gt;1. Marp 还是 Chrome？
&lt;/h2&gt;&lt;p&gt;面对中文字符渲染失败，我首先想到的是其中可能存在字体配置问题，但 macOS 对中文字体的支持应该（不论系统语言）非常完善才对。&lt;code&gt;marp-cli&lt;/code&gt; 生成 PDF 的原理是，首先将 Markdown 文件转换为 HTML 文件，然后使用无头浏览器将 HTML 页面渲染为 PDF 文件，所以问题也可能出现在生成的 HTML 文件中。为了确认是否是在生成 HTML 时就出现了问题，我首先使用 &lt;code&gt;marp-cli&lt;/code&gt; 生成了 HTML 文件，并使用浏览器打开，发现中文字符渲染正常：&lt;/p&gt;
&lt;p&gt;&lt;img alt="生成的 HTML 文件中文字符渲染正常" class="gallery-image" data-flex-basis="364px" data-flex-grow="152" height="1188" loading="lazy" sizes="(max-width: 767px) calc(100vw - 30px), (max-width: 1023px) 700px, (max-width: 1279px) 950px, 1232px" src="https://aarkegz.com/misc/missing-chinese-characters-building-pdf-with-marp-on-macos/image/index/all-ok-in-html.png" srcset="https://aarkegz.com/misc/missing-chinese-characters-building-pdf-with-marp-on-macos/image/index/all-ok-in-html_hu_6dfea5c8384bd67a.png 800w, https://aarkegz.com/misc/missing-chinese-characters-building-pdf-with-marp-on-macos/image/index/all-ok-in-html_hu_63aafd783275ee30.png 1600w, https://aarkegz.com/misc/missing-chinese-characters-building-pdf-with-marp-on-macos/image/index/all-ok-in-html.png 1806w" width="1806"&gt;&lt;/p&gt;
&lt;p&gt;并且可以发现，中文内容使用的是 macOS 内置的 PingFang 系列字体，按理说应该不存在任何问题：&lt;/p&gt;
&lt;p&gt;&lt;img alt="中文内容使用的是 macOS 内置的 PingFang 系列字体" class="gallery-image" data-flex-basis="364px" data-flex-grow="152" height="1188" loading="lazy" sizes="(max-width: 767px) calc(100vw - 30px), (max-width: 1023px) 700px, (max-width: 1279px) 950px, 1232px" src="https://aarkegz.com/misc/missing-chinese-characters-building-pdf-with-marp-on-macos/image/index/chinese-characters-are-using-pingfang.png" srcset="https://aarkegz.com/misc/missing-chinese-characters-building-pdf-with-marp-on-macos/image/index/chinese-characters-are-using-pingfang_hu_df68b9d0950ccf53.png 800w, https://aarkegz.com/misc/missing-chinese-characters-building-pdf-with-marp-on-macos/image/index/chinese-characters-are-using-pingfang_hu_c03399771480c5b8.png 1600w, https://aarkegz.com/misc/missing-chinese-characters-building-pdf-with-marp-on-macos/image/index/chinese-characters-are-using-pingfang.png 1806w" width="1806"&gt;&lt;/p&gt;
&lt;p&gt;看来浏览器一切正常？非也非也，一旦尝试使用 Chrome 把 HTML 打印成 PDF 文件，问题就又出现了。并且无论使用 Chrome 自己的打印功能，还是使用 macOS 系统的打印对话框，结果都是一样的：&lt;/p&gt;
&lt;p&gt;&lt;img alt="使用 Chrome 打印成 PDF 文件时中文字符缺失" class="gallery-image" data-flex-basis="364px" data-flex-grow="152" height="1188" loading="lazy" sizes="(max-width: 767px) calc(100vw - 30px), (max-width: 1023px) 700px, (max-width: 1279px) 950px, 1232px" src="https://aarkegz.com/misc/missing-chinese-characters-building-pdf-with-marp-on-macos/image/index/missing-chinese-characters-printing-to-pdf-in-chrome.png" srcset="https://aarkegz.com/misc/missing-chinese-characters-building-pdf-with-marp-on-macos/image/index/missing-chinese-characters-printing-to-pdf-in-chrome_hu_7758819a0f1328f9.png 800w, https://aarkegz.com/misc/missing-chinese-characters-building-pdf-with-marp-on-macos/image/index/missing-chinese-characters-printing-to-pdf-in-chrome_hu_a856392d544ab21.png 1600w, https://aarkegz.com/misc/missing-chinese-characters-building-pdf-with-marp-on-macos/image/index/missing-chinese-characters-printing-to-pdf-in-chrome.png 1806w" width="1806"&gt;&lt;/p&gt;
&lt;p&gt;这么看起来，&lt;code&gt;marp-cli&lt;/code&gt; 应该没有问题，生成了正确的 HTML 文件。问题实际出现在 PDF 文件的生成过程中：不知为何，Chrome 未能正确渲染中文字符。&lt;/p&gt;
&lt;h2 id="2-chrome-还是-macos"&gt;2. Chrome 还是 macOS？
&lt;/h2&gt;&lt;p&gt;虽然 HTML 和 PDF 的排版和渲染不是同一个引擎完成的，但字体查找和解析的逻辑应当是相同的才对，一个能够渲染而另一个不能就很奇怪了。是 PDF 渲染引擎没有能正确找到字体，还是找到了字体但是渲染失败了呢？最好的办法是使用「另一个 PingFang 字体」来验证一下。在 Markdown 文件中引用一份在线的 PingFang SC 试一试：&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;div class="chroma"&gt;
&lt;table class="lntable"&gt;&lt;tr&gt;&lt;td class="lntd"&gt;
&lt;pre tabindex="0" class="chroma"&gt;&lt;code&gt;&lt;span class="lnt"&gt; 1
&lt;/span&gt;&lt;span class="lnt"&gt; 2
&lt;/span&gt;&lt;span class="lnt"&gt; 3
&lt;/span&gt;&lt;span class="lnt"&gt; 4
&lt;/span&gt;&lt;span class="lnt"&gt; 5
&lt;/span&gt;&lt;span class="lnt"&gt; 6
&lt;/span&gt;&lt;span class="lnt"&gt; 7
&lt;/span&gt;&lt;span class="lnt"&gt; 8
&lt;/span&gt;&lt;span class="lnt"&gt; 9
&lt;/span&gt;&lt;span class="lnt"&gt;10
&lt;/span&gt;&lt;span class="lnt"&gt;11
&lt;/span&gt;&lt;span class="lnt"&gt;12
&lt;/span&gt;&lt;span class="lnt"&gt;13
&lt;/span&gt;&lt;span class="lnt"&gt;14
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;
&lt;td class="lntd"&gt;
&lt;pre tabindex="0" class="chroma"&gt;&lt;code class="language-markdown" data-lang="markdown"&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;---
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;style: |
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="ni"&gt;@font&lt;/span&gt;-face {
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; font-family: &amp;#39;PingFangSCOnline&amp;#39;;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; src: url(&amp;#39;https://cdn.jsdelivr.net/npm/font-pingfang-sc&lt;span class="ni"&gt;@1&lt;/span&gt;.0.5/PingFangSC-Regular.woff2&amp;#39;) format(&amp;#39;woff2&amp;#39;);
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; font-weight: normal;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; font-style: normal;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; font-display: swap; 
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; }
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; section {
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; font-family: &amp;#39;PingFangSCOnline&amp;#39;, sans-serif;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; font-size: 22px;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; }
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;---
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;&lt;/tr&gt;&lt;/table&gt;
&lt;/div&gt;
&lt;/div&gt;&lt;p&gt;&lt;img alt="在线的 PingFang SC 字体可以正常渲染中文字符" class="gallery-image" data-flex-basis="364px" data-flex-grow="152" height="1188" loading="lazy" sizes="(max-width: 767px) calc(100vw - 30px), (max-width: 1023px) 700px, (max-width: 1279px) 950px, 1232px" src="https://aarkegz.com/misc/missing-chinese-characters-building-pdf-with-marp-on-macos/image/index/online-pingfang-sc-is-working.png" srcset="https://aarkegz.com/misc/missing-chinese-characters-building-pdf-with-marp-on-macos/image/index/online-pingfang-sc-is-working_hu_d79f4e7017fe4387.png 800w, https://aarkegz.com/misc/missing-chinese-characters-building-pdf-with-marp-on-macos/image/index/online-pingfang-sc-is-working_hu_769790a88a116b94.png 1600w, https://aarkegz.com/misc/missing-chinese-characters-building-pdf-with-marp-on-macos/image/index/online-pingfang-sc-is-working.png 1806w" width="1806"&gt;&lt;/p&gt;
&lt;p&gt;中文字符可以正常渲染了！包括 macOS 系统的打印对话框也可以正常渲染中文字符。虽然在线的 PingFang SC 不一定和系统内置的 PingFang 字体完全一致，因而不能百分百地排除渲染引擎和字体之间的不兼容问题，但我们已经有很大的把握断定，问题出在字体查找的过程中——HTML 渲染和 PDF 渲染过程中，字体查找逻辑存在某个细小的差别，导致最终结果的不一致。&lt;/p&gt;
&lt;p&gt;要继续排查下去，就要深入到 Chrome 的内部逻辑和日志中了，这将会是一项艰苦的工作。幸好见多识广的 Gemini 老师为我指明了一个未曾设想的方向：&lt;/p&gt;
&lt;blockquote&gt;
 &lt;p&gt;&lt;p&gt;既然网络字体能够完美解决，而本地字体在 Chrome 网页里显示正常、一进入 PDF 虚拟打印（无论是命令行还是 Chrome 自带的打印面板）就彻底失踪，这说明了一个非常关键的事实：&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;你的本地字体本身没有坏，Chrome 浏览器本身也能找到它们。唯一的断层发生在“网页渲染引擎（Blink）”将字形信息传递给“PDF 矢量打印引擎（Skia/PDF）”的那一瞬间。&lt;/strong&gt;&lt;/p&gt;
&lt;p&gt;在 macOS 环境下，由于系统字体的特殊存放机制和 Chromium 自身的沙盒策略，这种“网页能看但 PDF 无法打印”的诡异现象通常由以下三个深层原因导致。我们可以继续通过以下步骤抓出真正的元凶：&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;元凶排查一：macOS 的“字体册”激活状态与权限冲突&lt;/strong&gt;&lt;/p&gt;
&lt;p&gt;现代 macOS 为了节省空间，许多系统自带的中文字体（如某些特定字重的黑体、楷体，甚至部分	苹方的衍生字形）在默认情况下是“云端字体”。网页浏览器在普通模式下可以调用系统高级 API 动态渲染它们，但是 Headless Chromium (无头模式) 或 PDF 打印沙盒是一个受限的独立进程，它没有权限去触发 macOS 的云端字体下载或动态激活。&lt;/p&gt;
&lt;p&gt;排查与修复方法：&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;打开 Mac 自带的 字体册 (Font Book) 应用程序。&lt;/li&gt;
&lt;li&gt;搜索 PingFang（苹方）或 Heiti（黑体）。&lt;/li&gt;
&lt;li&gt;检查它们是否呈现灰色，或者右上角有没有一个“下载”的小云图标。如果有，请务必点击下载并全部激活。&lt;/li&gt;
&lt;li&gt;如果已经激活，选中字体，右键选择 “验证字体” (Validate Font)，确保没有出现警告或破损。&lt;/li&gt;
&lt;/ul&gt;
&lt;/p&gt;&lt;span class="cite"&gt;&lt;span&gt;― &lt;/span&gt;&lt;span&gt;Google Gemini, &lt;/span&gt;&lt;cite&gt;Marp PDF 导出中文缺失解决&lt;/cite&gt;&lt;/span&gt;&lt;/blockquote&gt;
&lt;p&gt;遵循 Gemini 老师的指引，我打开了字体册应用程序，结果：&lt;/p&gt;
&lt;p&gt;&lt;img alt="字体册中 PingFang 字体没有被激活" class="gallery-image" data-flex-basis="357px" data-flex-grow="148" height="1184" loading="lazy" sizes="(max-width: 767px) calc(100vw - 30px), (max-width: 1023px) 700px, (max-width: 1279px) 950px, 1232px" src="https://aarkegz.com/misc/missing-chinese-characters-building-pdf-with-marp-on-macos/image/index/pingfang-font-not-activated-in-font-book.png" srcset="https://aarkegz.com/misc/missing-chinese-characters-building-pdf-with-marp-on-macos/image/index/pingfang-font-not-activated-in-font-book_hu_6e879134e941ea82.png 800w, https://aarkegz.com/misc/missing-chinese-characters-building-pdf-with-marp-on-macos/image/index/pingfang-font-not-activated-in-font-book_hu_b31834f998e3c7e5.png 1600w, https://aarkegz.com/misc/missing-chinese-characters-building-pdf-with-marp-on-macos/image/index/pingfang-font-not-activated-in-font-book.png 1764w" width="1764"&gt;&lt;/p&gt;
&lt;p&gt;真被 Gemini 老师说中了，PingFang 系列字体并没有被激活。在下载并激活之后：&lt;/p&gt;
&lt;p&gt;&lt;img alt="问题解决了" class="gallery-image" data-flex-basis="364px" data-flex-grow="152" height="1188" loading="lazy" sizes="(max-width: 767px) calc(100vw - 30px), (max-width: 1023px) 700px, (max-width: 1279px) 950px, 1232px" src="https://aarkegz.com/misc/missing-chinese-characters-building-pdf-with-marp-on-macos/image/index/problem-solved.png" srcset="https://aarkegz.com/misc/missing-chinese-characters-building-pdf-with-marp-on-macos/image/index/problem-solved_hu_e19ba9f57a9d414b.png 800w, https://aarkegz.com/misc/missing-chinese-characters-building-pdf-with-marp-on-macos/image/index/problem-solved_hu_a88c61c61d7ea85f.png 1600w, https://aarkegz.com/misc/missing-chinese-characters-building-pdf-with-marp-on-macos/image/index/problem-solved.png 1806w" width="1806"&gt;&lt;/p&gt;
&lt;p&gt;问题解决！&lt;/p&gt;
&lt;h2 id="3-总结"&gt;3. 总结
&lt;/h2&gt;&lt;p&gt;这个问题的表象在于「Marp 在 macOS 下导出 PDF 文件时中文字符缺失」，其根本原因在于「macOS 的字体册可能出于某些原因没有激活系统内置的中文字体」，问题的迷惑性在于「即使 macOS 没有在本地激活这些字体，Chrome 等浏览器仍然可以正常渲染中文字符」，只有当尝试将 HTML 页面打印成 PDF 文件时，这个问题才会显现出来。&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;简单的解决办法&lt;/strong&gt;：在字体册中找到 PingFang SC 或者其他需要的字体，点击「下载」并「激活」。&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;进一步的解决办法&lt;/strong&gt;：考虑到 Marp 本身是基于 HTML 的技术，可以在其中插入在线字体（特别是 woff2 字体），这样可以确保在不同系统和平台上得到接近完全一致的渲染效果。&lt;/li&gt;
&lt;/ul&gt;</description></item></channel></rss>