pdf-lib
Version:
Library for creating and modifying PDF files in JavaScript
219 lines (174 loc) • 8.72 kB
Markdown
<h1 align="center">pdf-lib</h1>
<div align="center">
<strong>Create and modify PDF documents in any JavaScript environment.</strong>
</div>
<div align="center">
Designed to work in any modern JavaScript runtime. Tested in Node, Browser, and React Native environments.
</div>
<br />
<div align="center">
<!-- NPM Version -->
<a href="https://www.npmjs.com/package/pdf-lib">
<img
src="https://img.shields.io/npm/v/pdf-lib.svg?style=flat-square"
alt="NPM Version"
/>
</a>
<!-- Build Status -->
<a href="https://circleci.com/gh/Hopding/pdf-lib">
<img
src="https://img.shields.io/circleci/project/github/Hopding/pdf-lib/master.svg?style=flat-square&label=CircleCI"
alt="CircleCI Build Status"
/>
</a>
<!-- Prettier Badge -->
<a href="https://prettier.io/">
<img
src="https://img.shields.io/badge/code_style-prettier-ff69b4.svg?style=flat-square"
alt="Prettier Badge"
/>
</a>
</div>
<div align="center">
<h3>
<a href="https://github.com/Hopding/pdf-lib/tree/master/docs">
Documentation
</a>
<span> | </span>
<a href="https://github.com/Hopding/pdf-lib/tree/master/examples">
Examples
</a>
</h3>
</div>
## Table of Contents
* [Motivation](#motivation)
* [Features](#features)
* [Usage Examples](#usage-examples)
* [Document Creation](#document-creation)
* [Document Modification](#document-modification)
* [Copying Pages](#copying-pages)
* [Installation](#installation)
* [API Documentation](#api-documentation)
* [Contributing](#contributing)
* [Prior Art](#prior-art)
* [License](#license)
## Motivation
`pdf-lib` was created to address the JavaScript ecosystem's lack of robust support for PDF manipulation (especially for PDF _modification_).
Two of `pdf-lib`'s design requirements since its inception are to:
1. Support modification (editing) of existing documents.
2. Work in all JavaScript environments - not just in Node or the browser.
There are other good open source JavaScript PDF libraries available. However, most of them can only _create_ documents, they cannot _modify_ existing ones (e.g. [`pdfkit`](https://github.com/devongovett/pdfkit), [`jspdf`](https://github.com/MrRio/jsPDF), [`pdfmake`](https://github.com/bpampuch/pdfmake)). [`hummus`](https://github.com/galkahana/HummusJS) is a NodeJS library capable of both creating and modifying PDF documents. However, `hummus` is a Node wrapper around a [C++ library](https://github.com/galkahana/PDF-Writer). This means that it cannot run in _all_ JavaScript environments. For example, you cannot use `hummus` in the Browser or in React Native.
## Features
* Create new PDFs
* Modify existing PDFs
* _**New:**_ [Copy pages between PDFs](#copying-pages)
* Add Pages
* Insert Pages
* Remove Pages
* Draw Text
* Draw Images
* Draw Vector Graphics
* Embed Fonts
* Embed Images
## Usage Examples
More detailed examples are available [here](https://github.com/Hopding/pdf-lib/tree/master/examples).
### Document Creation
```javascript
import { PDFDocumentFactory, PDFDocumentWriter, drawText } from 'pdf-lib';
const pdfDoc = PDFDocumentFactory.create();
const [timesRomanFont] = pdfDoc.embedStandardFont('Times-Roman');
const page = pdfDoc
.createPage([350, 500])
.addFontDictionary('Times-Roman', timesRomanFont);
const contentStream = pdfDoc.createContentStream(
drawText('Creating PDFs in JavaScript is awesome!', {
x: 50,
y: 450,
size: 15,
font: 'Times-Roman',
colorRgb: [0, 0.53, 0.71],
}),
);
page.addContentStreams(pdfDoc.register(contentStream));
pdfDoc.addPage(page);
const pdfBytes = PDFDocumentWriter.saveToBytes(pdfDoc);
```
### Document Modification
```javascript
import { PDFDocumentFactory, PDFDocumentWriter, drawText } from 'pdf-lib';
// This should be a Uint8Array.
// This data can be obtained in a number of different ways.
// If your running in a Node environment, you could use fs.readFile().
// In the browser, you could make a fetch() call and use res.arrayBuffer().
const existingPdfDocBytes = ...
const pdfDoc = PDFDocumentFactory.load(existingPdfDocBytes);
const [helveticaFont] = pdfDoc.embedStandardFont('Helvetica');
const pages = pdfDoc.getPages();
const page = pages[0];
page.addFontDictionary('Helvetica', helveticaFont);
const contentStream = pdfDoc.createContentStream(
drawText('This text was added to the PDF with JavaScript!', {
x: 25,
y: 25,
size: 24,
font: 'Helvetica',
colorRgb: [0.95, 0.26, 0.21],
}),
);
page.addContentStreams(pdfDoc.register(contentStream));
const pdfBytes = PDFDocumentWriter.saveToBytes(pdfDoc);
```
### Copying Pages
```javascript
import { PDFDocumentFactory, PDFDocumentWriter } from 'pdf-lib';
// These should be a Uint8Arrays. (see Document Modification example for more details)
const firstDonorPdfBytes = ...
const secondDonorPdfBytes = ...
const firstDonorPdfDoc = PDFDocumentFactory.load(firstDonorPdfBytes);
const secondDonorPdfDoc = PDFDocumentFactory.load(secondDonorPdfBytes);
// We'll copy the fourth page from the first donor document, and the
// first page from the second donor document.
const firstDonorPage = firstDonorPdfDoc.getPages()[3];
const secondDonorPage = secondDonorPdfDoc.getPages()[0];
const pdfDoc = PDFDocumentFactory.create();
// Copy over the pages from the donor documents into our new document
pdfDoc.addPage(firstDonorPage);
pdfDoc.insertPage(0, secondDonorPage);
const pdfBytes = PDFDocumentWriter.saveToBytes(pdfDoc);
```
## Installation
### NPM Module
To install the latest stable version:
```bash
# With npm
npm install --save pdf-lib
# With yarn
yarn add pdf-lib
```
This assumes you're using [npm](https://www.npmjs.com/) or [yarn](https://yarnpkg.com/lang/en/) as your package manager.
### UMD Module
You can also download `pdf-lib` as a UMD module from [unpkg](https://unpkg.com/#/). The UMD builds have been compiled to ES5, so they should work [in any modern browser](https://caniuse.com/#feat=es5). UMD builds are useful if you aren't using a package manager or module bundler. For example, you can use them directly in the `<script>` tag of an HTML page.
The following builds are available:
* https://unpkg.com/pdf-lib/dist/pdf-lib.js
* https://unpkg.com/pdf-lib/dist/pdf-lib.min.js
When using a UMD build, you will have access to a global `window.PDFLib` variable. This variable contains all of the classes and functions exported by `pdf-lib`. For example:
```javascript
// NPM module
import { PDFDocumentFactory, drawText } from 'pdf-lib';
// UMD module
var PDFDocumentFactory = PDFLib.PDFDocumentFactory;
var drawText = PDFLib.drawText;
```
## API Documentation
API documentation is available [here](https://github.com/Hopding/pdf-lib/tree/master/docs).
## Contributing
We welcome contributions from the open source community! If you are interested in contributing to `pdf-lib`, please take a look at the [CONTRIBUTING.md](https://github.com/Hopding/pdf-lib/blob/master/CONTRIBUTING.md) file. It contains information to help you get `pdf-lib` setup and running on your machine.
## Prior Art
* [`pdfkit`](https://github.com/devongovett/pdfkit) is a PDF generation library for Node and the Browser. This library was immensely helpful as a reference and existence proof when creating `pdf-lib`. `pdfkit`'s code for [font embedding](https://github.com/Hopding/pdf-lib/blob/AddDocumentation/src/core/pdf-structures/factories/PDFFontFactory.ts#L64-L68), [PNG embedding](https://github.com/Hopding/pdf-lib/blob/AddDocumentation/src/core/pdf-structures/factories/PNGXObjectFactory.ts#L19-L23), and [JPG embedding](https://github.com/Hopding/pdf-lib/blob/AddDocumentation/src/core/pdf-structures/factories/JPEGXObjectFactory.ts#L32-L36) was especially useful.
* [`jspdf`](https://github.com/MrRio/jsPDF) is a PDF generation library for the browser.
* [`pdfmake`](https://github.com/bpampuch/pdfmake) is a PDF generation library for the browser.
* [`hummus`](https://github.com/galkahana/HummusJS) is a PDF generation and modification library for Node environments. `hummus` is a Node wrapper around a [C++ library](https://github.com/galkahana/PDF-Writer).
* [`react-native-pdf-lib`](https://github.com/Hopding/react-native-pdf-lib) is a PDF generation and modification library for React Native environments. `react-native-pdf-lib` is a wrapper around [C++](https://github.com/galkahana/PDF-Writer) and [Java](https://github.com/TomRoush/PdfBox-Android) libraries.
* [`pdfassembler`](https://github.com/DevelopingMagic/pdfassembler) is a PDF generation and modification library for Node and the browser. It requires some knowledge about the logical structure of PDF documents to use.
## License
[MIT](https://choosealicense.com/licenses/mit/)