npm package discovery and stats viewer.

Discover Tips

  • General search

    [free text search, go nuts!]

  • Package details

    pkg:[package-name]

  • User packages

    @[username]

Sponsor

Optimize Toolset

I’ve always been into building performant and accessible sites, but lately I’ve been taking it extremely seriously. So much so that I’ve been building a tool to help me optimize and monitor the sites that I build to make sure that I’m making an attempt to offer the best experience to those who visit them. If you’re into performant, accessible and SEO friendly sites, you might like it too! You can check it out at Optimize Toolset.

About

Hi, 👋, I’m Ryan Hefner  and I built this site for me, and you! The goal of this site was to provide an easy way for me to check the stats on my npm packages, both for prioritizing issues and updates, and to give me a little kick in the pants to keep up on stuff.

As I was building it, I realized that I was actually using the tool to build the tool, and figured I might as well put this out there and hopefully others will find it to be a fast and useful way to search and browse npm packages as I have.

If you’re interested in other things I’m working on, follow me on Twitter or check out the open source projects I’ve been publishing on GitHub.

I am also working on a Twitter bot for this site to tweet the most popular, newest, random packages from npm. Please follow that account now and it will start sending out packages soon–ish.

Open Software & Tools

This site wouldn’t be possible without the immense generosity and tireless efforts from the people who make contributions to the world and share their work via open source initiatives. Thank you 🙏

© 2026 – Pkg Stats / Ryan Hefner

@hyzyla/pdfium

v3.0.0

Published

Universal wrapper for PDFium

Readme

@hyzyla/pdfium

📃 Documentation

TypeScript/JavaScript wrapper for the PDFium library:

  • ⬇️ pdfium - source code of the PDFium library, developed by Google and used in Chrome.
  • ⬇️ pdfium-lib - project to compile PDFium library to multiple platforms, including WebAssembly.
  • 📍 @hyzyla/pdfium - (you are here) TypeScript/JavaScript wrapper for the WebAssembly build of PDFium library.

Features

  • 📦 Zero dependencies - PDFium library is compiled to WebAssembly and bundled with the package.
  • 🚀 Fast - PDFium can be faster than PDF.js, because it's originally written in C++ and compiled to WebAssembly, while PDF.js is entirely written in JavaScript.
  • 🔒 Type-safe - TypeScript definitions are included.
  • 🗼 Works in browser and Node.js

Supported environments

  • Node.js 22 or newer, tested on 22, 24 and 26.
  • Chrome and Edge 85+, Firefox 79+ and Safari 15+. The tests run in Chrome, Firefox and WebKit, with the package bundled by Vite, bundled by webpack, and loaded without a bundler.
  • @hyzyla/pdfium/worker starts a module worker, which Firefox supports from version 114.

In older browsers the library throws an error when it loads, because PDFium's WebAssembly build checks the browser version. On older Node.js versions, npm warns when you install the package.

Installation

# yarn add @hyzyla/pdfium
# pnpm install @hyzyla/pdfium
npm install @hyzyla/pdfium

Usage

import { promises as fs } from "fs";

import { PDFiumLibrary, type PDFiumPageRenderOptions } from "@hyzyla/pdfium";
import sharp from "sharp";

/**
 * For this and the following examples, we will use "sharp" library to convert
 * the raw bitmap data to PNG images. You can use any other library or write
 * your own function to convert the raw bitmap data to PNG images.
 */
async function renderFunction(options: PDFiumPageRenderOptions) {
  return await sharp(options.data, {
    raw: {
      width: options.width,
      height: options.height,
      channels: 4,
    },
  })
    .png()
    .toBuffer();
}

async function main() {
  const buff = await fs.readFile("test2.pdf");

  // Initialize the library, you can do this once for the whole application
  // and reuse the library instance.
  const library = await PDFiumLibrary.init();

  // Load the document from the buffer
  // You can also pass "password" as the second argument if the document is encrypted.
  const document = await library.loadDocument(buff);

  // Iterate over the pages, render them to PNG images and
  // save to the output folder
  for (const page of document.pages()) {
    console.log(`${page.number} - rendering...`);

    // Render PDF page to PNG image
    const image = await page.render({
      scale: 3, // 3x scale (72 DPI is the default)
      render: renderFunction, // sharp function to convert raw bitmap data to PNG
    });

    // Save the PNG image to the output folder
    await fs.writeFile(`output/${page.number}.png`, Buffer.from(image.data));

    // Free the page before moving on to the next one
    page.close();
  }

  // Do not forget to destroy the document and the library
  // when you are done.
  document.destroy();
  library.destroy();
}

main();

Release

  1. Bump version in package.json: npm version patch
  2. Create a new release in GitHub
  3. Check status of the GitHub Actions