@file-viewer/renderer-pdf 2.1.2 → 2.1.3

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.
Files changed (2) hide show
  1. package/dist/pdf.js +41 -36
  2. package/package.json +2 -2
package/dist/pdf.js CHANGED
@@ -1,6 +1,6 @@
1
1
  import { getDocument, GlobalWorkerOptions, PDFWorker as PdfJsWorker, PixelsPerInch, } from 'pdfjs-dist/legacy/build/pdf.mjs';
2
2
  import { EventBus, GenericL10n, PDFFindController, PDFLinkService, PDFViewer, } from 'pdfjs-dist/legacy/web/pdf_viewer.mjs';
3
- import { registerFileViewerSearchProvider, registerFileViewerZoomProvider, unregisterFileViewerSearchProvider, unregisterFileViewerZoomProvider, createFileViewerZoomChangeEmitter, buildPrintPageStyle, formatCssPixels, DEFAULT_PDF_RANGE_CHUNK_SIZE, } from '@file-viewer/core';
3
+ import { registerFileViewerSearchProvider, registerFileViewerZoomProvider, unregisterFileViewerSearchProvider, unregisterFileViewerZoomProvider, createFileViewerZoomChangeEmitter, createFileViewerTranslator, buildPrintPageStyle, formatCssPixels, DEFAULT_PDF_RANGE_CHUNK_SIZE, resolveFileViewerLocale, } from '@file-viewer/core';
4
4
  import { DEFAULT_FILE_VIEWER_PDF_WORKER_PATH, resolveFileViewerPdfAssetUrls, } from '@file-viewer/core/assets';
5
5
  import { pdfViewerStyle } from './pdfStyles.js';
6
6
  export const DEFAULT_FILE_VIEWER_PDF_WORKER_URL = DEFAULT_FILE_VIEWER_PDF_WORKER_PATH;
@@ -89,14 +89,14 @@ const waitForPaint = (view) => new Promise(resolve => {
89
89
  const resolvePdfWorkerUrl = (options, documentUrl) => {
90
90
  return resolveFileViewerPdfAssetUrls(options, documentUrl).workerUrl;
91
91
  };
92
- const buildOutlineItems = (items, prefix = 'outline') => items.map((item, index) => {
92
+ const buildOutlineItems = (items, prefix = 'outline', getFallbackTitle = index => `Outline ${index + 1}`) => items.map((item, index) => {
93
93
  const id = `${prefix}-${index}`;
94
94
  const children = Array.isArray(item.items)
95
- ? buildOutlineItems(item.items, id)
95
+ ? buildOutlineItems(item.items, id, getFallbackTitle)
96
96
  : [];
97
97
  return {
98
98
  id,
99
- title: item.title || `目录 ${index + 1}`,
99
+ title: item.title || getFallbackTitle(index),
100
100
  dest: item.dest || null,
101
101
  items: children,
102
102
  expanded: index < 4,
@@ -106,8 +106,10 @@ export default async function renderPdf(buffer, target, context) {
106
106
  var _a, _b;
107
107
  const documentRef = target.ownerDocument || document;
108
108
  const targetWindow = documentRef.defaultView || (typeof window !== 'undefined' ? window : null);
109
+ const t = createFileViewerTranslator(context === null || context === void 0 ? void 0 : context.options);
110
+ const resolvedLocale = resolveFileViewerLocale(context === null || context === void 0 ? void 0 : context.options);
109
111
  if (!targetWindow) {
110
- throw new Error('PDF preview requires a browser window');
112
+ throw new Error(t('pdf.error.browserWindow'));
111
113
  }
112
114
  const options = (_a = context === null || context === void 0 ? void 0 : context.options) === null || _a === void 0 ? void 0 : _a.pdf;
113
115
  const navigationEnabled = (options === null || options === void 0 ? void 0 : options.navigation) !== false;
@@ -157,28 +159,29 @@ export default async function renderPdf(buffer, target, context) {
157
159
  root.dataset.viewerSearchProvider = 'pdf';
158
160
  root.dataset.viewerZoomProvider = 'pdf';
159
161
  const toolbar = createElement(documentRef, 'div', 'pdf-toolbar');
160
- const navToggleButton = createButton(documentRef, 'pdf-icon-button', '切换导航窗格');
162
+ const navToggleButton = createButton(documentRef, 'pdf-icon-button', t('pdf.toolbar.toggleNavigation'));
161
163
  navToggleButton.setAttribute('aria-pressed', String(navVisible));
162
164
  navToggleButton.append(createElement(documentRef, 'span', 'pdf-panel-icon'));
163
165
  const pageGroup = createElement(documentRef, 'div', 'pdf-toolbar-group');
164
- const previousPageButton = createButton(documentRef, 'pdf-icon-button', '上一页', '‹');
166
+ const previousPageButton = createButton(documentRef, 'pdf-icon-button', t('pdf.toolbar.previousPage'), '‹');
165
167
  const pageMeter = createElement(documentRef, 'span', 'pdf-page-meter');
166
168
  const pageMeterCurrent = createElement(documentRef, 'strong', undefined, '1');
167
169
  const pageMeterTotal = createElement(documentRef, 'span', undefined, '/ -');
168
170
  pageMeter.append(pageMeterCurrent, pageMeterTotal);
169
- const nextPageButton = createButton(documentRef, 'pdf-icon-button', '下一页', '›');
171
+ const nextPageButton = createButton(documentRef, 'pdf-icon-button', t('pdf.toolbar.nextPage'), '›');
170
172
  pageGroup.append(previousPageButton, pageMeter, nextPageButton);
171
173
  const zoomGroup = createElement(documentRef, 'div', 'pdf-toolbar-group pdf-toolbar-group--zoom');
172
- const zoomOutButton = createButton(documentRef, 'pdf-icon-button', '缩小', '−');
174
+ const zoomOutButton = createButton(documentRef, 'pdf-icon-button', t('pdf.toolbar.zoomOut'), '−');
173
175
  const scaleButton = createElement(documentRef, 'button', 'pdf-scale-button', '100%');
174
176
  scaleButton.type = 'button';
175
- scaleButton.title = '适合宽度';
176
- const zoomInButton = createButton(documentRef, 'pdf-icon-button', '放大', '+');
177
+ scaleButton.title = t('pdf.toolbar.fitWidth');
178
+ scaleButton.setAttribute('aria-label', t('pdf.toolbar.fitWidth'));
179
+ const zoomInButton = createButton(documentRef, 'pdf-icon-button', t('pdf.toolbar.zoomIn'), '+');
177
180
  zoomGroup.append(zoomOutButton, scaleButton, zoomInButton);
178
181
  const rotateGroup = createElement(documentRef, 'div', 'pdf-toolbar-group pdf-toolbar-group--rotate');
179
- const rotateLeftButton = createButton(documentRef, 'pdf-icon-button', '向左旋转', '↺');
182
+ const rotateLeftButton = createButton(documentRef, 'pdf-icon-button', t('pdf.toolbar.rotateLeft'), '↺');
180
183
  const rotationMeter = createElement(documentRef, 'span', 'pdf-rotation-meter', `${currentRotation}°`);
181
- const rotateRightButton = createButton(documentRef, 'pdf-icon-button', '向右旋转', '↻');
184
+ const rotateRightButton = createButton(documentRef, 'pdf-icon-button', t('pdf.toolbar.rotateRight'), '↻');
182
185
  rotateGroup.append(rotateLeftButton, rotationMeter, rotateRightButton);
183
186
  if (navigationEnabled) {
184
187
  toolbar.append(navToggleButton);
@@ -187,16 +190,16 @@ export default async function renderPdf(buffer, target, context) {
187
190
  const content = createElement(documentRef, 'div', 'pdf-content');
188
191
  const navPane = createElement(documentRef, 'aside', 'pdf-nav-pane');
189
192
  const navHead = createElement(documentRef, 'div', 'pdf-nav-head');
190
- const navTitle = createElement(documentRef, 'span', undefined, '页面导航');
191
- const navCount = createElement(documentRef, 'strong', undefined, '0 页');
193
+ const navTitle = createElement(documentRef, 'span', undefined, t('pdf.nav.pagesTitle'));
194
+ const navCount = createElement(documentRef, 'strong', undefined, t('pdf.nav.pageCount', { count: 0 }));
192
195
  navHead.append(navTitle, navCount);
193
196
  const navTabs = createElement(documentRef, 'div', 'pdf-nav-tabs');
194
197
  navTabs.setAttribute('role', 'tablist');
195
- navTabs.setAttribute('aria-label', 'PDF 导航类型');
196
- const pagesTab = createButton(documentRef, '', '页面');
197
- const outlineTab = createButton(documentRef, '', '目录');
198
- pagesTab.textContent = '页面';
199
- outlineTab.textContent = '目录';
198
+ navTabs.setAttribute('aria-label', t('pdf.nav.typeLabel'));
199
+ const pagesTab = createButton(documentRef, '', t('pdf.nav.pagesTab'));
200
+ const outlineTab = createButton(documentRef, '', t('pdf.nav.outlineTab'));
201
+ pagesTab.textContent = t('pdf.nav.pagesTab');
202
+ outlineTab.textContent = t('pdf.nav.outlineTab');
200
203
  pagesTab.setAttribute('role', 'tab');
201
204
  outlineTab.setAttribute('role', 'tab');
202
205
  navTabs.append(pagesTab, outlineTab);
@@ -206,7 +209,7 @@ export default async function renderPdf(buffer, target, context) {
206
209
  const container = createElement(documentRef, 'div', 'pdf-wrapper');
207
210
  container.dataset.viewerScrollContainer = 'true';
208
211
  const pdfViewerRoot = createElement(documentRef, 'div', 'pdfViewer');
209
- const stateNode = createElement(documentRef, 'div', 'pdf-state', '正在加载 PDF...');
212
+ const stateNode = createElement(documentRef, 'div', 'pdf-state', t('pdf.state.loading'));
210
213
  container.append(pdfViewerRoot, stateNode);
211
214
  viewport.append(container);
212
215
  content.append(navPane, viewport);
@@ -256,7 +259,7 @@ export default async function renderPdf(buffer, target, context) {
256
259
  else {
257
260
  thumb.textContent = String(page);
258
261
  }
259
- button.append(thumb, createElement(documentRef, 'span', 'pdf-page-label', `第 ${page} 页`));
262
+ button.append(thumb, createElement(documentRef, 'span', 'pdf-page-label', t('pdf.nav.pageLabel', { page })));
260
263
  button.addEventListener('click', () => goToPage(page));
261
264
  navList.append(button);
262
265
  }
@@ -280,7 +283,7 @@ export default async function renderPdf(buffer, target, context) {
280
283
  navList.append(button);
281
284
  });
282
285
  if (!entries.length) {
283
- navList.append(createElement(documentRef, 'div', 'pdf-outline-empty', '当前 PDF 没有可用目录'));
286
+ navList.append(createElement(documentRef, 'div', 'pdf-outline-empty', t('pdf.nav.outlineEmpty')));
284
287
  }
285
288
  };
286
289
  const paintPdfThumbnail = (pageNumber, thumb) => {
@@ -292,7 +295,7 @@ export default async function renderPdf(buffer, target, context) {
292
295
  }
293
296
  const image = documentRef.createElement('img');
294
297
  image.src = imageUrl;
295
- image.alt = `第 ${pageNumber} 页缩略图`;
298
+ image.alt = t('pdf.thumbnail.alt', { page: pageNumber });
296
299
  image.loading = 'lazy';
297
300
  thumb.replaceChildren(image);
298
301
  return true;
@@ -389,8 +392,10 @@ export default async function renderPdf(buffer, target, context) {
389
392
  outlineTab.classList.toggle('active', navMode === 'outline');
390
393
  pagesTab.setAttribute('aria-selected', navMode === 'pages' ? 'true' : 'false');
391
394
  outlineTab.setAttribute('aria-selected', navMode === 'outline' ? 'true' : 'false');
392
- navTitle.textContent = navMode === 'pages' ? '页面导航' : '目录导航';
393
- navCount.textContent = navMode === 'pages' ? `${pageCount} 页` : `${outlineCount()} 项`;
395
+ navTitle.textContent = navMode === 'pages' ? t('pdf.nav.pagesTitle') : t('pdf.nav.outlineTitle');
396
+ navCount.textContent = navMode === 'pages'
397
+ ? t('pdf.nav.pageCount', { count: pageCount })
398
+ : t('pdf.nav.itemCount', { count: outlineCount() });
394
399
  pageMeterCurrent.textContent = String(currentPage);
395
400
  pageMeterTotal.textContent = `/ ${pageCount || '-'}`;
396
401
  scaleButton.textContent = scaleText();
@@ -401,7 +406,7 @@ export default async function renderPdf(buffer, target, context) {
401
406
  zoomInButton.disabled = !canZoomIn();
402
407
  stateNode.hidden = loadStatus === 'ready';
403
408
  stateNode.classList.toggle('pdf-state--error', loadStatus === 'error');
404
- stateNode.textContent = loadStatus === 'error' ? errorMessage : '正在加载 PDF...';
409
+ stateNode.textContent = loadStatus === 'error' ? errorMessage : t('pdf.state.loading');
405
410
  renderNavList();
406
411
  };
407
412
  const writeLegacyCompatiblePageDimensions = () => {
@@ -734,7 +739,7 @@ export default async function renderPdf(buffer, target, context) {
734
739
  return;
735
740
  }
736
741
  outlineItems = Array.isArray(outline)
737
- ? buildOutlineItems(outline)
742
+ ? buildOutlineItems(outline, 'outline', index => t('pdf.nav.outlineFallbackTitle', { index: index + 1 }))
738
743
  : [];
739
744
  syncUi();
740
745
  }
@@ -753,7 +758,7 @@ export default async function renderPdf(buffer, target, context) {
753
758
  var _a, _b;
754
759
  const pdfDocument = pdfContext.document;
755
760
  if (!pdfDocument) {
756
- throw new Error('PDF 尚未加载完成,请稍后再试');
761
+ throw new Error(t('pdf.error.notLoaded'));
757
762
  }
758
763
  const page = await pdfDocument.getPage(Math.min(Math.max(pageNumber, 1), pdfDocument.numPages));
759
764
  const viewport = page.getViewport({
@@ -778,12 +783,12 @@ export default async function renderPdf(buffer, target, context) {
778
783
  var _a, _b;
779
784
  const pdfDocument = pdfContext.document;
780
785
  if (!pdfDocument) {
781
- throw new Error('PDF 尚未加载完成,请稍后再试');
786
+ throw new Error(t('pdf.error.notLoaded'));
782
787
  }
783
788
  const pagesHtml = [];
784
789
  for (let pageNumber = 1; pageNumber <= pdfDocument.numPages; pageNumber += 1) {
785
790
  if (destroyed) {
786
- throw new Error('PDF 已卸载,无法继续打印');
791
+ throw new Error(t('pdf.error.unloaded'));
787
792
  }
788
793
  const page = await pdfDocument.getPage(pageNumber);
789
794
  const baseViewport = page.getViewport({
@@ -800,12 +805,12 @@ export default async function renderPdf(buffer, target, context) {
800
805
  const canvas = documentRef.createElement('canvas');
801
806
  const canvasContext = canvas.getContext('2d');
802
807
  if (!canvasContext) {
803
- throw new Error('当前浏览器无法创建 PDF 打印画布');
808
+ throw new Error(t('pdf.error.canvasUnavailable'));
804
809
  }
805
810
  canvas.width = Math.ceil(renderViewport.width);
806
811
  canvas.height = Math.ceil(renderViewport.height);
807
812
  await page.render({ canvas, canvasContext, viewport: renderViewport }).promise;
808
- const pageTitle = `${exportOptions.title} - ${pageNumber} 页`;
813
+ const pageTitle = t('pdf.export.pageTitle', { title: exportOptions.title, page: pageNumber });
809
814
  const pageStyle = [
810
815
  `--viewer-print-page-width:${formatCssPixels(pageWidth)}`,
811
816
  `--viewer-print-page-height:${formatCssPixels(pageHeight)}`,
@@ -848,7 +853,7 @@ export default async function renderPdf(buffer, target, context) {
848
853
  eventBus,
849
854
  linkService: pdfLinkService,
850
855
  findController: pdfFindController,
851
- l10n: new GenericL10n('zh-CN'),
856
+ l10n: new GenericL10n(resolvedLocale),
852
857
  enableAutoLinking: false,
853
858
  });
854
859
  pdfContext.viewer = pdfViewer;
@@ -882,7 +887,7 @@ export default async function renderPdf(buffer, target, context) {
882
887
  });
883
888
  eventBus.on('pagerendered', scheduleLegacyPageDimensionPatch);
884
889
  if (!(context === null || context === void 0 ? void 0 : context.streamUrl) && !buffer.byteLength) {
885
- throw new Error('PDF 缺少可读取的数据源');
890
+ throw new Error(t('pdf.error.missingSource'));
886
891
  }
887
892
  const worker = createPdfWorker();
888
893
  const pdfAssets = resolveFileViewerPdfAssetUrls(options, documentRef.URL || documentRef.baseURI);
@@ -937,7 +942,7 @@ export default async function renderPdf(buffer, target, context) {
937
942
  return;
938
943
  }
939
944
  loadStatus = 'error';
940
- errorMessage = error instanceof Error ? error.message : 'PDF 加载失败';
945
+ errorMessage = error instanceof Error ? error.message : t('pdf.error.loadFailed');
941
946
  syncUi();
942
947
  }
943
948
  };
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@file-viewer/renderer-pdf",
3
- "version": "2.1.2",
3
+ "version": "2.1.3",
4
4
  "private": false,
5
5
  "type": "module",
6
6
  "description": "Standalone PDF renderer plugin for Flyfish File Viewer powered by PDF.js.",
@@ -54,7 +54,7 @@
54
54
  "LICENSE"
55
55
  ],
56
56
  "dependencies": {
57
- "@file-viewer/core": "^2.1.2",
57
+ "@file-viewer/core": "^2.1.3",
58
58
  "pdfjs-dist": "^6.0.227"
59
59
  },
60
60
  "devDependencies": {