Fumadocs

导出 PDF

将文档页面导出为 PDF 文档

概述

通常,我们强烈推荐您下载整个网站(HTML 文件等)以进行离线浏览。

如果您想将页面导出为 PDF,可以按照本指南操作。

设置

使用 Puppeteer 导出 PDF 文件。

scripts/export-pdf.ts
import puppeteer from 'puppeteer';
import fs from 'node:fs/promises';
import path from 'node:path';

const browser = await puppeteer.launch();
const outDir = 'pdfs';
// 更新此部分
const urls = ['/docs/ui', '/docs/ui/customisations'];

async function exportPdf(pathname: string) {
  const page = await browser.newPage();
  await page.goto('http://localhost:3000' + pathname, {
    waitUntil: 'networkidle2',
  });

  await page.pdf({
    path: path.join(outDir, pathname.slice(1).replaceAll('/', '-') + '.pdf'),
    width: 950,
    printBackground: true,
  });

  console.log(`PDF generated successfully for ${pathname}`);
  await page.close();
}

await fs.mkdir(outDir, { recursive: true });
await Promise.all(urls.map(exportPdf));
await browser.close();

在您的 Tailwind CSS 文件中添加以下内容,以在打印时禁用导航元素:

@media print {
  #nd-docs-layout {
    --fd-sidebar-width: 0px !important;
  }

  #nd-sidebar {
    display: none;
  }
}

现在,您可以运行该脚本:

bun ./scripts/export-pdf.ts

不可见内容

对于折叠面板/选项卡中的不可见内容,您可能需要临时覆盖 MDX 组件。例如:

mdx-components.tsx
import defaultMdxComponents from 'fumadocs-ui/mdx';
import type { MDXComponents } from 'mdx/types';
import { Accordion, Accordions } from 'fumadocs-ui/components/accordion';

// 这里可以使用环境变量
const isPrinting = true;

export function getMDXComponents(components?: MDXComponents) {
  const PrintingAccordion: typeof Accordion = (props) => (
    <div>
      <h3>{props.title}</h3>
      {props.children}
    </div>
  );

  return {
    ...defaultMdxComponents,
    // 更新折叠面板:
    Accordion: isPrinting ? PrintingAccordion : Accordion,
    Accordions: isPrinting ? 'div' : Accordions,
    ...components,
  } satisfies MDXComponents;
}

How is this guide?

Last updated on