react-pdf-annotations
Version:
Set of React components for PDF annotation
149 lines (125 loc) • 3.67 kB
JavaScript
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; }
import React, { Component } from "react";
class PdfLoader extends Component {
constructor(...args) {
super(...args);
_defineProperty(this, "containerNode", void 0);
_defineProperty(this, "eventBus", void 0);
_defineProperty(this, "linkService", void 0);
_defineProperty(this, "pdfDocument", void 0);
_defineProperty(this, "state", {
pdfDocument: null,
error: null
});
_defineProperty(this, "documentRef", /*#__PURE__*/React.createRef());
_defineProperty(this, "attachRef", ref => {
this.containerNode = ref;
this.init();
});
}
// componentDidMount() {
// this.init();
// }
componentWillUnmount() {
const {
pdfDocument: discardedDocument
} = this.state;
if (discardedDocument) {
discardedDocument.destroy();
}
}
componentDidUpdate({
url
}) {
if (this.props.url !== url) {
this.init();
}
}
componentDidCatch(error, info) {
const {
onError
} = this.props;
if (onError) {
onError(error);
}
this.setState({
pdfDocument: null,
error
});
}
init() {
const {
url,
cMapUrl,
cMapPacked,
headers: httpHeaders = {}
} = this.props;
this.setState({
pdfDocument: null,
error: null
});
Promise.resolve().then(() => this.pdfDocument && this.pdfDocument.destroy()).then(async () => {
if (url) {
const pdfjsViewer = await import('pdfjs-dist/web/pdf_viewer');
this.eventBus = new pdfjsViewer.EventBus();
this.linkService = new pdfjsViewer.PDFLinkService(); // @ts-ignore
this.viewer = new pdfjsViewer.PDFViewer({
container: this.containerNode,
eventBus: this.eventBus,
linkService: this.linkService,
enhanceTextSelection: true,
removePageBorders: true
});
}
const pdfJS = await import('pdfjs-dist/build/pdf');
pdfJS.GlobalWorkerOptions.workerSrc = window.location.origin + '/pdf.worker.min.js';
await pdfJS.getDocument({
url,
ownerDocument,
cMapUrl,
cMapPacked,
httpHeaders,
withCredentials: true
}).promise.then(pdfDocument => {
this.pdfDocument = pdfDocument;
this.viewer.setDocument(pdfDocument);
}); // getDocument({ url, ownerDocument, cMapUrl, cMapPacked, httpHeaders, withCredentials: true }).promise.then(
// pdfDocument => {
// this.setState({ pdfDocument });
// }
// )
}).catch(e => this.componentDidCatch(e));
}
render() {
// const { children, beforeLoad } = this.props;
// const { pdfDocument, error } = this.state;
return /*#__PURE__*/React.createElement("div", {
ref: this.attachRef,
className: "PdfHighlighter",
onContextMenu: e => e.preventDefault()
}, /*#__PURE__*/React.createElement("div", {
className: "pdfViewer"
})); // return (
// <>
// <span ref={this.documentRef} />
// {error
// ? this.renderError()
// : !pdfDocument || !children
// ? beforeLoad
// : children(pdfDocument)}
// </>
// );
}
renderError() {
const {
errorMessage
} = this.props;
if (errorMessage) {
return /*#__PURE__*/React.cloneElement(errorMessage, {
error: this.state.error
});
}
return null;
}
}
export default PdfLoader;