<?xml version="1.0" encoding="utf-8" standalone="yes"?>
<rss version="2.0" xmlns:atom="http://www.w3.org/2005/Atom">
  <channel>
    <title>Pdf on OHTLY Blog</title>
    <link>https://blog.ohtly.com/tags/pdf/</link>
    <description>Recent content in Pdf on OHTLY Blog</description>
    <generator>Hugo</generator>
    <language>zh-cn</language>
    <lastBuildDate>Tue, 28 Jul 2026 14:28:50 +0800</lastBuildDate>
    <atom:link href="https://blog.ohtly.com/tags/pdf/index.xml" rel="self" type="application/rss+xml" />
    <item>
      <title>转换 EPUB 为 PDF 并前置目录页</title>
      <link>https://blog.ohtly.com/posts/2026-07-28-epub-to-pdf-with-toc-front/</link>
      <pubDate>Tue, 28 Jul 2026 14:16:09 +0800</pubDate>
      <guid>https://blog.ohtly.com/posts/2026-07-28-epub-to-pdf-with-toc-front/</guid>
      <description>&lt;p&gt;Calibre 的 &lt;code&gt;--pdf-add-toc&lt;/code&gt; 会把目录页插在 PDF 末尾，方便打印但不适合电子阅读。EPUB 自带的目录书签完整，但同样落在尾部。&lt;/p&gt;&#xA;&lt;p&gt;&lt;code&gt;--use-auto-toc&lt;/code&gt; 用 XPath 自动生成目录，效果不稳定，经常只匹配到少量标题。&lt;/p&gt;&#xA;&lt;h2 id=&#34;方案&#34;&gt;&#xA;  方案&#xA;  &lt;a class=&#34;heading-link&#34; href=&#34;#%e6%96%b9%e6%a1%88&#34;&gt;&#xA;    &lt;i class=&#34;fa-solid fa-link&#34; aria-hidden=&#34;true&#34; title=&#34;链接到标题&#34;&gt;&lt;/i&gt;&#xA;    &lt;span class=&#34;sr-only&#34;&gt;链接到标题&lt;/span&gt;&#xA;  &lt;/a&gt;&#xA;&lt;/h2&gt;&#xA;&lt;p&gt;两步处理：&lt;/p&gt;&#xA;&lt;ol&gt;&#xA;&lt;li&gt;Calibre 转换（不加 &lt;code&gt;--pdf-add-toc&lt;/code&gt;，保留 EPUB 自带目录）&lt;/li&gt;&#xA;&lt;li&gt;PyMuPDF 脚本把末尾目录页移到正文前方&lt;/li&gt;&#xA;&lt;/ol&gt;&#xA;&lt;div class=&#34;highlight&#34;&gt;&lt;pre tabindex=&#34;0&#34; style=&#34;color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;&#34;&gt;&lt;code class=&#34;language-bash&#34; data-lang=&#34;bash&#34;&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;ebook-convert input.epub output.pdf&#xA;&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;生成的文件目录页在最后两页，用以下脚本移动到第 3 页之后：&lt;/p&gt;&#xA;&lt;div class=&#34;highlight&#34;&gt;&lt;pre tabindex=&#34;0&#34; style=&#34;color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;&#34;&gt;&lt;code class=&#34;language-python&#34; data-lang=&#34;python&#34;&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#f92672&#34;&gt;import&lt;/span&gt; fitz&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;src &lt;span style=&#34;color:#f92672&#34;&gt;=&lt;/span&gt; &lt;span style=&#34;color:#e6db74&#34;&gt;&amp;#39;某书_with_toc.pdf&amp;#39;&lt;/span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;dst &lt;span style=&#34;color:#f92672&#34;&gt;=&lt;/span&gt; &lt;span style=&#34;color:#e6db74&#34;&gt;&amp;#39;某书_with_toc_moved.pdf&amp;#39;&lt;/span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;doc &lt;span style=&#34;color:#f92672&#34;&gt;=&lt;/span&gt; fitz&lt;span style=&#34;color:#f92672&#34;&gt;.&lt;/span&gt;open(src)&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;total &lt;span style=&#34;color:#f92672&#34;&gt;=&lt;/span&gt; len(doc)&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;toc_start &lt;span style=&#34;color:#f92672&#34;&gt;=&lt;/span&gt; total &lt;span style=&#34;color:#f92672&#34;&gt;-&lt;/span&gt; &lt;span style=&#34;color:#ae81ff&#34;&gt;2&lt;/span&gt;  &lt;span style=&#34;color:#75715e&#34;&gt;# 目录页起始位置&lt;/span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#75715e&#34;&gt;# 页面映射：旧页码 → 新页码&lt;/span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;old_to_new &lt;span style=&#34;color:#f92672&#34;&gt;=&lt;/span&gt; {}&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;idx &lt;span style=&#34;color:#f92672&#34;&gt;=&lt;/span&gt; &lt;span style=&#34;color:#ae81ff&#34;&gt;0&lt;/span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#66d9ef&#34;&gt;for&lt;/span&gt; old &lt;span style=&#34;color:#f92672&#34;&gt;in&lt;/span&gt; range(&lt;span style=&#34;color:#ae81ff&#34;&gt;3&lt;/span&gt;):           &lt;span style=&#34;color:#75715e&#34;&gt;# 前3页：空白、扉页、格言页&lt;/span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    old_to_new[old] &lt;span style=&#34;color:#f92672&#34;&gt;=&lt;/span&gt; idx; idx &lt;span style=&#34;color:#f92672&#34;&gt;+=&lt;/span&gt; &lt;span style=&#34;color:#ae81ff&#34;&gt;1&lt;/span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#66d9ef&#34;&gt;for&lt;/span&gt; old &lt;span style=&#34;color:#f92672&#34;&gt;in&lt;/span&gt; range(toc_start, total):  &lt;span style=&#34;color:#75715e&#34;&gt;# 目录页&lt;/span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    old_to_new[old] &lt;span style=&#34;color:#f92672&#34;&gt;=&lt;/span&gt; idx; idx &lt;span style=&#34;color:#f92672&#34;&gt;+=&lt;/span&gt; &lt;span style=&#34;color:#ae81ff&#34;&gt;1&lt;/span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#66d9ef&#34;&gt;for&lt;/span&gt; old &lt;span style=&#34;color:#f92672&#34;&gt;in&lt;/span&gt; range(&lt;span style=&#34;color:#ae81ff&#34;&gt;3&lt;/span&gt;, toc_start):      &lt;span style=&#34;color:#75715e&#34;&gt;# 正文&lt;/span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    old_to_new[old] &lt;span style=&#34;color:#f92672&#34;&gt;=&lt;/span&gt; idx; idx &lt;span style=&#34;color:#f92672&#34;&gt;+=&lt;/span&gt; &lt;span style=&#34;color:#ae81ff&#34;&gt;1&lt;/span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;new_doc &lt;span style=&#34;color:#f92672&#34;&gt;=&lt;/span&gt; fitz&lt;span style=&#34;color:#f92672&#34;&gt;.&lt;/span&gt;open()&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;new_doc&lt;span style=&#34;color:#f92672&#34;&gt;.&lt;/span&gt;insert_pdf(doc, &lt;span style=&#34;color:#ae81ff&#34;&gt;0&lt;/span&gt;, &lt;span style=&#34;color:#ae81ff&#34;&gt;2&lt;/span&gt;)              &lt;span style=&#34;color:#75715e&#34;&gt;# 前3页&lt;/span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;new_doc&lt;span style=&#34;color:#f92672&#34;&gt;.&lt;/span&gt;insert_pdf(doc, toc_start, total&lt;span style=&#34;color:#f92672&#34;&gt;-&lt;/span&gt;&lt;span style=&#34;color:#ae81ff&#34;&gt;1&lt;/span&gt;)  &lt;span style=&#34;color:#75715e&#34;&gt;# 目录页&lt;/span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;new_doc&lt;span style=&#34;color:#f92672&#34;&gt;.&lt;/span&gt;insert_pdf(doc, &lt;span style=&#34;color:#ae81ff&#34;&gt;3&lt;/span&gt;, toc_start&lt;span style=&#34;color:#f92672&#34;&gt;-&lt;/span&gt;&lt;span style=&#34;color:#ae81ff&#34;&gt;1&lt;/span&gt;)     &lt;span style=&#34;color:#75715e&#34;&gt;# 正文&lt;/span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#75715e&#34;&gt;# 修正书签页码&lt;/span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;toc &lt;span style=&#34;color:#f92672&#34;&gt;=&lt;/span&gt; doc&lt;span style=&#34;color:#f92672&#34;&gt;.&lt;/span&gt;get_toc()&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;new_toc &lt;span style=&#34;color:#f92672&#34;&gt;=&lt;/span&gt; [[lvl, title, old_to_new[page&lt;span style=&#34;color:#f92672&#34;&gt;-&lt;/span&gt;&lt;span style=&#34;color:#ae81ff&#34;&gt;1&lt;/span&gt;]&lt;span style=&#34;color:#f92672&#34;&gt;+&lt;/span&gt;&lt;span style=&#34;color:#ae81ff&#34;&gt;1&lt;/span&gt;] &lt;span style=&#34;color:#66d9ef&#34;&gt;for&lt;/span&gt; lvl, title, page &lt;span style=&#34;color:#f92672&#34;&gt;in&lt;/span&gt; toc]&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;new_doc&lt;span style=&#34;color:#f92672&#34;&gt;.&lt;/span&gt;set_toc(new_toc)&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;new_doc&lt;span style=&#34;color:#f92672&#34;&gt;.&lt;/span&gt;save(dst)&#xA;&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;h2 id=&#34;结果&#34;&gt;&#xA;  结果&#xA;  &lt;a class=&#34;heading-link&#34; href=&#34;#%e7%bb%93%e6%9e%9c&#34;&gt;&#xA;    &lt;i class=&#34;fa-solid fa-link&#34; aria-hidden=&#34;true&#34; title=&#34;链接到标题&#34;&gt;&lt;/i&gt;&#xA;    &lt;span class=&#34;sr-only&#34;&gt;链接到标题&lt;/span&gt;&#xA;  &lt;/a&gt;&#xA;&lt;/h2&gt;&#xA;&lt;ul&gt;&#xA;&lt;li&gt;目录页位于扉页/格言页之后，正文之前&lt;/li&gt;&#xA;&lt;li&gt;书签数量不变，页码自动修正，点击跳转正确&lt;/li&gt;&#xA;&lt;/ul&gt;&#xA;&lt;h2 id=&#34;注意事项&#34;&gt;&#xA;  注意事项&#xA;  &lt;a class=&#34;heading-link&#34; href=&#34;#%e6%b3%a8%e6%84%8f%e4%ba%8b%e9%a1%b9&#34;&gt;&#xA;    &lt;i class=&#34;fa-solid fa-link&#34; aria-hidden=&#34;true&#34; title=&#34;链接到标题&#34;&gt;&lt;/i&gt;&#xA;    &lt;span class=&#34;sr-only&#34;&gt;链接到标题&lt;/span&gt;&#xA;  &lt;/a&gt;&#xA;&lt;/h2&gt;&#xA;&lt;ul&gt;&#xA;&lt;li&gt;&lt;code&gt;--use-auto-toc&lt;/code&gt; 的 &lt;code&gt;--level1-toc=&amp;quot;//h:h1&amp;quot;&lt;/code&gt; 等 XPath 对 EPUB 内部结构依赖大，优先用自带目录&lt;/li&gt;&#xA;&lt;li&gt;&lt;code&gt;set_toc&lt;/code&gt; 需在 &lt;code&gt;insert_pdf&lt;/code&gt; 完成后调用，页码为 1-based&lt;/li&gt;&#xA;&lt;li&gt;如果目录页不在末尾，需先确认 &lt;code&gt;toc_start&lt;/code&gt; 位置（通过 &lt;code&gt;get_toc()&lt;/code&gt; 或观察页内容）&lt;/li&gt;&#xA;&lt;/ul&gt;</description>
    </item>
    <item>
      <title>PDF 水印四层结构的分析与移除</title>
      <link>https://blog.ohtly.com/posts/2026-07-19-pdf-watermark-removal/</link>
      <pubDate>Sun, 19 Jul 2026 11:00:43 +0800</pubDate>
      <guid>https://blog.ohtly.com/posts/2026-07-19-pdf-watermark-removal/</guid>
      <description>&lt;h2 id=&#34;背景&#34;&gt;&#xA;  背景&#xA;  &lt;a class=&#34;heading-link&#34; href=&#34;#%e8%83%8c%e6%99%af&#34;&gt;&#xA;    &lt;i class=&#34;fa-solid fa-link&#34; aria-hidden=&#34;true&#34; title=&#34;链接到标题&#34;&gt;&lt;/i&gt;&#xA;    &lt;span class=&#34;sr-only&#34;&gt;链接到标题&lt;/span&gt;&#xA;  &lt;/a&gt;&#xA;&lt;/h2&gt;&#xA;&lt;p&gt;一本 A4 尺寸的扫描版 PDF，A4 尺寸的扫描版 PDF。每页底部固定出现水印图样，并包含一个可点击的矩形区域，点击后跳转到外部站点。原始 PDF 使用 Adobe Acrobat Pro DC 17 Paper Capture 生成，具备完整的 OCR 文字层。&lt;/p&gt;&#xA;&lt;p&gt;目标：彻底移除水印，保留清晰的纯阅读版 PDF。&lt;/p&gt;&#xA;&lt;h2 id=&#34;诊断水印的四层结构&#34;&gt;&#xA;  诊断：水印的四层结构&#xA;  &lt;a class=&#34;heading-link&#34; href=&#34;#%e8%af%8a%e6%96%ad%e6%b0%b4%e5%8d%b0%e7%9a%84%e5%9b%9b%e5%b1%82%e7%bb%93%e6%9e%84&#34;&gt;&#xA;    &lt;i class=&#34;fa-solid fa-link&#34; aria-hidden=&#34;true&#34; title=&#34;链接到标题&#34;&gt;&lt;/i&gt;&#xA;    &lt;span class=&#34;sr-only&#34;&gt;链接到标题&lt;/span&gt;&#xA;  &lt;/a&gt;&#xA;&lt;/h2&gt;&#xA;&lt;p&gt;解剖 PDF 内部结构后发现，水印并非单一图层，而是同时嵌入了四个层面：&lt;/p&gt;&#xA;&lt;div class=&#34;mermaid&#34;&gt;&#xA;flowchart TB&#xA;    P[&#34;一本扫描版 PDF&lt;br/&gt;多页&#34;] --&gt; L1[&#34;Layer 1: Resources/XObject&lt;br/&gt;图片对象引用 /Im1&#34;]&#xA;    P --&gt; L2[&#34;Layer 2: 内容流&lt;br/&gt;渲染命令 /Im1 Do&#34;]&#xA;    P --&gt; L3[&#34;Layer 3: 文本层&lt;br/&gt;OCR 可选的水印文字&#34;]&#xA;    P --&gt; L4[&#34;Layer 4: /Annots&lt;br/&gt;Link 注释 /URI 外部链接&#34;]&#xA;&#xA;    L1 --&gt; R1[&#34;绝大多数页含此引用&#34;]&#xA;    L2 --&gt; R2[&#34;绝大多数页含此命令&#34;]&#xA;    L3 --&gt; R3[&#34;约 绝大多数页含此文本&#34;]&#xA;    L4 --&gt; R4[&#34;绝大多数页含此注释&#34;]&#xA;&#xA;    style L1 fill:#e3f2fd&#xA;    style L2 fill:#e3f2fd&#xA;    style L3 fill:#e3f2fd&#xA;    style L4 fill:#e3f2fd&#xA;&#xA;&lt;/div&gt;&#xA;&#xA;&lt;ul&gt;&#xA;&lt;li&gt;&lt;strong&gt;Layer 1&lt;/strong&gt;: 每页的 &lt;code&gt;Resources&lt;/code&gt; 字典引用了名为 &lt;code&gt;/Im1&lt;/code&gt; 的 XObject 图片（xreference → 文件尾部存储的 PNG 图像）&lt;/li&gt;&#xA;&lt;li&gt;&lt;strong&gt;Layer 2&lt;/strong&gt;: 页面内容流中插入了 &lt;code&gt;q cm /Im1 Do Q&lt;/code&gt; 指令序列，负责将图片渲染到页面上&lt;/li&gt;&#xA;&lt;li&gt;&lt;strong&gt;Layer 3&lt;/strong&gt;: OCR 引擎将水印图片上的文字识别为可选文本，嵌入到内容流中&lt;/li&gt;&#xA;&lt;li&gt;&lt;strong&gt;Layer 4&lt;/strong&gt;: 页面的 &lt;code&gt;/Annots&lt;/code&gt; 数组中定义了一个 Link 注释，框选范围覆盖水印区域，URI 指向外部站点&lt;/li&gt;&#xA;&lt;/ul&gt;&#xA;&lt;p&gt;只有四层全部清除，才算真正移除水印。&lt;/p&gt;</description>
    </item>
    <item>
      <title>macOS 下 Markdown 数学公式正确转 PDF</title>
      <link>https://blog.ohtly.com/posts/2026-07-08-markdown-math-to-pdf/</link>
      <pubDate>Wed, 08 Jul 2026 18:48:00 +0800</pubDate>
      <guid>https://blog.ohtly.com/posts/2026-07-08-markdown-math-to-pdf/</guid>
      <description>&lt;h2 id=&#34;问题&#34;&gt;&#xA;  问题&#xA;  &lt;a class=&#34;heading-link&#34; href=&#34;#%e9%97%ae%e9%a2%98&#34;&gt;&#xA;    &lt;i class=&#34;fa-solid fa-link&#34; aria-hidden=&#34;true&#34; title=&#34;链接到标题&#34;&gt;&lt;/i&gt;&#xA;    &lt;span class=&#34;sr-only&#34;&gt;链接到标题&lt;/span&gt;&#xA;  &lt;/a&gt;&#xA;&lt;/h2&gt;&#xA;&lt;p&gt;Markdown 里用 &lt;code&gt;$$&lt;/code&gt; 写好的 LaTeX 数学公式：&lt;/p&gt;&#xA;&lt;div class=&#34;highlight&#34;&gt;&lt;pre tabindex=&#34;0&#34; style=&#34;color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;&#34;&gt;&lt;code class=&#34;language-latex&#34; data-lang=&#34;latex&#34;&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#e6db74&#34;&gt;$$&lt;/span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;\nabla \cdot \mathbf{E} &lt;span style=&#34;color:#f92672&#34;&gt;=&lt;/span&gt; \frac{\rho}{\varepsilon_&lt;span style=&#34;color:#ae81ff&#34;&gt;0&lt;/span&gt;}&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#e6db74&#34;&gt;$$&lt;/span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;期望渲染效果：&lt;/p&gt;&#xA;&lt;p&gt;$$&#xA;\nabla \cdot \mathbf{E} = \frac{\rho}{\varepsilon_0}&#xA;$$&lt;/p&gt;&#xA;&lt;p&gt;但转 PDF 时，要么公式显示为原始代码，要么中文字体缺失乱码。本文记录 macOS 下的可行方案。&lt;/p&gt;&#xA;&lt;h2 id=&#34;方案一pandoc--xelatex不推荐&#34;&gt;&#xA;  方案一：Pandoc + XeLaTeX（不推荐）&#xA;  &lt;a class=&#34;heading-link&#34; href=&#34;#%e6%96%b9%e6%a1%88%e4%b8%80pandoc--xelatex%e4%b8%8d%e6%8e%a8%e8%8d%90&#34;&gt;&#xA;    &lt;i class=&#34;fa-solid fa-link&#34; aria-hidden=&#34;true&#34; title=&#34;链接到标题&#34;&gt;&lt;/i&gt;&#xA;    &lt;span class=&#34;sr-only&#34;&gt;链接到标题&lt;/span&gt;&#xA;  &lt;/a&gt;&#xA;&lt;/h2&gt;&#xA;&lt;div class=&#34;highlight&#34;&gt;&lt;pre tabindex=&#34;0&#34; style=&#34;color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;&#34;&gt;&lt;code class=&#34;language-bash&#34; data-lang=&#34;bash&#34;&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;brew install basictex&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;pandoc file.md -o file.pdf --pdf-engine&lt;span style=&#34;color:#f92672&#34;&gt;=&lt;/span&gt;xelatex -V mainfont&lt;span style=&#34;color:#f92672&#34;&gt;=&lt;/span&gt;&lt;span style=&#34;color:#e6db74&#34;&gt;&amp;#39;PingFang SC&amp;#39;&lt;/span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;公式渲染效果没问题，但输出风格偏 TeX 传统——标题字体、表格样式、公式间距都与现代文档有明显差异，不够美观。&lt;/p&gt;&#xA;&lt;h2 id=&#34;推荐方案pandoc--mathjax--puppeteer&#34;&gt;&#xA;  推荐方案：Pandoc + MathJax + Puppeteer&#xA;  &lt;a class=&#34;heading-link&#34; href=&#34;#%e6%8e%a8%e8%8d%90%e6%96%b9%e6%a1%88pandoc--mathjax--puppeteer&#34;&gt;&#xA;    &lt;i class=&#34;fa-solid fa-link&#34; aria-hidden=&#34;true&#34; title=&#34;链接到标题&#34;&gt;&lt;/i&gt;&#xA;    &lt;span class=&#34;sr-only&#34;&gt;链接到标题&lt;/span&gt;&#xA;  &lt;/a&gt;&#xA;&lt;/h2&gt;&#xA;&lt;p&gt;核心思路：用 Pandoc 生成带 MathJax CDN 的 HTML，再用 Puppeteer（Headless Chrome）渲染出 PDF。输出样式完全由 CSS 控制。&lt;/p&gt;</description>
    </item>
  </channel>
</rss>
