出版模型
了解 Imposia 如何让预览、打印与导出对齐到同一份已提交的文档。
分页需要时间,文档包含图片、表格或页数很多时尤其如此。Imposia 在准备下一份文档时继续显示上一次完成的文档,读者永远不会看到未完成的布局。
读者看到的文档
Core 拥有一个持久的 canonical iframe——展示与原生打印共同依据的那一个浏览器框架。它装着最近一次成功完成分页的文档。
React 组件和 Viewer 直接展示这个 iframe。它们不会克隆其中的页面,也不会创建第二份展示文档。
源内容变化时会发生什么
- Core 为新的源内容创建一个临时的 staging iframe。
- Core 在其中加载获准的资源,并对完整文档执行分页。
- 分页成功后,Core 一步替换 canonical iframe 的内容。
- 如果任务失败、被中止或被更新的任务取代,Core 移除 staging iframe,继续显示之前的文档。
staging iframe 从不用于预览、展示或打印。
每种输出如何生成
预览和原生打印是两种日常输出,都指向 canonical iframe。由于提交时也会保留语义源内容,同一个世代(generation)在你需要语义产物时还能生成可重排 EPUB。
| 输出 | 来源 | 结果 |
|---|---|---|
| 预览 | Canonical iframe | Viewer 展示的已完成分页页面 |
| 打印 | 通过 Window.print() 打印 canonical 页面在顶层文档中的隔离快照 | 浏览器原生打印流程;Imposia 不返回 PDF 字节 |
| EPUB | 最后提交的源内容 | 可重排 EPUB 3.3 Blob,不是页面 DOM 的固定版式副本 |
PageDocument.exportEpub() 不会重新运行扩展,也不会序列化固定页面布局:EPUB 是面向可重排阅读器的语义投影,不是类似 PDF 的预览快照。
Viewer 与原生打印为何保持一致
在 Viewer 中打开已提交世代的第 2、3 页,再在浏览器打印预览中选择另存为 PDF。两处显示相同的内容和页面顺序。

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

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

另存为 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 和生命周期,但测量结果和换行可能不同。