核心概念

出版模型

了解 Imposia 如何让预览、打印与导出对齐到同一份已提交的文档。

分页需要时间,文档包含图片、表格或页数很多时尤其如此。Imposia 在准备下一份文档时继续显示上一次完成的文档,读者永远不会看到未完成的布局。

读者看到的文档

Core 拥有一个持久的 canonical iframe——展示与原生打印共同依据的那一个浏览器框架。它装着最近一次成功完成分页的文档。

React 组件和 Viewer 直接展示这个 iframe。它们不会克隆其中的页面,也不会创建第二份展示文档。

源内容变化时会发生什么

  1. Core 为新的源内容创建一个临时的 staging iframe。
  2. Core 在其中加载获准的资源,并对完整文档执行分页。
  3. 分页成功后,Core 一步替换 canonical iframe 的内容。
  4. 如果任务失败、被中止或被更新的任务取代,Core 移除 staging iframe,继续显示之前的文档。

staging iframe 从不用于预览、展示或打印。

每种输出如何生成

预览和原生打印是两种日常输出,都指向 canonical iframe。由于提交时也会保留语义源内容,同一个世代(generation)在你需要语义产物时还能生成可重排 EPUB。

输出来源结果
预览Canonical iframeViewer 展示的已完成分页页面
打印通过 Window.print() 打印 canonical 页面在顶层文档中的隔离快照浏览器原生打印流程;Imposia 不返回 PDF 字节
EPUB最后提交的源内容可重排 EPUB 3.3 Blob,不是页面 DOM 的固定版式副本

PageDocument.exportEpub() 不会重新运行扩展,也不会序列化固定页面布局:EPUB 是面向可重排阅读器的语义投影,不是类似 PDF 的预览快照。

Viewer 与原生打印为何保持一致

在 Viewer 中打开已提交世代的第 2、3 页,再在浏览器打印预览中选择另存为 PDF。两处显示相同的内容和页面顺序。

Imposia Viewer 中显示的同一个第 2 页

Viewer 第 2 页包含表格的 01–22 行、重复表头和 LEFT / 2 页眉。

Imposia Viewer 中的下一个表格页面及其页眉

Viewer 第 3 页接着显示 23–36 行和 RIGHT / 3 页眉。

浏览器打印预览中选择另存为 PDF 后的同一份文档

另存为 PDF 的预览包含与上方相同的第 2、3 页表格内容、页面顺序、重复表头和页眉。

Imposia 不会为打印重新运行布局,也没有 PDF 渲染器。print() 把已接受的 canonical 页面和该世代的样式克隆到顶层文档中一个临时隔离的 Shadow Root,再调用顶层的 Window.print()。这样既避开了 Chromium 不可靠的 iframe 打印快照,又保留了已提交的页面序列。因此在文档声明的支持边界内,纸张方向、margin box、重复表头、页码和内容顺序在 Viewer 与浏览器打印或另存为 PDF 输出之间保持一致。

打印时避免相互竞争的顶层 @page 规则

打印宿主会隔离页面内容和世代样式,但 CSS @page 规则作用于整个文档。宿主应用中未命名的顶层 @page 规则可能与 Imposia 为自己页面提升的打印规则相互作用,请在调用 print() 之前移除这类规则或限定其作用范围。

Viewer 与另存为 PDF 的预览一致,是因为两条路径观察同一个已提交世代。这不代表 Imposia 会返回 PDF 字节。打印机驱动的页边距、缩放、颜色校正,以及各浏览器不同的字体度量,仍可能影响最终结果。

控制外部资源

宿主应用的 assetResolver 是外部资源的唯一通道。经由这条通道产生的 Blob URL 由 Core 拥有,并在文档被替换、失败或销毁时撤销。

经过清理的输入、解析器输出和扩展都受文档所列限制约束。当 Imposia 无法准确应用某项特性时,它报告一个类型化警告,而不是默默猜测。

检查兼容性边界

  • 稳定: 浏览器 ESM API、iframe 生命周期、资源隔离、受支持的页面媒体、原生打印和可重排 EPUB。
  • 受限: 文档列出的表格、flex、grid、多栏布局、引用和 named string 子集。
  • 实验性: 需显式启用的页内脚注和页浮动。这些特性会报告警告。
  • 不支持: Node 或 CLI 渲染、服务端导出、PDF 字节、固定版式 EPUB、任意 CSS 分片,以及各浏览器页数完全一致。

以 Chromium 作为结构分页基准。Firefox 和 WebKit 支持公开 API 和生命周期,但测量结果和换行可能不同。

下一步

On this page