javascript pdf pdf.js

javascript - ¿Cómo mostrar PDF completo(no solo una página) con PDF.JS?



(5)

Aquí está mi toma. Representa todas las páginas en el orden correcto y aún funciona de forma asíncrona.

<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); canvas.height = viewport.height; canvas.width = viewport.width; page.render({canvasContext: canvas.getContext(''2d''), viewport: viewport}); }); } </script> <div id=''pdf-viewer''></div>

He creado esta demo:

http://polishwords.com.pl/dev/pdfjs/test.html

Muestra una página. Me gustaría mostrar todas las páginas. Uno debajo de otro, o coloque algunos botones para cambiar de página o, incluso, cargue todos los controles estándar de PDF.JS como en Firefox. ¿Cómo lograr esto?


La biblioteca pdfjs-dist contiene partes para crear visor de PDF. Puedes usar PDFPageView para renderizar todas las páginas. Basado en 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 document PDFJS.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>


Si desea renderizar todas las páginas de un documento pdf en diferentes lienzos, una por una, de manera sincrónica, es una solución:

index.html

<!doctype html> <html lang="en"> <head> <meta charset="UTF-8"> <title>PDF Sample</title> <script type="text/javascript" src="jquery.js"></script> <script type="text/javascript" src="pdf.js"></script> <script type="text/javascript" src="main.js"> </script> <link rel="stylesheet" type="text/css" href="main.css"> </head> <body id="body"> </body> </html>

main.css

canvas { display: block; }

main.js

$(function() { var filePath = "document.pdf"; function Num(num) { var num = num; return function () { return num; } }; function renderPDF(url, canvasContainer, options) { var options = options || { scale: 1.5 }, func, pdfDoc, def = $.Deferred(), promise = $.Deferred().resolve().promise(), width, height, makeRunner = function(func, args) { return function() { return func.call(null, args); }; }; function renderPage(num) { var def = $.Deferred(), currPageNum = new Num(num); pdfDoc.getPage(currPageNum()).then(function(page) { var viewport = page.getViewport(options.scale); var canvas = document.createElement(''canvas''); var ctx = canvas.getContext(''2d''); var renderContext = { canvasContext: ctx, viewport: viewport }; if(currPageNum() === 1) { height = viewport.height; width = viewport.width; } canvas.height = height; canvas.width = width; canvasContainer.appendChild(canvas); page.render(renderContext).then(function() { def.resolve(); }); }) return def.promise(); } function renderPages(data) { pdfDoc = data; var pagesCount = pdfDoc.numPages; for (var i = 1; i <= pagesCount; i++) { func = renderPage; promise = promise.then(makeRunner(func, i)); } } PDFJS.disableWorker = true; PDFJS.getDocument(url).then(renderPages); }; var body = document.getElementById("body"); renderPDF(filePath, body); });


Si desea renderizar todas las páginas del documento pdf en diferentes lienzos.

<html> <head> <script src="https://ajax.googleapis.com/ajax/libs/jquery/3.3.1/jquery.min.js"></script> <script src="pdf.js"></script> <script src="jquery.js"></script> </head> <body> <h1>PDF.js ''Hello, world!'' example</h1> <div id="canvas_div"></div> <body> <script> // If absolute URL from the remote server is provided, configure the CORS // header on that server. var url = ''pdff.pdf''; // Loaded via <script> tag, create shortcut to access PDF.js exports. var pdfjsLib = window[''pdfjs-dist/build/pdf'']; // The workerSrc property shall be specified. pdfjsLib.GlobalWorkerOptions.workerSrc = ''worker.js''; var loadingTask = pdfjsLib.getDocument(url); loadingTask.promise.then(function(pdf) { var __TOTAL_PAGES = pdf.numPages; // Fetch the first page var pageNumber = 1; for( let i=1; i<=__TOTAL_PAGES; i+=1){ var id =''the-canvas''+i; $(''#canvas_div'').append("<div style=''background-color:gray;text-align: center;padding:20px;'' ><canvas calss=''the-canvas'' id=''"+id+"''></canvas></div>"); var canvas = document.getElementById(id); //var pageNumber = 1; renderPage(canvas, pdf, pageNumber++, function pageRenderingComplete() { if (pageNumber > pdf.numPages) { return; } // Continue rendering of the next page renderPage(canvas, pdf, pageNumber++, pageRenderingComplete); }); } }); function renderPage(canvas, pdf, pageNumber, callback) { pdf.getPage(pageNumber).then(function(page) { var scale = 1.5; var viewport = page.getViewport({scale: scale}); var pageDisplayWidth = viewport.width; var pageDisplayHeight = viewport.height; //var pageDivHolder = document.createElement(); // Prepare canvas using PDF page dimensions //var canvas = document.createElement(id); var context = canvas.getContext(''2d''); canvas.width = pageDisplayWidth; canvas.height = pageDisplayHeight; // pageDivHolder.appendChild(canvas); // Render PDF page into canvas context var renderContext = { canvasContext: context, viewport: viewport }; page.render(renderContext).promise.then(callback); }); } </script> <html>


PDFJS tiene una variable de miembro numPages , por lo que simplemente debe iterar a través de ellos. PERO es importante recordar que obtener una página en pdf.js es asíncrono, por lo que no se garantizaría el orden. Así que tendrías que encadenarlos. Podrías hacer algo en este sentido:

var currPage = 1; //Pages are 1-based not 0-based var numPages = 0; var thePDF = null; //This is where you start PDFJS.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 ); } }