JSFiddle - React, Tailwind, and code Playground
HTML
<script src="https://mozilla.github.io/pdf.js/build/pdf.js"></script>
<script src="https://cdn.jsdelivr.net/npm/@panzoom/panzoom@4.3.2/dist/panzoom.min.js"></script>
<div id="div-container">
<canvas id="the-canvas"></canvas>
</div>
CSS
#the-canvas {
direction: ltr;
transform-origin: top left;
}
#div-container {
width: 400px;
height: 400px;
}
JavaScript
var pdfjsLib = window['pdfjs-dist/build/pdf'];
pdfjsLib.GlobalWorkerOptions.workerSrc = 'https://mozilla.github.io/pdf.js/build/pdf.worker.js';
var PDFRenderingInProgress = false
var pdfDoc = null
var canvas = document.getElementById('the-canvas')
var ctx = canvas.getContext('2d');
var container = document.getElementById("div-container")
var url = 'https://raw.githubusercontent.com/mozilla/pdf.js/ba2edeae/web/compressed.tracemonkey-pldi-09.pdf';
var wheelTimeoutHandler = null;
var wheelTimeout = 250 //ms
function renderPage(scale) {
pdfDoc.getPage(1).then(function(page) {
var viewport = page.getViewport({scale: scale});
canvas.height = viewport.height;
canvas.width = viewport.width;
var renderContext = {
canvasContext: ctx,
viewport: viewport
};
if (!PDFRenderingInProgress) {
PDFRenderingInProgress = true
var renderTask = page.render(renderContext);
renderTask.promise.then(function() {
PDFRenderingInProgress = false
})
}
});
}
function zoomWithWheel(event) {
panzoom.zoomWithWheel(event)
clearTimeout(wheelTimeoutHandler);
wheelTimeoutHandler = setTimeout(function() {
canvas.style.transform = "scale("+1/panzoom.getScale()+")"
if (pdfDoc)
renderPage(panzoom.getScale());
}, wheelTimeout)
}
pdfjsLib.getDocument(url).promise.then(function(pdfDoc_) {
pdfDoc = pdfDoc_;
renderPage(1);
});
var panzoom = Panzoom(container)
container.parentElement.addEventListener('wheel', zoomWithWheel)