@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
JavaScript
/**
* 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 };