Created
December 17, 2024 18:37
-
-
Save kinxori/7bab618b113dd8b425660ff5e625c72b to your computer and use it in GitHub Desktop.
PDF viewer | Vanilla Javascript
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
| <!DOCTYPE html> | |
| <html> | |
| <head> | |
| <script src="https://cdnjs.cloudflare.com/ajax/libs/pdf.js/2.11.338/pdf.min.js"></script> | |
| <style> | |
| .pdf-container{ | |
| width: 90%; | |
| height: auto; | |
| max-width:78rem; | |
| margin: 0 auto; | |
| position: relative; | |
| border-radius: 1rem; | |
| border: 1px solid grey; | |
| overflow: hidden; | |
| } | |
| #fullscreen-btn { | |
| background: rgba(0,0,0,0); | |
| border: none; | |
| cursor: pointer; | |
| display: grid; | |
| margin: 0 auto; | |
| position: relative; | |
| place-items:center; | |
| } | |
| #fullscreen-btn.fullscreen { | |
| position: fixed; | |
| top: 0; | |
| left: 0; | |
| width: 100vw; | |
| height: 100vh; | |
| object-fit: contain; | |
| background: grey; | |
| z-index: 99999; | |
| } | |
| #pdf-render { | |
| width: 100%; | |
| height: auto; | |
| } | |
| #pdf-ghost-btn{ | |
| position: absolute; | |
| margin-bottom: 1rem; | |
| bottom: 10px; | |
| border: none; | |
| background-color: rgba(0,0,0,.8); | |
| color: white; | |
| padding: 10px; | |
| opacity: 0; | |
| border-radius: 2rem; | |
| pointer-events: none; | |
| } | |
| #fullscreen-btn:hover > #pdf-ghost-btn{ | |
| animation-name: ghost; | |
| animation-duration: 3s; | |
| animation-fill-mode: forwards; | |
| animation-timing-function: ease-in-out; | |
| animation-direction: backwards; | |
| } | |
| /* Loader Styles */ | |
| .loader { | |
| position: absolute; | |
| top: 50%; | |
| left: 50%; | |
| transform: translate(-50%, -50%); | |
| width: 30px; | |
| height: 30px; | |
| border: 5px solid rgba(0, 0, 0, 0.1); | |
| border-radius: 50%; | |
| border-top-color: #000; | |
| animation: spin 1s linear infinite; | |
| z-index: 10; | |
| } | |
| @keyframes spin { | |
| 0% { transform: translate(-50%, -50%) rotate(0deg); } | |
| 100% { transform: translate(-50%, -50%) rotate(360deg); } | |
| } | |
| @keyframes ghost { | |
| 0% {opacity: 0;} | |
| 20% {opacity: 1;} | |
| 80% {opacity: 1;} | |
| 100% {opacity: 0;} | |
| } | |
| </style> | |
| </head> | |
| <body> | |
| <div class="pdf-container"> | |
| <div id="loader" class="loader"></div> | |
| <button id="fullscreen-btn"> | |
| <canvas height=500 id="pdf-render"></canvas> | |
| <span id="pdf-ghost-btn">Pantalla completa</span> | |
| </button> | |
| </div> | |
| <script> | |
| const loader = document.getElementById('loader'); | |
| const canvas = document.getElementById('pdf-render'); | |
| pdfjsLib.getDocument('https://cdn.shopify.com/s/files/1/0710/1480/9825/files/CARTA_SAMUEL_CASILLAS_2024_low.pdf?v=1734458451').promise.then(function(pdf) { | |
| pdf.getPage(1).then(function(page) { | |
| let context = canvas.getContext('2d'); | |
| let viewport = page.getViewport({scale: 1.5}); | |
| canvas.height = viewport.height; | |
| canvas.width = viewport.width; | |
| page.render({ | |
| canvasContext: context, | |
| viewport: viewport | |
| }).promise.then(() => { | |
| // Hide loader when PDF is rendered | |
| loader.style.display = 'none'; | |
| }); | |
| // Fullscreen functionality | |
| const fullscreenBtn = document.getElementById('fullscreen-btn'); | |
| fullscreenBtn.addEventListener('click', () => { | |
| fullscreenBtn.classList.toggle('fullscreen'); | |
| if (fullscreenBtn.classList.contains('fullscreen')) { | |
| // Rescale for fullscreen | |
| const screenWidth = window.innerWidth; | |
| const screenHeight = window.innerHeight; | |
| const scaleFactor = Math.min( | |
| screenWidth / canvas.width, | |
| screenHeight / canvas.height | |
| ); | |
| page.render({ | |
| canvasContext: context, | |
| viewport: page.getViewport({scale: 1.5}) | |
| }); | |
| } else { | |
| // Restore original scale | |
| page.render({ | |
| canvasContext: context, | |
| viewport: page.getViewport({scale: 1.5}) | |
| }); | |
| } | |
| }); | |
| }); | |
| }).catch((error) => { | |
| // Hide loader if there's an error | |
| loader.style.display = 'none'; | |
| console.error('Error loading PDF:', error); | |
| }); | |
| </script> | |
| </body> | |
| </html> |
Sign up for free
to join this conversation on GitHub.
Already have an account?
Sign in to comment