Skip to content

Instantly share code, notes, and snippets.

@kinxori
Created December 17, 2024 18:37
Show Gist options
  • Select an option

  • Save kinxori/7bab618b113dd8b425660ff5e625c72b to your computer and use it in GitHub Desktop.

Select an option

Save kinxori/7bab618b113dd8b425660ff5e625c72b to your computer and use it in GitHub Desktop.
PDF viewer | Vanilla Javascript
<!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