@embedpdf-editor/vue3-chapter-viewer 1.0.0 → 1.0.2

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
package/README.md CHANGED
@@ -136,7 +136,11 @@ type ChapterManifest = {
136
136
  title: string;
137
137
  globalPageRange: [number, number];
138
138
  localPageRange: [number, number];
139
- source?: { url: string } | { buffer: ArrayBuffer } | { load: () => Promise<{ url: string } | { buffer: ArrayBuffer }> };
139
+ source?:
140
+ | { url: string }
141
+ | { buffer: ArrayBuffer }
142
+ | { load: () => Promise<{ url: string } | { buffer: ArrayBuffer }> }
143
+ | { urls: string[]; segmentPageThreshold: number };
140
144
  encrypted?: boolean;
141
145
  ownedGlobalPages?: number[];
142
146
  }>;
@@ -144,7 +148,7 @@ type ChapterManifest = {
144
148
  };
145
149
  ```
146
150
 
147
- `globalPageRange` 和 `localPageRange` 都是闭区间,且页数必须一致。`chapterId` 同时作为内部 `documentId`,需要在整本书内唯一。
151
+ `globalPageRange` 和 `localPageRange` 都是闭区间,且页数必须一致。`chapterId` 在整本书内唯一;单 URL 章时 `documentId === chapterId`,分段章内部为 `chapterId#s0`、`#s1`…(业务存储仍只用 `chapterId`)。
148
152
 
149
153
  | 字段 | 说明 |
150
154
  | --- | --- |
@@ -236,8 +240,8 @@ const options: ChapterViewerOptions = {
236
240
  import type { ChapterViewerOptions, IChapterPdfLoader } from '@embedpdf-editor/vue3-chapter-viewer';
237
241
 
238
242
  const loader: IChapterPdfLoader = {
239
- async loadPdf(chapter) {
240
- const res = await api.getChapterPdf(chapter.chapterId);
243
+ async loadPdf(chapter, segmentIndex) {
244
+ const res = await api.getChapterPdf(chapter.chapterId, segmentIndex ?? 0);
241
245
  return { url: res.signedUrl };
242
246
  // 或 return { buffer: await res.arrayBuffer() };
243
247
  },
@@ -251,6 +255,26 @@ const options: ChapterViewerOptions = {
251
255
  };
252
256
  ```
253
257
 
258
+ ### 章内多 PDF 分段(`source.urls[]`)
259
+
260
+ ```ts
261
+ source: {
262
+ urls: [part0Url, part1Url, part2Url],
263
+ segmentPageThreshold: 5, // 13 页 → 3 段
264
+ },
265
+ ```
266
+
267
+ - 先加载 `urls[0]`,滚动时懒加载后续段。
268
+ - `localPageIndex` 为章内 0-based 连续页;Vue 侧无需为分段改 `features`。
269
+ - 业务持久化:**`chapterId` + `localPageIndex`**,勿存 `chapterId#sN`。
270
+ - 导出划线会加载全部分段并合并页码。
271
+
272
+ [03-manifest.md](../../docs/get-started/03-manifest.md) · [12-segmented-pdf-and-per-chapter-storage.md](../../docs/get-started/12-segmented-pdf-and-per-chapter-storage.md)
273
+
274
+ ### 按章持久化(笔记 / 书签)
275
+
276
+ `NoteAnchor` / `ParagraphBookmark.anchor` 的 `chapterId`、`localPageIndex` 与单 URL 章相同。`loadNotes` / `bookmarks.load` 按章查询即可。划线备份用 `exportChapterAnnotations`(归档键为 `chapterId`)。
277
+
254
278
  ### 加密 PDF 与 `passwordProvider`
255
279
 
256
280
  ```ts
@@ -275,9 +299,9 @@ const passwordProvider = new CallbackPasswordProvider(async (chapter, attempt) =
275
299
  | `notes` | `enabled`、`marker`(`renderIcon`、`renderMenuActions`、`iconSize`、`highlightColor`) |
276
300
  | `zoom` | `enabled`(默认 true)、`min` 0.5、`max` 3、`initial` 1、`pageWidth`;实际上限由 `[data-chapter-scroll-viewport]` 宽度决定,resize 时自动更新 |
277
301
  | `scrollViewport` | `background`(默认 `#f1f5f9`),滚动视口背景 |
278
- | `selectionToolbar` | `enabled`、`hiddenBuiltinActions`、`extraActions` |
302
+ | `selectionToolbar` | `enabled`、`hiddenBuiltinActions`(含 `copy`)、`renderCopyIcon`、`extraActions` |
279
303
 
280
- 默认划线 `offsetY`:`squiggly` 为 **4**。内置工具条按钮:`highlight` | `underline` | `squiggly` | `strikeout` | `note`。
304
+ 默认划线 `offsetY`:`squiggly` 为 **4**。内置工具条顺序:**`copy`** 划线类 扩展 **`note`**。
281
305
 
282
306
  ---
283
307
 
@@ -303,12 +327,21 @@ const passwordProvider = new CallbackPasswordProvider(async (chapter, attempt) =
303
327
  usePdfiumEngine();
304
328
  ```
305
329
 
306
- 如果业务要求内网部署、固定版本或自定义 CDN,再传入自托管地址:
330
+ 如果业务要求内网部署、固定版本或自定义 CDN,再传入自托管地址(**完整 URL** 或站点相对路径):
307
331
 
308
332
  ```ts
309
333
  usePdfiumEngine({ wasmUrl: '/assets/pdfium.wasm', worker: true });
334
+
335
+ // 自有 OSS / CDN(示例)
336
+ usePdfiumEngine({
337
+ wasmUrl:
338
+ 'https://hep-editor.oss-cn-beijing.aliyuncs.com/public/editor-public/js/pdfium.wasm',
339
+ worker: true,
340
+ });
310
341
  ```
311
342
 
343
+ 详见 [docs/get-started/01-installation.md](../../docs/get-started/01-installation.md)。
344
+
312
345
  使用 `worker: true` 时,部署环境需要允许 worker 加载 wasm。若只在 worker 模式失败,可先用 `worker: false` 定位资源或响应头问题。
313
346
 
314
347
  ## `features` 配置示例
@@ -377,6 +410,28 @@ features: {
377
410
 
378
411
  ### 选区工具栏
379
412
 
413
+ #### 复制(默认开启,浮窗最左侧)
414
+
415
+ ```ts
416
+ import { h } from 'vue';
417
+
418
+ features: {
419
+ selectionToolbar: {
420
+ // hiddenBuiltinActions: ['copy'],
421
+ renderCopyIcon: () =>
422
+ h('span', { 'aria-hidden': true, style: { fontSize: '18px' } }, '📋'),
423
+ },
424
+ },
425
+ ```
426
+
427
+ ```ts
428
+ import { copyTextToClipboard } from '@embedpdf-editor/vue3-chapter-viewer';
429
+
430
+ await copyTextToClipboard('文本');
431
+ ```
432
+
433
+ #### 划线 + 扩展按钮
434
+
380
435
  ```ts
381
436
  features: {
382
437
  selectionToolbar: {
@@ -386,7 +441,8 @@ features: {
386
441
  },
387
442
  ```
388
443
 
389
- 配合 `ChapterPdfViewer` 的 `@extra-selection-action` 或 `build-selection-menu`。
444
+ 配合 `ChapterPdfViewer` 的 `@extra-selection-action` 或 `build-selection-menu`。
445
+ 更多字段说明见 [React 包 `features.selectionToolbar`](../react-chapter-viewer/README.md#featuresselectiontoolbar)。
390
446
 
391
447
  ## 进阶组合
392
448
 
@@ -430,10 +486,14 @@ import {
430
486
  | --- | --- |
431
487
  | `mode` | `replace` \| `merge` |
432
488
  | `bookmarks` / `notes` / `markup` | 导入导出子集,默认 true |
433
- | `ensureChapterLoaded` | 默认 true |
489
+ | `ensureChapterLoaded` | 默认 true;导出含 markup 的分段章会加载 **全部段** |
434
490
  | `persistNotes` / `persistBookmarks` | 导入后写回存储 |
435
491
 
436
- 详见 [React README 标注章节](../react-chapter-viewer/README.md#标注导入导出)。
492
+ 归档按 `chapterId` 分桶。详见 [10-annotations-io.md](../../docs/get-started/10-annotations-io.md)、[12-segmented-pdf-and-per-chapter-storage.md](../../docs/get-started/12-segmented-pdf-and-per-chapter-storage.md)、[React README 标注章节](../react-chapter-viewer/README.md#标注导入导出)。
493
+
494
+ ## 教程索引
495
+
496
+ [docs/get-started/README.md](../../docs/get-started/README.md)(含 `wasmUrl`、划词复制、事件全集 [11](./../../docs/get-started/11-events-callbacks-and-component-api.md)、分段 [12](./../../docs/get-started/12-segmented-pdf-and-per-chapter-storage.md))
437
497
 
438
498
  ## 常见问题
439
499
 
@@ -444,3 +504,4 @@ import {
444
504
  | 页码或滚动错位 | 检查 `globalPageRange` 与 `localPageRange` 页数是否一致 |
445
505
  | 划词笔记没有保存 | 实现 `notes.onCreateNote` 或自定义 `onRequestCreateNote` 流程 |
446
506
  | 书签删除无效 | `bookmarks.onRequestRemove` 需要返回 `true` 才会删除 |
507
+ | 分段章业务 ID 混乱 | 对外只用 `chapterId` + `localPageIndex`,勿用 `chapterId#sN` |