Creare l'anteprima di un file PDF scelto per l'upload con JavaScript
In questo articolo vedremo come creare l'anteprima di un file PDF scelto per l'upload utilizzando la libreria PDF.js. Si tratta di una soluzione interoperabile e compatibile con vari scenari.
Partiamo da questa struttura HTML:
<form class="upload-form" action="#" method="post">
<div>
<label for="pdf">Upload PDF</label>
<div class="input-wrapper">
<input type="file" name="pdf" id="pdf" accept="application/pdf">
</div>
</div>
</form>
<div id="pdf-preview-wrapper">
<button type="button" id="pdf-preview-close">×</button>
<canvas id="pdf-preview"></canvas>
</div>
<script src="https://cdnjs.cloudflare.com/ajax/libs/pdf.js/3.11.174/pdf.min.js"></script>
<script src="script.js"></script>
Con PDF.js dobbiamo convertire l'oggetto File
in un oggetto URL contenente i byte del file PDF scelto. Quindi possiamo inserire nel canvas l'anteprima della prima pagina del documento.
function handleFile(input, wrapper, preview) {
input.addEventListener('change', async (e) => {
wrapper.classList.remove('visible');
document.body.classList.remove('preview-visible');
const file = e.target.files[0];
if (!file) return;
const fileURL = URL.createObjectURL(file);
const pdf = await pdfjsLib.getDocument(fileURL).promise;
const page = await pdf.getPage(1);
const scale = 1.5;
const viewport = page.getViewport({ scale });
preview.width = viewport.width;
preview.height = viewport.height;
const ctx = preview.getContext('2d');
const renderContext = {
canvasContext: ctx,
viewport: viewport,
};
wrapper.classList.add('visible');
document.body.classList.add('preview-visible');
await page.render(renderContext).promise;
});
}
Ovviamente poiché stiamo gestendo un elemento canvas
possiamo ridimensionare l'anteprima per adattarla al contenitore usando la larghezza e l'altezza della viewport con la variabile scale
che controlla l'aspect ratio dell'anteprima finale.
Demo
Conclusione
PDF.js è un'ottima soluzione per gestire la visualizzazione dei documenti PDF nel browser. In questo caso si rivela particolarmente indicata per gestire un form di upload.