react-pdf
Version:
Display PDFs in your React app as easily as if they were images.
488 lines (393 loc) • 13.9 kB
JavaScript
'use strict';
Object.defineProperty(exports, "__esModule", {
value: true
});
var _extends2 = require('babel-runtime/helpers/extends');
var _extends3 = _interopRequireDefault(_extends2);
var _getPrototypeOf = require('babel-runtime/core-js/object/get-prototype-of');
var _getPrototypeOf2 = _interopRequireDefault(_getPrototypeOf);
var _classCallCheck2 = require('babel-runtime/helpers/classCallCheck');
var _classCallCheck3 = _interopRequireDefault(_classCallCheck2);
var _createClass2 = require('babel-runtime/helpers/createClass');
var _createClass3 = _interopRequireDefault(_createClass2);
var _possibleConstructorReturn2 = require('babel-runtime/helpers/possibleConstructorReturn');
var _possibleConstructorReturn3 = _interopRequireDefault(_possibleConstructorReturn2);
var _inherits2 = require('babel-runtime/helpers/inherits');
var _inherits3 = _interopRequireDefault(_inherits2);
var _react = require('react');
var _react2 = _interopRequireDefault(_react);
var _propTypes = require('prop-types');
var _propTypes2 = _interopRequireDefault(_propTypes);
var _mergeClassNames = require('merge-class-names');
var _mergeClassNames2 = _interopRequireDefault(_mergeClassNames);
var _PageCanvas = require('./Page/PageCanvas');
var _PageCanvas2 = _interopRequireDefault(_PageCanvas);
var _PageSVG = require('./Page/PageSVG');
var _PageSVG2 = _interopRequireDefault(_PageSVG);
var _TextLayer = require('./Page/TextLayer');
var _TextLayer2 = _interopRequireDefault(_TextLayer);
var _AnnotationLayer = require('./Page/AnnotationLayer');
var _AnnotationLayer2 = _interopRequireDefault(_AnnotationLayer);
var _utils = require('./shared/utils');
var _events = require('./shared/events');
var _propTypes3 = require('./shared/propTypes');
function _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; }
var Page = function (_Component) {
(0, _inherits3.default)(Page, _Component);
function Page() {
var _ref;
var _temp, _this, _ret;
(0, _classCallCheck3.default)(this, Page);
for (var _len = arguments.length, args = Array(_len), _key = 0; _key < _len; _key++) {
args[_key] = arguments[_key];
}
return _ret = (_temp = (_this = (0, _possibleConstructorReturn3.default)(this, (_ref = Page.__proto__ || (0, _getPrototypeOf2.default)(Page)).call.apply(_ref, [this].concat(args))), _this), _this.state = {
page: null
}, _this.onLoadSuccess = function (page) {
_this.setState({ page: page }, function () {
(0, _utils.callIfDefined)(_this.props.onLoadSuccess, (0, _utils.makePageCallback)(page, _this.scale));
(0, _utils.callIfDefined)(_this.context.registerPage, page.pageIndex, _this.ref);
});
}, _this.onLoadError = function (error) {
if (error.name === 'RenderingCancelledException' || error.name === 'PromiseCancelledException') {
return;
}
(0, _utils.errorOnDev)(error.message, error);
(0, _utils.callIfDefined)(_this.props.onLoadError, error);
_this.setState({ page: false });
}, _temp), (0, _possibleConstructorReturn3.default)(_this, _ret);
}
(0, _createClass3.default)(Page, [{
key: 'componentDidMount',
value: function componentDidMount() {
this.loadPage();
}
}, {
key: 'componentWillReceiveProps',
value: function componentWillReceiveProps(nextProps, nextContext) {
if (this.getPdf(nextProps, nextContext) !== this.getPdf() || this.getPageNumber(nextProps) !== this.getPageNumber()) {
(0, _utils.callIfDefined)(this.context.unregisterPage, this.pageIndex);
if (this.state.page !== null) {
this.setState({ page: null });
}
this.loadPage(nextProps, nextContext);
}
}
}, {
key: 'componentWillUnmount',
value: function componentWillUnmount() {
(0, _utils.callIfDefined)(this.context.unregisterPage, this.pageIndex);
(0, _utils.cancelRunningTask)(this.runningTask);
}
}, {
key: 'getPdf',
value: function getPdf() {
var props = arguments.length > 0 && arguments[0] !== undefined ? arguments[0] : this.props;
var context = arguments.length > 1 && arguments[1] !== undefined ? arguments[1] : this.context;
return props.pdf || context.pdf;
}
}, {
key: 'getChildContext',
value: function getChildContext() {
if (!this.state.page) {
return {};
}
var context = {
page: this.state.page,
pdf: this.getPdf(),
rotate: this.rotate,
scale: this.scale
};
if (this.props.onRenderError) {
context.onRenderError = this.props.onRenderError;
}
if (this.props.onRenderSuccess) {
context.onRenderSuccess = this.props.onRenderSuccess;
}
if (this.props.onGetAnnotationsError) {
context.onGetAnnotationsError = this.props.onGetAnnotationsError;
}
if (this.props.onGetAnnotationsSuccess) {
context.onGetAnnotationsSuccess = this.props.onGetAnnotationsSuccess;
}
if (this.props.onGetTextError) {
context.onGetTextError = this.props.onGetTextError;
}
if (this.props.onGetTextSuccess) {
context.onGetTextSuccess = this.props.onGetTextSuccess;
}
if (this.props.customTextRenderer) {
context.customTextRenderer = this.props.customTextRenderer;
}
return context;
}
/**
* Called when a page is loaded successfully
*/
/**
* Called when a page failed to load
*/
}, {
key: 'getPageIndex',
value: function getPageIndex() {
var props = arguments.length > 0 && arguments[0] !== undefined ? arguments[0] : this.props;
if ((0, _utils.isProvided)(props.pageNumber)) {
return props.pageNumber - 1;
}
if ((0, _utils.isProvided)(props.pageIndex)) {
return props.pageIndex;
}
return null;
}
}, {
key: 'getPageNumber',
value: function getPageNumber() {
var props = arguments.length > 0 && arguments[0] !== undefined ? arguments[0] : this.props;
if ((0, _utils.isProvided)(props.pageNumber)) {
return props.pageNumber;
}
if ((0, _utils.isProvided)(props.pageIndex)) {
return props.pageIndex + 1;
}
return null;
}
}, {
key: 'loadPage',
value: function loadPage() {
var props = arguments.length > 0 && arguments[0] !== undefined ? arguments[0] : this.props;
var context = arguments.length > 1 && arguments[1] !== undefined ? arguments[1] : this.context;
var pdf = this.getPdf(props, context);
if (!pdf) {
throw new Error('Attempted to load a page, but no document was specified.');
}
var pageNumber = this.getPageNumber(props);
if (!pageNumber) {
return null;
}
this.runningTask = (0, _utils.makeCancellable)(pdf.getPage(pageNumber));
return this.runningTask.promise.then(this.onLoadSuccess).catch(this.onLoadError);
}
}, {
key: 'renderTextLayer',
value: function renderTextLayer() {
var renderTextLayer = this.props.renderTextLayer;
if (!renderTextLayer) {
return null;
}
return _react2.default.createElement(_TextLayer2.default, { key: this.pageKey + '_text' });
}
}, {
key: 'renderAnnotations',
value: function renderAnnotations() {
var renderAnnotations = this.props.renderAnnotations;
if (!renderAnnotations) {
return null;
}
return _react2.default.createElement(_AnnotationLayer2.default, { key: this.pageKey + '_annotations' });
}
}, {
key: 'renderSVG',
value: function renderSVG() {
return [_react2.default.createElement(_PageSVG2.default, { key: this.pageKeyNoScale + '_svg' }),
/**
* As of now, PDF.js 2.0.120 returns warnings on unimplemented annotations.
* Therefore, as a fallback, we render "traditional" AnnotationLayer component.
*/
this.renderAnnotations()];
}
}, {
key: 'renderCanvas',
value: function renderCanvas() {
return [_react2.default.createElement(_PageCanvas2.default, { key: this.pageKey + '_canvas' }), this.renderTextLayer(), this.renderAnnotations()];
}
}, {
key: 'renderNoData',
value: function renderNoData() {
return _react2.default.createElement(
'div',
{ className: 'react-pdf__message react-pdf__message--no-data' },
this.props.noData
);
}
}, {
key: 'renderError',
value: function renderError() {
return _react2.default.createElement(
'div',
{ className: 'react-pdf__message react-pdf__message--error' },
this.props.error
);
}
}, {
key: 'renderLoader',
value: function renderLoader() {
return _react2.default.createElement(
'div',
{ className: 'react-pdf__message react-pdf__message--loading' },
this.props.loading
);
}
}, {
key: 'renderChildren',
value: function renderChildren() {
var _props = this.props,
children = _props.children,
renderMode = _props.renderMode;
return [renderMode === 'svg' ? this.renderSVG() : this.renderCanvas(), children];
}
}, {
key: 'render',
value: function render() {
var _this2 = this;
var pageNumber = this.pageNumber;
var pdf = this.getPdf();
var className = this.props.className;
var page = this.state.page;
var content = void 0;
if (!pageNumber) {
content = this.renderNoData();
} else if (pdf === null || page === null) {
content = this.renderLoader();
} else if (pdf === false || page === false) {
content = this.renderError();
} else {
content = this.renderChildren();
}
return _react2.default.createElement(
'div',
(0, _extends3.default)({
className: (0, _mergeClassNames2.default)('react-pdf__Page', className),
ref: function ref(_ref2) {
var inputRef = _this2.props.inputRef;
if (inputRef) {
inputRef(_ref2);
}
_this2.ref = _ref2;
},
style: { position: 'relative' },
'data-page-number': pageNumber
}, this.eventProps),
content
);
}
}, {
key: 'pageIndex',
get: function get() {
return this.getPageIndex();
}
}, {
key: 'pageNumber',
get: function get() {
return this.getPageNumber();
}
}, {
key: 'rotate',
get: function get() {
if ((0, _utils.isProvided)(this.props.rotate)) {
return this.props.rotate;
}
if ((0, _utils.isProvided)(this.context.rotate)) {
return this.context.rotate;
}
var page = this.state.page;
return page.rotate;
}
}, {
key: 'scale',
get: function get() {
var _props2 = this.props,
scale = _props2.scale,
width = _props2.width;
var page = this.state.page;
var rotate = this.rotate;
// Be default, we'll render page at 100% * scale width.
var pageScale = 1;
// If width is defined, calculate the scale of the page so it could be of desired width.
if (width) {
var viewport = page.getViewport(scale, rotate);
pageScale = width / viewport.width;
}
return scale * pageScale;
}
}, {
key: 'eventProps',
get: function get() {
var _this3 = this;
return (0, _events.makeEventProps)(this.props, function () {
var page = _this3.state.page;
return (0, _utils.makePageCallback)(page, _this3.scale);
});
}
}, {
key: 'pageKey',
get: function get() {
return this.state.page.pageIndex + '@' + this.scale + '/' + this.rotate;
}
}, {
key: 'pageKeyNoScale',
get: function get() {
return this.state.page.pageIndex + '/' + this.rotate;
}
}, {
key: 'pageProps',
get: function get() {
return {
page: this.state.page,
rotate: this.rotate,
scale: this.scale
};
}
}]);
return Page;
}(_react.Component);
exports.default = Page;
Page.defaultProps = {
error: 'Failed to load the page.',
loading: 'Loading page…',
noData: 'No page specified.',
renderAnnotations: true,
renderMode: 'canvas',
renderTextLayer: true,
scale: 1.0
};
Page.childContextTypes = {
customTextRenderer: _propTypes2.default.func,
onGetTextError: _propTypes2.default.func,
onGetTextSuccess: _propTypes2.default.func,
onRenderError: _propTypes2.default.func,
onRenderSuccess: _propTypes2.default.func,
page: _propTypes3.isPage,
pdf: _propTypes3.isPdf,
rotate: _propTypes3.isRotate,
scale: _propTypes2.default.number
};
Page.contextTypes = {
linkService: _propTypes3.isLinkService,
pdf: _propTypes3.isPdf,
registerPage: _propTypes2.default.func,
rotate: _propTypes3.isRotate,
unregisterPage: _propTypes2.default.func
};
Page.propTypes = (0, _extends3.default)({
children: _propTypes2.default.node,
className: _propTypes3.isClassName,
customTextRenderer: _propTypes2.default.func,
error: _propTypes2.default.string,
inputRef: _propTypes2.default.func,
loading: _propTypes2.default.string,
noData: _propTypes2.default.node,
onGetTextError: _propTypes2.default.func,
onGetTextSuccess: _propTypes2.default.func,
onLoadError: _propTypes2.default.func,
onLoadSuccess: _propTypes2.default.func,
onRenderError: _propTypes2.default.func,
onRenderSuccess: _propTypes2.default.func,
pageIndex: _propTypes3.isPageIndex,
pageNumber: _propTypes3.isPageNumber,
renderAnnotations: _propTypes2.default.bool,
renderMode: _propTypes2.default.oneOf(['canvas', 'svg']),
renderTextLayer: _propTypes2.default.bool,
rotate: _propTypes3.isRotate,
scale: _propTypes2.default.number,
width: _propTypes2.default.number
}, (0, _propTypes3.eventsProps)());