How to display whole PDF (not only one page) with PDF.JS?
PDFJS has a member variable numPages
, so you'd just iterate through them. BUT it's important to remember that getting a page in pdf.js is asynchronous, so the order wouldn't be guaranteed. So you'd need to chain them. You could do something along these lines:
var currPage = 1; //Pages are 1-based not 0-basedvar numPages = 0;var thePDF = null;//This is where you startPDFJS.getDocument(url).then(function(pdf) { //Set PDFJS global object (so we can easily access in our page functions thePDF = pdf; //How many pages it has numPages = pdf.numPages; //Start with first page pdf.getPage( 1 ).then( handlePages );});function handlePages(page){ //This gives us the page's dimensions at full scale var viewport = page.getViewport( 1 ); //We'll create a canvas for each page to draw it on var canvas = document.createElement( "canvas" ); canvas.style.display = "block"; var context = canvas.getContext('2d'); canvas.height = viewport.height; canvas.width = viewport.width; //Draw it on the canvas page.render({canvasContext: context, viewport: viewport}); //Add it to the web page document.body.appendChild( canvas ); //Move to next page currPage++; if ( thePDF !== null && currPage <= numPages ) { thePDF.getPage( currPage ).then( handlePages ); }}
Here's my take. Renders all pages in correct order and still works asynchronously.
<style> #pdf-viewer { width: 100%; height: 100%; background: rgba(0, 0, 0, 0.1); overflow: auto; } .pdf-page-canvas { display: block; margin: 5px auto; border: 1px solid rgba(0, 0, 0, 0.2); }</style><script> url = 'https://github.com/mozilla/pdf.js/blob/master/test/pdfs/tracemonkey.pdf'; var thePdf = null; var scale = 1; PDFJS.getDocument(url).promise.then(function(pdf) { thePdf = pdf; viewer = document.getElementById('pdf-viewer'); for(page = 1; page <= pdf.numPages; page++) { canvas = document.createElement("canvas"); canvas.className = 'pdf-page-canvas'; viewer.appendChild(canvas); renderPage(page, canvas); } }); function renderPage(pageNumber, canvas) { thePdf.getPage(pageNumber).then(function(page) { viewport = page.getViewport({ scale: scale }); canvas.height = viewport.height; canvas.width = viewport.width; page.render({canvasContext: canvas.getContext('2d'), viewport: viewport}); }); }</script><div id='pdf-viewer'></div>
The pdfjs-dist library contains parts for building PDF viewer. You can use PDFPageView to render all pages. Based on https://github.com/mozilla/pdf.js/blob/master/examples/components/pageviewer.html :
var url = "https://cdn.mozilla.net/pdfjs/tracemonkey.pdf";var container = document.getElementById('container');// Load documentPDFJS.getDocument(url).then(function (doc) { var promise = Promise.resolve(); for (var i = 0; i < doc.numPages; i++) { // One-by-one load pages promise = promise.then(function (id) { return doc.getPage(id + 1).then(function (pdfPage) {// Add div with page view.var SCALE = 1.0; var pdfPageView = new PDFJS.PDFPageView({ container: container, id: id, scale: SCALE, defaultViewport: pdfPage.getViewport(SCALE), // We can enable text/annotations layers, if needed textLayerFactory: new PDFJS.DefaultTextLayerFactory(), annotationLayerFactory: new PDFJS.DefaultAnnotationLayerFactory() }); // Associates the actual page with the view, and drawing it pdfPageView.setPdfPage(pdfPage); return pdfPageView.draw(); }); }.bind(null, i)); } return promise;});
#container > *:not(:first-child) { border-top: solid 1px black; }
<link href="https://npmcdn.com/pdfjs-dist/web/pdf_viewer.css" rel="stylesheet"/><script src="https://npmcdn.com/pdfjs-dist/web/compatibility.js"></script><script src="https://npmcdn.com/pdfjs-dist/build/pdf.js"></script><script src="https://npmcdn.com/pdfjs-dist/web/pdf_viewer.js"></script><div id="container" class="pdfViewer singlePageView"></div>