UNPKG

@livelybone/easy-pdf

Version:

An easy-to-use PDF rendering library in browser, can be used as a solution to customize the display of PDF in App. Based on mozilla/pdf.js, the js/css is loaded via CDN asynchronously. 一个简便易用的,原生使用方式的(适用于各大框架)网页端 PDF 渲染插件,也可作为小程序/App webview 中自定义展示 pdf 的解

181 lines (162 loc) 5.41 kB
/** * Bundle of @livelybone/easy-pdf * Generated: 2020-03-19 * Version: 1.0.6 * License: MIT * Author: 2631541504@qq.com */ import { loadRemote } from 'load-remote'; function _defineProperty(obj, key, value) { if (key in obj) { Object.defineProperty(obj, key, { value: value, enumerable: true, configurable: true, writable: true }); } else { obj[key] = value; } return obj; } function ownKeys(object, enumerableOnly) { var keys = Object.keys(object); if (Object.getOwnPropertySymbols) { var symbols = Object.getOwnPropertySymbols(object); if (enumerableOnly) symbols = symbols.filter(function (sym) { return Object.getOwnPropertyDescriptor(object, sym).enumerable; }); keys.push.apply(keys, symbols); } return keys; } function _objectSpread2(target) { for (var i = 1; i < arguments.length; i++) { var source = arguments[i] != null ? arguments[i] : {}; if (i % 2) { ownKeys(Object(source), true).forEach(function (key) { _defineProperty(target, key, source[key]); }); } else if (Object.getOwnPropertyDescriptors) { Object.defineProperties(target, Object.getOwnPropertyDescriptors(source)); } else { ownKeys(Object(source)).forEach(function (key) { Object.defineProperty(target, key, Object.getOwnPropertyDescriptor(source, key)); }); } } return target; } function loadPdfResources(resources) { var cssFiles = [resources && resources.pdfViewerCssUrl || 'https://cdn.jsdelivr.net/npm/pdfjs-dist@2.2.228/web/pdf_viewer.css']; var scripts = [resources && resources.pdfJsUrl || 'https://cdn.jsdelivr.net/npm/pdfjs-dist@2.2.228/build/pdf.min.js', resources && resources.pdfViewerJsUrl || 'https://cdn.jsdelivr.net/npm/pdfjs-dist@2.2.228/web/pdf_viewer.js']; var arr = cssFiles.map(function (url) { return loadRemote(url); }); arr.push(scripts.reduce(function (pre, str) { return pre.then(function () { return loadRemote(str); }); }, Promise.resolve(0))); return Promise.all(arr).catch(function (e) { console.error(e); throw new Error('PDF rendered failed: Scripts loaded failed'); }); } function addClass(el, className) { var $className = el.className; // eslint-disable-next-line no-param-reassign if (!$className) el.className = className;else { // eslint-disable-next-line no-param-reassign el.className = $className.split(/\s+/).filter(function (str) { return str !== className; }).concat(className).join(' '); } } function getDefaultViewport(page) { return page.getViewport({ scale: 96.0 / 72.0 }); } function readPdf(url, options) { return loadRemote(options && options.pdfJsUrl || 'https://cdn.jsdelivr.net/npm/pdfjs-dist@2.2.228/build/pdf.min.js').then(function () { return pdfjsLib.getDocument(_objectSpread2({ url: url, cMapPacked: true, cMapUrl: 'https://cdn.jsdelivr.net/npm/pdfjs-dist@2.2.228/cmaps/', disableAutoFetch: false, disableCreateObjectURL: false, disableFontFace: false, disableRange: false, disableStream: false, docBaseUrl: window.location.href, isEvalSupported: true, maxImageSize: -1, pdfBug: false, verbosity: 1 }, options)); }); } function renderPdf(url, options) { return loadPdfResources(options.readPdfOptions).then(function () { return readPdf(url, options.readPdfOptions); }).then(function (pdf) { var viewer = options.viewer || document.createElement('div'); if (!options.viewer) options.container.appendChild(viewer); addClass(options.container, 'pdf-container'); addClass(viewer, 'pdf-viewer'); var pdfViewer = new pdfjsViewer.PDFViewer({ container: options.container, viewer: viewer }); pdfViewer.setDocument(pdf); return pdf.getPage(1).then(getDefaultViewport).then(function (viewport) { var viewerWidth = pdfViewer.viewer.clientWidth; pdfViewer.currentScaleValue = viewerWidth / viewport.width; return { pdfViewer: pdfViewer, pdf: pdf, pdfjsLib: pdfjsLib, pdfjsViewer: pdfjsViewer }; }); }); } /** * @param pdf The result of readPdf * @param pageIndex * @param options * */ function renderPdfPage(pdf, pageIndex, options) { return loadPdfResources(options.loadPdfViewOptions).then(function () { addClass(options.container, 'pdf-container'); return pdf.getPage(pageIndex).then(function (pdfPage) { var viewport = pdfPage.getViewport({ scale: 96.0 / 72.0 }); var viewer = options.container.getElementsByClassName('pdf-viewer')[0]; if (!viewer) { viewer = document.createElement('div'); addClass(viewer, 'pdf-viewer'); options.container.appendChild(viewer); } var viewerWidth = viewer.clientWidth; var pageViewer = new pdfjsViewer.PDFPageView({ container: viewer, eventBus: pdf.eventBus, id: pageIndex, scale: viewerWidth / viewport.width, defaultViewport: viewport.clone(), enableWebGL: true }); pageViewer.setPdfPage(pdfPage); pageViewer.draw(); return { pageViewer: pageViewer, pdfPage: pdfPage, pdfjsLib: pdfjsLib, pdfjsViewer: pdfjsViewer }; }); }); } export { loadPdfResources, readPdf, renderPdf, renderPdfPage };