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.