ldx-widgets
Version:
widgets
116 lines (88 loc) • 2.76 kB
text/coffeescript
React = require 'react'
ReactDOM = require 'react-dom'
{div, canvas} = React.DOM
###
Important: This component asummes the PDFJS lib has been loaded (it is not loaded by default), so it should not be rendered unless window.PDFJS?
###
PDFViewer = React.createClass
displayName: 'PDFViewer'
getDefaultProps: ->
showPageDividers: yes
intent: 'display'
getInitialState: ->
totalPages: 1
render: ->
{totalPages} = @state
{showPageDividers, intent} = @props
pages = []
for page in [0...totalPages]
pages.push canvas {
ref: "pdfCanvas#{page}"
className: 'pdf-canvas'
key: "page#{page}"
}
if page isnt totalPages - 1 and showPageDividers and intent isnt 'print'
pages.push div {
className: 'pdf-page-divide'
key: "divide#{page}"
}
div {
className: 'pdf-container'
}, pages
componentWillMount: ->
@loadedPageCount = 0
componentDidMount: ->
@renderPDF()
renderPDF: ->
{url, headers} = @props
params =
url: url
params.httpHeaders = headers if headers?
# Get the PDF
window.PDFJS.getDocument params
.then (pdf) =>
# Set the number of pages to draw the right number of canvas elements
@setState
totalPages: pdf.numPages
, =>
# After a delay, draw the pages
setTimeout =>
@pageCounter(pdf)
, 500
renderPage: (pdf, pageNum, cb) ->
{intent} = @props
scale = (Math.ceil((window.innerWidth/100)))/10
scale = if intent is 'print' then 3 else scale
pdf.getPage pageNum
.then (page) =>
# Get the canvas DOM Node for this page
pdfCanvas = ReactDOM.findDOMNode @refs["pdfCanvas#{page.pageIndex}"]
viewport = page.getViewport scale
context = pdfCanvas.getContext '2d'
if intent is 'print'
if page.rotate isnt 0
pdfCanvas.style.height = "5.8in"
pdfCanvas.style.width = "7.5in"
else
pdfCanvas.style.height = "9.3in"
pdfCanvas.style.width = "7.19in"
pdfCanvas.height = viewport.height
pdfCanvas.width = viewport.width
renderContext =
canvasContext: context
viewport: viewport
intent: intent
# Render the page
page.render renderContext
.then =>
cb?(pdf)
pageCounter: (pdf) ->
{totalPages} = @state
@loadedPageCount += 1
@props.pageCounter?(totalPages)
if @loadedPageCount < totalPages
@renderPage(pdf, @loadedPageCount, @pageCounter)
else
@renderPage(pdf, @loadedPageCount)
shouldComponentUpdate: (nextProps, nextState) -> nextState.totalPages isnt @state.totalPages
module.exports = PDFViewer