forked from nnarhinen/react-pdf
-
Notifications
You must be signed in to change notification settings - Fork 2
/
Copy pathindex.js
103 lines (101 loc) · 3.41 KB
/
index.js
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
/**
* @jsx React.DOM
*/
var React = require('react');
var ReactDOM = require('react-dom');
var Pdf = React.createClass({
displayName: 'React-PDF',
propTypes: {
file: React.PropTypes.oneOfType([
React.PropTypes.file,
React.PropTypes.string
]),
content: React.PropTypes.string,
page: React.PropTypes.number,
scale: React.PropTypes.number,
onDocumentComplete: React.PropTypes.func,
onPageComplete: React.PropTypes.func
},
getInitialState: function() {
return { };
},
getDefaultProps: function() {
return {page: 1, scale: 1.0};
},
componentDidMount: function() {
this._loadPDFDocument(this.props);
},
_loadByteArray: function(byteArray) {
PDFJS.getDocument(byteArray).then(this._onDocumentComplete);
},
_loadPDFDocument: function(props) {
if(!!props.file){
if (typeof props.file === 'string') return PDFJS.getDocument(props.file).then(this._onDocumentComplete);
// Is a File object
var reader = new FileReader(), self = this;
reader.onloadend = function() {
self._loadByteArray(new Uint8Array(reader.result));
};
reader.readAsArrayBuffer(props.file);
}
else if(!!props.content){
var bytes = window.atob(props.content);
var byteLength = bytes.length;
var byteArray = new Uint8Array(new ArrayBuffer(byteLength));
for(index = 0; index < byteLength; index++) {
byteArray[index] = bytes.charCodeAt(index);
}
this._loadByteArray(byteArray);
}
else {
console.error('React_Pdf works with a file(URL) or (base64)content. At least one needs to be provided!');
}
},
componentWillReceiveProps: function(newProps) {
if ((newProps.file && newProps.file !== this.props.file) || (newProps.content && newProps.content !== this.props.content)) {
this.setState({page: null});
this._loadPDFDocument(newProps);
} else if (!!this.state.pdf && !!newProps.page && newProps.page !== this.props.page) {
this.setState({page: null});
this.state.pdf.getPage(newProps.page).then(this._onPageComplete);
}
},
render: function() {
var self = this;
if (!!this.state.page){
setTimeout(function() {
if(self.isMounted()){
var canvas = ReactDOM.findDOMNode(self.refs.pdfCanvas),
context = canvas.getContext('2d'),
scale = self.props.scale,
viewport = self.state.page.getViewport(scale);
canvas.height = viewport.height;
canvas.width = viewport.width;
var renderContext = {
canvasContext: context,
viewport: viewport
};
self.state.page.render(renderContext);
}
});
return (React.createElement("canvas", {ref: "pdfCanvas"}));
}
return (this.props.loading || React.createElement("div", null, "Loading pdf...."));
},
_onDocumentComplete: function(pdf){
if (!this.isMounted()) return;
this.setState({ pdf: pdf });
if(!!this.props.onDocumentComplete && typeof this.props.onDocumentComplete === 'function'){
this.props.onDocumentComplete(pdf.numPages);
}
pdf.getPage(this.props.page).then(this._onPageComplete);
},
_onPageComplete: function(page){
if (!this.isMounted()) return;
this.setState({ page: page });
if(!!this.props.onPageComplete && typeof this.props.onPageComplete === 'function'){
this.props.onPageComplete(page.pageIndex + 1);
}
}
});
module.exports = Pdf;