Skip to main content
Deno 2 is finally here šŸŽ‰ļø
Learn more

<embed-pdf>

embed-pdf is a WebComponent for embedding PDF files in web pages using pdf.js.

why did you make this?

Embedding PDFs on mobile devices is a bit of a pain, as indicated in the Stack Overflow answer.

  • If iframe is used, it embeds fine on PC, but not on mobile.
  • If you use pdf.js it works on mobile devices, but you have to download the zip file, unzip it, host it on your own serverā€¦manual versioning is a pain.
  • I tried using Google Docs viewer, but it becomes unstable when multiple PDFs are embedded in one page.
  • Iā€™ve tried looking for existing web components that can use pdf.js, but they donā€™t seem to be very actively maintained. They didnā€™t seem to be an option because they required you to download the files yourself or depended on the old WebComponent specification.

This library provides a WebComponent that is delivered by a CDN and can be activated by inserting a single line of script tag. It also uses pdf.js internally to allow embedding of PDFs on both PC and mobile devices. This library greatly simplified the process of embedding PDFs in HTML.

Usage

First, insert a script tag into your HTML. Next, place the <embed-pdf> tag. Finally, set the file path in the src attribute of the <embed-pdf> tag.

<script src="https://deno.land/x/embed_pdf@v0.0.2/mod.js" type="module"></script>
<embed-pdf src="./path/to/file.pdf"></embed-pdf>

screenshot

By default, this library uses pdf.js in the vendor directory to render PDFs. Alternatively, to use the latest version of pdf.js directly from the official site, set it using JavaScript as follows:

import { EmbedPdf } from "https://deno.land/x/embed_pdf@v0.0.2/mod.js";

// Specify the path to viewer.html. The default URL is https://deno.land/x/embed_pdf@v0.0.2/vendor/pdfjs/web/viewer.html .
EmbedPdf.viewerUrl = "https://mozilla.github.io/pdf.js/web/viewer.html";

styling

You can specify width and height using CSS.

embed-pdf {
  width: 500px; /* default is 300px. */
  height: 250px; /* default is 150px. */
}