BlockNote 文档导出 PDF 实战:react-pdf 导出器(已弃用)完整使用指南
前端富文本UI组件AI 应用【免费下载链接】BlockNoteA React Rich Text Editor thats block-based (Notion style) and extensible. Built on top of Prosemirror and Tiptap.项目地址https://gitcode.com/gh_mirrors/bl/BlockNote点击查看免费下载本指南围绕 BlockNote 官方示例 Exporting documents to PDF (react-pdf, deprecated)系统讲解如何将 BlockNote 编辑器的当前文档全部 Block导出为 PDF 并下载到本地。你会掌握blocknote/xl-pdf-exporter/react-pdf包中PDFExporter的完整 API 用法、pdfDefaultSchemaMappings映射机制、实时预览与下载的完整代码流程并了解该方案为何被标记为废弃、以及如何迁移到 Typst 驱动的 PDF/UA-1 新导出器。注意本示例使用的是基于 react-pdf 的旧导出器blocknote/xl-pdf-exporter/react-pdf该入口已被官方标记为 deprecated并将在数个版本后移除。新项目请优先使用 Typst 版PDFExporter参见 Exporting documents to PDF (PDF/UA)它产出的是带逻辑结构树、可供屏幕阅读器导航的可访问标记型 PDF/UA-1 文件。一、示例概览编辑即导出一键下载示例的核心体验是编辑即导出左侧是完整的 BlockNote 编辑器支持分页符、多栏、高级表格等功能右侧用 react-pdf 的PDFViewer组件实时展示导出结果顶部提供 Download 入口点击即可把当前文档下载为My Document (blocknote export).pdf。启动方式在 examples/05-interoperability/11-converting-blocks-to-pdf-react-pdf-deprecated/package.json 所在目录执行pnpm dev内部调用 vite或pnpm build:prod后pnpm preview核心依赖blocknote/xl-pdf-exporter导出器本体与react-pdf/rendererreact-pdf 运行时示例锁定^4.5.1外加blocknote/xl-multi-column多栏块与blocknote/core、blocknote/mantine、blocknote/react构成编辑器基础界面布局页面分为上/下宽屏时左/右两个视图由 styles.css 通过 CSScontainer查询控制窄屏纵向堆叠宽屏1024px并排两个视图各占一半宽度。二、核心 APIPDFExporter 与 pdfDefaultSchemaMappings导出器的实现在 packages/xl-pdf-exporter/src/react-pdf/pdfExporter.tsx 中公开入口为blocknote/xl-pdf-exporter/react-pdf子路径见 packages/xl-pdf-exporter/src/react-pdf/index.ts它同时 re-export 了 react-pdf 的Font方便自定义字体注册。2.1 构造参数const exporter new PDFExporter(editor.schema, pdfDefaultSchemaMappings);PDFExporterB, S, I继承自 BlockNote 核心包blocknote/core的通用Exporter基类接收三个参数schema编辑器实例的BlockNoteSchema映射表会在类型层面与该 schema 做自动校验mappings把 BlockNote schema 映射为 react-pdf 内容的映射表。默认 schema 直接传入pdfDefaultSchemaMappings它由三部分组成见 packages/xl-pdf-exporter/src/react-pdf/defaultSchema/index.tsblockMappingBlock 类型 → react-pdf 元素inlineContentMapping内联内容文本、链接→ react-pdf 元素styleMapping样式 schema → react-pdf 样式对象options可选PartialOptions各选项默认值如下选项默认值说明emojiSourceTwemojijsDelivr CDNv17.0.372x72 PNG传给 react-pdfFont.registerEmojiSource()的表情字体源传false可关闭resolveFileUrlcorsProxyResolveFileUrl来自shared/api/corsProxy解析文档内文件/图片 URL默认走 CORS 代理colorsCOLORS_DEFAULT来自blocknote/coreBlockNote 调色板用于把backgroundColor/textColor属性名映射为真实色值fonts无附加字体注册表每项原样传给 react-pdf 的Font.register()典型用途是补充非拉丁语系如 CJK 字符字体fontFamilyInter覆盖整份 PDF 文档的默认字族2.2 文档转换toReactPDFDocumentconst pdfDocument await exporter.toReactPDFDocument(editor.document);toReactPDFDocument(blocks, options)是核心转换方法实现见 pdfExporter.tsx首先调用registerFonts()注册默认字体详见下文 4.2返回一个 react-pdfDocument内含单个Page dpi{100} sizeA4页面内边距为上 35 / 下 65 / 左右各 35单位 pt字号 12pt、行高 1.5options支持两个可选参数header与footer传入任意 react-pdf 组件即可为每一页添加页眉/页脚内部用fixed定位的View实现页脚水平方向与页面左右内边距对齐、垂直居中于底部内边距的一半。此外导出器还暴露了两个仅供内部使用的公有方法transformStyledText把带样式的StyledText转成Text和transformBlocks递归转换 Block 树一般无需直接调用。三、完整示例代码逐步拆解示例主逻辑集中在 App.tsx可分四步理解。3.1 配置编辑器分页符、多栏与高级表格const editor useCreateBlockNote({ schema: withMultiColumn(withPageBreak(BlockNoteSchema.create())), dropCursor: multiColumnDropCursor, dictionary: { ...locales.en, multi_column: multiColumnLocales.en }, tables: { splitCells: true, cellBackgroundColor: true, cellTextColor: true, headers: true, }, initialContent: testDocumentBlocks, });withPageBreak与withMultiColumn分别是blocknote/core与blocknote/xl-multi-column提供的 schema 增强为文档引入pageBreak分页符与columnList/column多栏块类型dropCursor: multiColumnDropCursor支持多栏场景下的拖拽插入光标指示tables选项开启高级表格能力单元格拆分、单元格背景色/文字色、表头行等——这些能力在导出测试文档见 5.2中均有对应验证数据斜杠菜单通过SuggestionMenuController注入菜单项由默认项、分页符项、多栏项三组经combineByGroup合并再用filterSuggestionItems按输入过滤。3.2 文档变化即导出const onChange async () { const exporter new PDFExporter(editor.schema, pdfDefaultSchemaMappings); const pdfDocument await exporter.toReactPDFDocument(editor.document); setPDFDocument(pdfDocument); forceRerender(); };onChange挂在BlockNoteView上编辑器内容每次变化都会重新实例化导出器并转换整个editor.document结果存入pdfDocumentstateuseReducer计数器renders作为PDFViewer的key强制其重渲染以刷新预览。useEffect中在挂载时调用一次onChange保证初始文档也立即有 PDF 预览。3.3 下载 PDFconst onDownloadClick async () { const blob await pdf(pdfDocument).toBlob(); const link document.createElement(a); link.href window.URL.createObjectURL(blob); link.download My Document (blocknote export).pdf; document.body.appendChild(link); link.dispatchEvent(new MouseEvent(click, { bubbles: true, cancelable: true, view: window })); link.remove(); window.URL.revokeObjectURL(link.href); };下载流程是标准的 Blob 下载模式用 react-pdf 的pdf()函数把DocumentJSX 渲染为 PDF 并转成Blob然后借助临时a标签的download属性触发浏览器下载最后移除元素并revokeObjectURL释放内存。3.4 双视图渲染JSX 中左侧渲染BlockNoteView编辑器右侧渲染PDFViewer height{100%} width{100%}承载pdfDocument两个视图都带有蓝色描边与标签头Editor Input / PDF Output下载按钮位于 PDF Output 标签右侧。四、导出器内部渲染机制源码级解析4.1 像素与点的换算react-pdf 的样式以 pt点为单位而编辑器样式是像素因此导出器定义了FONT_SIZE 16编辑器基准字号与PIXELS_PER_POINT 0.7596dpi 下 1px 0.75pt页面字号即16 × 0.75 12pt。嵌套块的子内容缩进量为FONT_SIZE * 1.5 * PIXELS_PER_POINT即 18pt每个块在转换时包一层paddingVertical: 3 * PIXELS_PER_POINT的View。4.2 字体与表情符号注册registerFonts()pdfExporter.tsx内置了Inter 四字形Regular / Italic / Bold / BoldItalic字体文件直接来自仓库共享资源 shared/assets/fonts/inter经loadFontDataUrl加载为 data URL 后Font.registerGeistMono代码块的等宽字体若开启emojiSource调用Font.registerEmojiSource()——默认实现会把每个 emoji 的 Unicode 码点解析为 Twemoji 72x72 PNG含 ZWJ 序列时的fe0f变体选择符处理逻辑用户通过 options 传入的fonts数组逐一注册。该方法通过fontsRegistered标志做幂等保护仅在首次导出时执行。4.3 Block 树的递归转换与列表序号transformBlocks递归遍历 Block 树维护numberedListIndex为有序列表项编号遇到非numberedListItem类型则归零把每个块经mapBlock映射为 react-pdf 元素再叠加blocknoteDefaultPropsToReactPDFStyle解析出的块级样式textAlignment→textAlignbackgroundColor/textColor经调色板options.colors查表转为真实色值右对齐时附加alignItems: flex-end。特殊地pageBreak、columnList、column三种布局型块直接透传不套用默认块样式包裹。4.4 页眉页脚与页面配置toReactPDFDocument中页面为dpi{100}、sizeA4页眉/页脚以fixed定位的View实现确保每一页都重复出现页面样式可由 options 的fontFamily整体覆盖。五、测试与示例文档验证导出保真度5.1 导出器的单元测试与快照react-pdf 导出器配有单元测试 packages/xl-pdf-exporter/src/react-pdf/pdfExporter.test.tsx并维护了两份 JSX 快照__snapshots__/example.jsx与__snapshots__/exampleWithHeaderAndFooter.jsx——后者验证了带页眉/页脚场景下toReactPDFDocument的输出结构可作为自定义页眉页脚的参考产出。5.2 示例测试文档覆盖全部块类型示例的initialContent来自 testDocumentBlocks.ts它是一份自动生成的自包含文件内容源自共享的 shared/testDocumentBlocks.ts是 playground 示例与各导出器单测 fixture 的单一事实来源。这份文档刻意覆盖了大量边界场景非常适合用来检验任何导出器包括本示例的保真度嵌套段落、空段落空行必须保留为垂直空间而非被丢弃16 级标题含右对齐标题、可折叠标题文本样式全集加粗、斜体、下划线、删除线、行内代码、链接、前景/背景色、硬换行无序/有序/待办列表含嵌套、start起始序号、右对齐/居中项表格普通表格、表头行、合并单元格colspan/rowspan对应编辑器的splitCells/headers高级表格能力pageBreak分页符、多栏columnList不同栏宽比例图片含previewWidth缩放、右对齐、视频、音频文件块、代码块、引用、分割线、Emoji 段落。六、为什么弃用迁移到 Typst 版 PDFExporter示例 README 明确说明react-pdf 导出器将在数个版本后被移除理由是 Typst 版新导出器产出可访问、带标签的 PDF/UA-1 输出——即 PDF 内含逻辑结构树标题、段落、列表、带替代文本的表格/图片、链接等屏幕阅读器可导航符合无障碍规范详见 Exporting documents to PDF (PDF/UA) 示例该文档还建议用 veraPDF 的--flavour ua1或 Acrobat Tags 面板验证产物。迁移到新导出器时的两个关键差异入口不同新导出器位于包根路径blocknote/xl-pdf-exporter其实现见 packages/xl-pdf-exporter/src/pdfExporter.ts通过 Typst 编译器 WASM 将文档编译为 PDF首次导出需下载编译器与字体耗时稍长映射表不同新导出器接收的是typstDefaultSchemaMappingsTypst 映射而非pdfDefaultSchemaMappingsreact-pdf 映射因此自定义块若要在新导出器下工作需要编写 Typst 映射而不是 react-pdf 的 JSX 映射。如果你的项目正处于 react-pdf 导出器已上线的状态建议尽快按上述差异评估迁移成本新项目则应直接采用 Typst 版方案以获得更好的渲染保真度与无障碍支持。赞分享前端富文本UI组件AI 应用【免费下载链接】BlockNoteA React Rich Text Editor thats block-based (Notion style) and extensible. Built on top of Prosemirror and Tiptap.项目地址https://gitcode.com/gh_mirrors/bl/BlockNote点击查看免费下载相关推荐基于 LxgwWenKai 制作衍生字体时保留名称「霞鹜」与「LXGW」如何合法使用基于 LxgwWenKai 制作衍生字体时保留名称「霞鹜」与「LXGW」如何合法使用 你要用 LxgwWenKai霞鹜文楷的源文件制作一个衍生字体——可前端富文本UI组件AI 应用Create-React-App 文件导出Excel/PDF 导出功能集成完整指南Create React App 文件导出Excel/PDF 导出功能集成完整指南 在现代 Web 应用中数据导出功能已成为不可或缺的重要特性。本文将为您详前端开发工具CLI构建工具Handsontable 数据导入导出实战PDF 导出与 CSV/Excel 导入完整指南Handsontable 数据导入导出实战PDF 导出与 CSV/Excel 导入完整指南 本篇技术指南基于 Handsontable 官方 Recipes前端UI组件上一篇阿里P3C终极指南自动化Java代码规范检查的完整教程下一篇TensorBoard完全指南从安装到高级功能的终极可视化工具创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考