文档
导出为 PDF

导出区块为 PDF

可以将 BlockNote 文档完全在客户端导出为 PDF。

此功能由 @blocknote/xl-pdf-exporter 提供。xl- 系列包完全开源,但采用了强制开源许可证。 商业许可证适用于闭源专有产品,包含在 商业订阅 中。

首先,安装 @blocknote/xl-pdf-exporter@react-pdf/renderer 包:

npm install @blocknote/xl-pdf-exporter @react-pdf/renderer

然后,创建 PDFExporter 类的实例。该类提供以下方法:

import {
  PDFExporter,
  pdfDefaultSchemaMappings,
} from "@blocknote/xl-pdf-exporter";
import * as ReactPDF from "@react-pdf/renderer";
 
// 创建导出器
const exporter = new PDFExporter(editor.schema, pdfDefaultSchemaMappings);
 
// 将区块转换为 react-pdf 文档
const pdfDocument = await exporter.toReactPDFDocument(editor.document);
 
// 使用 react-pdf 写入文件:
await ReactPDF.render(pdfDocument, `filename.pdf`);

下面查看带有实时 PDF 预览的完整示例

Pro Example

Get access to the full source code for pro examples by subscribing to BlockNote Pro

Or sign in

PDF 自定义

toReactPDFDocument 接受一个可选的 options 参数,可以自定义 PDF 的页眉和页脚:

示例用法:

import { Text } from "@react-pdf/renderer";
const pdfDocument = await exporter.toReactPDFDocument(editor.document, {
  header: <Text>页眉</Text>,
  footer: <Text>页脚</Text>,
});

自定义映射 / 自定义 Schema

PDFExporter 构造函数接受 schemamappings 参数。 映射定义了如何将 BlockNote 的 schema 元素(区块、行内内容或样式)转换为 React-PDF 元素。 如果您在编辑器中使用了自定义 Schema,或者想要覆盖默认 BlockNote 元素转换为 PDF 的方式,可以传入自己的 mappings

例如,如果您的 schema 中有 extraBlock 类型,可以使用如下代码:

import { PDFExporter, pdfDefaultSchemaMappings } from "@blocknote/xl-pdf-exporter";
import { Text } from "@react-pdf/renderer";
 
new PDFExporter(schema, {
    blockMapping: {
        ...pdfDefaultSchemaMappings.blockMapping,
        myCustomBlock: (block, exporter) => {
            return <Text>我的自定义区块</Text>;
        },
    },
    inlineContentMapping: pdfDefaultSchemaMappings.inlineContentMapping,
    styleMapping: pdfDefaultSchemaMappings.styleMapping,
});

导出器选项

PDFExporter 构造函数还接受一个可选的 options 参数。 虽然转换在客户端完成,默认配置使用了两个基于服务器的资源:

const defaultOptions = {
  // emoji 资源,这会传给 react-pdf 库(https://react-pdf.org/fonts#registeremojisource)
  // 默认从 cloudflare + twemoji 加载
  emojiSource: {
    format: "png",
    url: "https://cdnjs.cloudflare.com/ajax/libs/twemoji/14.0.2/72x72/",
  },
  // 一个函数,用于解析外部资源以避免 CORS 问题
  // 默认调用 BlockNote 托管的服务器代理来解析文件
  resolveFileUrl: corsProxyResolveFileUrl,
  // PDF 中使用的颜色,作用于高亮、背景色和字体颜色等
  colors: COLORS_DEFAULT, // 来自 @blocknote/core 的默认值
};