@file-viewer/renderer-pdf 2.1.26 → 2.1.28

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 +63 -48
  2. package/package.json +2 -2
package/dist/pdf.js CHANGED
@@ -1,7 +1,7 @@
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
3
  import { registerFileViewerSearchProvider, registerFileViewerZoomProvider, unregisterFileViewerSearchProvider, unregisterFileViewerZoomProvider, registerFileViewerViewStateProvider, unregisterFileViewerViewStateProvider, createFileViewerZoomChangeEmitter, createFileViewerViewStateChange, createFileViewerViewStateChangeEmitter, createFileViewerTranslator, buildPrintPageStyle, formatCssPixels, DEFAULT_PDF_RANGE_CHUNK_SIZE, resolveFileViewerLocale, resolveFileViewerFitScale, } from '@file-viewer/core';
4
- import { DEFAULT_FILE_VIEWER_PDF_WORKER_PATH, resolveFileViewerPdfAssetUrls, } from '@file-viewer/core/assets';
4
+ import { DEFAULT_FILE_VIEWER_PDF_WORKER_PATH, resolveFileViewerPdfAssetUrls, resolveFileViewerRuntimeAssetBaseUrl, } from '@file-viewer/core/assets';
5
5
  import { pdfViewerStyle } from './pdfStyles.js';
6
6
  import { collectMalformedIdentityFontNames, createPdfCjkFontFallbackManager, detectMalformedIdentityCjkFontFamilies, } from './pdfFontFallback.js';
7
7
  export const DEFAULT_FILE_VIEWER_PDF_WORKER_URL = DEFAULT_FILE_VIEWER_PDF_WORKER_PATH;
@@ -254,50 +254,6 @@ const installBundledPdfFakeWorker = async () => {
254
254
  const resolvePdfWorkerUrl = (options, documentBaseUrl) => {
255
255
  return resolveFileViewerPdfAssetUrls(options, documentBaseUrl).workerUrl;
256
256
  };
257
- const readBundlerPublicBaseUrl = () => {
258
- var _a;
259
- try {
260
- const value = (_a = import.meta.env) === null || _a === void 0 ? void 0 : _a.BASE_URL;
261
- return typeof value === 'string' ? value.trim() : '';
262
- }
263
- catch {
264
- return '';
265
- }
266
- };
267
- const resolvePdfRuntimeAssetBaseUrl = (documentRef) => {
268
- const documentBaseUrl = documentRef.baseURI || documentRef.URL || 'file:///';
269
- const bundlerBaseUrl = readBundlerPublicBaseUrl();
270
- if (bundlerBaseUrl && bundlerBaseUrl !== '.' && bundlerBaseUrl !== './') {
271
- try {
272
- return new URL(bundlerBaseUrl.endsWith('/') ? bundlerBaseUrl : `${bundlerBaseUrl}/`, documentBaseUrl).href;
273
- }
274
- catch {
275
- // Continue with DOM-based public-path detection.
276
- }
277
- }
278
- // An explicit <base> is authoritative and already reflected by baseURI.
279
- if (documentRef.querySelector('base[href]')) {
280
- return documentBaseUrl;
281
- }
282
- // Entry scripts remain under the public deployment base when an SPA route
283
- // changes document.baseURI. This covers Vite and common UMI/Webpack layouts.
284
- for (const script of Array.from(documentRef.querySelectorAll('script[src]'))) {
285
- try {
286
- const scriptUrl = new URL(script.src || script.getAttribute('src') || '', documentBaseUrl);
287
- const assetDirectory = scriptUrl.pathname.match(/^(.*\/)(?:assets|static)\/[^/]+$/i);
288
- if (assetDirectory) {
289
- return new URL(assetDirectory[1], scriptUrl.origin).href;
290
- }
291
- if (/\/(?:umi|main|index)(?:[.-][^/]*)?\.(?:m?js)$/i.test(scriptUrl.pathname)) {
292
- return new URL('./', scriptUrl).href;
293
- }
294
- }
295
- catch {
296
- // Ignore unrelated or malformed script URLs.
297
- }
298
- }
299
- return documentBaseUrl;
300
- };
301
257
  const buildOutlineItems = (items, prefix = 'outline', getFallbackTitle = index => `Outline ${index + 1}`) => items.map((item, index) => {
302
258
  const id = `${prefix}-${index}`;
303
259
  const children = Array.isArray(item.items)
@@ -312,7 +268,7 @@ const buildOutlineItems = (items, prefix = 'outline', getFallbackTitle = index =
312
268
  };
313
269
  });
314
270
  export default async function renderPdf(buffer, target, context) {
315
- var _a, _b, _c;
271
+ var _a, _b, _c, _d;
316
272
  const documentRef = target.ownerDocument || document;
317
273
  const targetWindow = documentRef.defaultView || (typeof window !== 'undefined' ? window : null);
318
274
  const t = createFileViewerTranslator(context === null || context === void 0 ? void 0 : context.options);
@@ -321,7 +277,7 @@ export default async function renderPdf(buffer, target, context) {
321
277
  throw new Error(t('pdf.error.browserWindow'));
322
278
  }
323
279
  const options = (_a = context === null || context === void 0 ? void 0 : context.options) === null || _a === void 0 ? void 0 : _a.pdf;
324
- const pdfRuntimeAssetBaseUrl = resolvePdfRuntimeAssetBaseUrl(documentRef);
280
+ const pdfRuntimeAssetBaseUrl = resolveFileViewerRuntimeAssetBaseUrl(documentRef);
325
281
  const cjkFontFallbackEnabled = (options === null || options === void 0 ? void 0 : options.cjkFontFallback) !== false;
326
282
  const identityFontRepairEnabled = (options === null || options === void 0 ? void 0 : options.identityFontRepair) !== false;
327
283
  const fontInspectionEnabled = cjkFontFallbackEnabled || identityFontRepairEnabled;
@@ -586,6 +542,64 @@ export default async function renderPdf(buffer, target, context) {
586
542
  pendingPdfThumbnails.delete(pageNumber);
587
543
  }
588
544
  };
545
+ const renderFirstPageThumbnail = async (captureOptions) => {
546
+ var _a, _b, _c, _d, _e, _f;
547
+ const pdfDocument = pdfContext.document;
548
+ if (!pdfDocument) {
549
+ return null;
550
+ }
551
+ if ((_a = captureOptions.signal) === null || _a === void 0 ? void 0 : _a.aborted) {
552
+ throw captureOptions.signal.reason;
553
+ }
554
+ const page = await pdfDocument.getPage(1);
555
+ await ensurePdfPageCjkFontFallback(1, page);
556
+ const baseViewport = page.getViewport({ scale: 1, rotation: currentRotation });
557
+ const scale = Math.max(0.1, Math.min(captureOptions.width / Math.max(baseViewport.width, 1), captureOptions.height / Math.max(baseViewport.height, 1)));
558
+ const viewport = page.getViewport({ scale, rotation: currentRotation });
559
+ const canvas = documentRef.createElement('canvas');
560
+ const canvasContext = canvas.getContext('2d');
561
+ if (!canvasContext) {
562
+ return null;
563
+ }
564
+ canvas.width = Math.max(1, Math.ceil(viewport.width));
565
+ canvas.height = Math.max(1, Math.ceil(viewport.height));
566
+ const renderTask = page.render({ canvas, canvasContext, viewport });
567
+ const cancelRender = () => renderTask.cancel();
568
+ (_b = captureOptions.signal) === null || _b === void 0 ? void 0 : _b.addEventListener('abort', cancelRender, { once: true });
569
+ try {
570
+ await renderTask.promise;
571
+ if ((_c = captureOptions.signal) === null || _c === void 0 ? void 0 : _c.aborted) {
572
+ throw captureOptions.signal.reason;
573
+ }
574
+ return await new Promise(resolve => canvas.toBlob(resolve, 'image/png'));
575
+ }
576
+ catch (error) {
577
+ if ((_d = captureOptions.signal) === null || _d === void 0 ? void 0 : _d.aborted) {
578
+ throw captureOptions.signal.reason;
579
+ }
580
+ throw error;
581
+ }
582
+ finally {
583
+ (_e = captureOptions.signal) === null || _e === void 0 ? void 0 : _e.removeEventListener('abort', cancelRender);
584
+ canvas.width = 0;
585
+ canvas.height = 0;
586
+ (_f = page.cleanup) === null || _f === void 0 ? void 0 : _f.call(page);
587
+ }
588
+ };
589
+ (_d = context === null || context === void 0 ? void 0 : context.registerThumbnailAdapter) === null || _d === void 0 ? void 0 : _d.call(context, {
590
+ beforeCapture: async ({ signal }) => {
591
+ while (loadStatus === 'loading' && !destroyed) {
592
+ if (signal === null || signal === void 0 ? void 0 : signal.aborted) {
593
+ throw signal.reason;
594
+ }
595
+ await new Promise(resolve => targetWindow.setTimeout(resolve, 16));
596
+ }
597
+ if (loadStatus === 'error') {
598
+ throw new Error(errorMessage || t('pdf.error.loadFailed'));
599
+ }
600
+ },
601
+ capture: renderFirstPageThumbnail,
602
+ });
589
603
  const ensureThumbnailObserver = () => {
590
604
  if (!thumbnailsEnabled || thumbnailObserver || typeof targetWindow.IntersectionObserver !== 'function') {
591
605
  return;
@@ -1679,7 +1693,7 @@ export default async function renderPdf(buffer, target, context) {
1679
1693
  return {
1680
1694
  $el: root,
1681
1695
  unmount() {
1682
- var _a;
1696
+ var _a, _b;
1683
1697
  destroyed = true;
1684
1698
  loadVersion += 1;
1685
1699
  restorePdfJsMissingSystemFontWarnings();
@@ -1700,6 +1714,7 @@ export default async function renderPdf(buffer, target, context) {
1700
1714
  unregisterFileViewerViewStateProvider(root);
1701
1715
  outlineItems = [];
1702
1716
  (_a = context === null || context === void 0 ? void 0 : context.registerExportAdapter) === null || _a === void 0 ? void 0 : _a.call(context, null);
1717
+ (_b = context === null || context === void 0 ? void 0 : context.registerThumbnailAdapter) === null || _b === void 0 ? void 0 : _b.call(context, null);
1703
1718
  const resource = pdfContext.resource;
1704
1719
  pdfContext.viewer = null;
1705
1720
  pdfContext.linkService = null;
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@file-viewer/renderer-pdf",
3
- "version": "2.1.26",
3
+ "version": "2.1.28",
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.26",
57
+ "@file-viewer/core": "2.1.28",
58
58
  "@fontsource-variable/noto-sans-sc": "5.2.10",
59
59
  "pdf-lib": "1.17.1",
60
60
  "pdfjs-dist": "5.4.624"