add-html-to-pdf
Add custom HTML, CSS and images to an existing PDF document.
It uses a Docker image from pdf2htmlex to convert your PDF document to HTML format, inserts your HTML on each page using Cheerio and then converts back to PDF using wkhtmltopdf.
Installation:
npm install add-html-to-pdf --save
Required dependencies:
Docker: https://docs.docker.com/install/
wkhtmltopdf: https://wkhtmltopdf.org/downloads.html
Examples
Using inline HTML and CSS:
const pdf = require('add-html-to-pdf'); var options = { input: 'sample.pdf', output: 'done.pdf', html: "<div style='color:red'>This is awesome!</div>",} (async function() { await pdf.insertHTMLInPDF(options);})()
Using a HTML file:
const pdf = require('add-html-to-pdf'); var options = { input: 'input.pdf', output: 'done.pdf', htmlFile: "index.html",} (async function() { await pdf.insertHTMLInPDF(options);})()
Inserting on page 1 and 2 only:
const pdf = require('add-html-to-pdf'); var options = { input: 'input.pdf', output: 'done.pdf', htmlFile: "index.html", specificPages: [1,2]} (async function() { await pdf.insertHTMLInPDF(options);})()
Options:
input: Relative path of input. Must have .pdf extension if useDocker is set to true. Must have .html extension if useDocker is set to false. output: Relative path of output file. Defaults to './annotated.pdf'. html: HTML string to add to each page. Inline CSS can be used. htmlFile: Relative path of HTML file to add to each page (e.g. 'try.html'). pages: Amount of pages in the PDF to add the HTML to. Defaults to 100. specificPages: Add HTML to specific pages only. Accepts an array of page numbers. Leave undefined to add HTML to all pages. useDocker: Whether to use Docker or not. If set to false, input has to be a html file. If set to true, input has to be a pdf file. Defaults to true. dockerOptions: Optional Docker Options, see https://www.npmjs.com/package/docker-cli-js
NB: Docker may require sudo priveleges on Linux.
An alternative that does not require Docker would be to install pdf2htmlEX (https://github.com/coolwanglu/pdf2htmlEX) and convert from PDF to HTML manually. Then supply the HTML document as input and set the useDocker flag to false.