1.0.0 • Published 2 years ago

pdf2mp4 v1.0.0

Weekly downloads
-
License
MIT
Repository
github
Last release
2 years ago

pdf2mp4

Module that converts pdf files to MP4 in high resolution. Can be used for fast reading applications.

Required system dependencies:

multithreaded!

Installation

npm install pdf2mp4

Prerequisites

  • git
  • npm & node
  • ImageMagick & gm
  • ffmpeg

Setup

git clone https://github.com/irgipaulius/pdf2mp4

cd pdf2mp4

npm install

GraphicsMagick

Next, you must install ImageMagick and gm on your system:

FFMPEG

  • OSX
    • brew install ffmpeg
  • Windows
  • Linux
    • sudo apt install ffmpeg
  • FreeBSD
    • pkg install ffmpeg

Usage

import { pdf2mp4, createEventLogger } from "pdf2mp4";

const e = createEventLogger(); // optional, but great for debugging

await pdf2mp4(
  {
    fileName: "sample.pdf",
    secondsPerFrame: 2.15,
    uploadDir: "./",
    outputDir: "./",
  },
  e
);

Properties

Propertytypedefault valuedescription
fileNamemandatory stringname of the pdf file.
secondsPerFrameoptional numbereither this or framesPerSecond must be set.
framesPerSecondoptional numbereither this or secondsPerFrame must be set.
maxConcurrencyoptional number8max concurrent frames to process at the same time. Directly affects performance and stability.
uploadDiroptional string"pdf2mp4/upload"path to directory where pdf files are located
tempDiroptional string"pdf2mp4/generated/temp"path to directory where temporary files will be generated
outputDiroptional string"pdf2mp4/generated/video"path to directory where generated mp4 file is placed

Events (optional)

For example, on front-end you can implement a full-fledged processing loading animation, which is accurate to the actual process:

const e = new EventEmitter();

e.on("start", (message, filename) => {
  console.log(message); // Converting sample.pdf...
});

e.on("benchmark_raster", (message, benchmarkSeconds) => {
  console.log(message); // `Finished rasterization in 6.9420 seconds.`
});

e.on("benchmark_render", (message, benchmarkSeconds) => {
  console.log(message); // `Finished render in 6.9420 seconds.`
});

e.on("progress_raster", (message, progress) => {
  console.log(message); // Rasterizing... 69/100
  setProgress(progress / 100); // great to use with states for react
});

e.on("progress_render", (message, progress) => {
  console.log(message); // Rendering... 69/100
  setProgress(progress / 100); // great to use with states for react
});

e.on("end", (message, videoFilename, videoDestination) => {
  console.log(message); // Finished converting sample.pdf to /usr/Johnny/.../pdf2mp4/Am83rH3ar0.mp4.
  resolve(videoDestination); // final location of the mp4 file.
});

// no need to await, result will be in the 'end' event
pdf2mp4("sample.pdf", { framesPerSecond: 0.33 }, e);

Notes

This is my first ever published npm package. Submit issues to the github repository for any extra features or questions.

There is also a fully developed website that uses this package at https://www.hyperreader.eu, and it's source code is here.