diff --git a/.github/workflows/test.yml b/.github/workflows/test.yml index cf91908..88c7f2f 100644 --- a/.github/workflows/test.yml +++ b/.github/workflows/test.yml @@ -16,7 +16,7 @@ jobs: strategy: matrix: - node-version: [14.x, 16.x, 18.x] + node-version: [14.x, 16.x, 18.x, 20.x] steps: - uses: actions/checkout@v2 diff --git a/README.md b/README.md index be6880a..f7a3f49 100644 --- a/README.md +++ b/README.md @@ -1,9 +1,12 @@ # Description -This node.js library can **merge multiple PDF documents**, or parts of them, to one new PDF document. It's only dependency is [pdf-lib](https://pdf-lib.js.org/) so it can run in any javascript-only environment **without any external dependencies**. +This node.js library can **merge multiple PDF documents**, or parts of them, to one new PDF document. It's only dependency is [pdf-lib](https://pdf-lib.js.org/) so it can run in any javascript-only environment **without any non-javascript dependencies**. -> If you are searching for the legacy version based on +## Legacy notes + +* If you are searching for the legacy version based on [pdfjs](https://www.npmjs.com/package/pdfjs) please install a [v3 release](https://github.com/nbesli/pdf-merger-js/releases?q=v3&expanded=true). Since [v4](https://github.com/nbesli/pdf-merger-js/releases?q=v4&expanded=true) we use [pdf-lib](https://pdf-lib.js.org/) instead. +* If you are searching for a legacy version using CommonJS modules please install a [v4 release](https://github.com/nbesli/pdf-merger-js/releases?q=v4&expanded=true). Since [v5](https://github.com/nbesli/pdf-merger-js/releases?q=v5&expanded=true) we use the modern ESM ("import") instead of the CommonJS ("require) module standard. This library is inspired by the [PHP library PDFMerger](https://github.com/myokyawhtun/PDFMerger) and has a very similar API. @@ -22,10 +25,10 @@ The node.js version has the following export functions: * `setMetadata` set Metadata for producer, author, title or creator. * `reset` resets the internal state of the document, to start again. -### async node.js example +#### async node.js example ```js -const PDFMerger = require('pdf-merger-js'); +import PDFMerger from 'pdf-merger-js'; var merger = new PDFMerger(); @@ -37,6 +40,14 @@ var merger = new PDFMerger(); await merger.add('pdf3.pdf', '3 to 5'); //merge pages 3 to 5 (3,4,5) await merger.add('pdf3.pdf', '3-5'); //merge pages 3 to 5 (3,4,5) + // Set metadata + await merger.setMetadata({ + producer: "pdf-merger-js based script", + author: "John Doe", + creator: "John Doe", + title: "My live as John Doe" + }); + await merger.save('merged.pdf'); //save under given name and reset the internal document // Export the merged PDF as a nodejs Buffer @@ -55,7 +66,7 @@ The Browser version has the following export functions: * `setMetadata` set Metadata for producer, author, title or creator. * `reset` resets the internal state of the document, to start again. -#### Sample - React +#### async react example ```jsx import PDFMerger from 'pdf-merger-js/browser'; @@ -70,9 +81,13 @@ const Merger = (files) => { const merger = new PDFMerger(); for(const file of files) { - await merger.add(file) + await merger.add(file); } + await merger.setMetadata({ + producer: "pdf-merger-js based script" + }); + const mergedPdf = await merger.saveAsBlob(); const url = URL.createObjectURL(mergedPdf); @@ -99,27 +114,6 @@ const Merger = (files) => { }; ``` -#### Sample - Set Metadata - -```js -const merger = new PDFMerger(); - -// Add files - -// Set only producer -await merger.setMetadata({ - producer: "Custom Producer", -}); - -// Set all 4 fields -await merger.setMetadata({ - producer: "Custom Producer", - author: "Custom Author", - creator: "Custom Creator", - title: "Custom Title" -}); -``` - ## Similar libraries * [pdf-merge](https://www.npmjs.com/package/pdf-merge) has a dependency on [PDFtk](https://www.pdflabs.com/tools/pdftk-the-pdf-toolkit/). diff --git a/browser.js b/browser.js index c7854f8..e7165bc 100644 --- a/browser.js +++ b/browser.js @@ -1,4 +1,4 @@ -const { PDFDocument } = require('pdf-lib') +import { PDFDocument } from 'pdf-lib' const globalObject = typeof globalThis === 'object' @@ -9,7 +9,7 @@ const globalObject = ? self // Worker : this -class PDFMerger { +export default class PDFMerger { constructor () { this.reset() @@ -167,5 +167,3 @@ class PDFMerger { link.click() } } - -module.exports = PDFMerger diff --git a/index.js b/index.js index 4c2cd96..40a659b 100644 --- a/index.js +++ b/index.js @@ -1,7 +1,7 @@ -const { PDFDocument } = require('pdf-lib') -const fs = require('fs').promises +import { PDFDocument } from 'pdf-lib' +import fs from 'fs/promises' -class PDFMerger { +export default class PDFMerger { constructor () { this.reset() @@ -122,5 +122,3 @@ class PDFMerger { return Buffer.from(uInt8Array) } } - -module.exports = PDFMerger diff --git a/package-lock.json b/package-lock.json index 294533f..24c07d1 100644 --- a/package-lock.json +++ b/package-lock.json @@ -19,6 +19,9 @@ "node-fetch": "2", "pdf-diff": "^0.1.1", "standard": "^17.1.0" + }, + "engines": { + "node": ">=14" } }, "node_modules/@aashutoshrathi/word-wrap": { diff --git a/package.json b/package.json index a390ccd..f348e84 100644 --- a/package.json +++ b/package.json @@ -2,14 +2,18 @@ "name": "pdf-merger-js", "version": "4.3.1", "description": "merge multiple PDF documents, or parts of them, to a new PDF document", + "type": "module", + "engines": { + "node": ">=14" + }, "main": "./index.js", "types": "./index.d.ts", "browser": "./browser.js", "scripts": { "standard": "standard", "standard:fix": "standard --fix", - "test": "jest --detectOpenHandles", - "test:watch": "jest --watch --forceExit --detectOpenHandles" + "test": "node --experimental-vm-modules node_modules/jest/bin/jest --detectOpenHandles", + "test:watch": "node --experimental-vm-modules node_modules/jest/bin/jest.js --watch --forceExit --detectOpenHandles" }, "standard": { "env": [ diff --git a/test/browser-fixtures.test.js b/test/browser-fixtures.test.js index 70d485e..51a1933 100644 --- a/test/browser-fixtures.test.js +++ b/test/browser-fixtures.test.js @@ -2,10 +2,14 @@ * @jest-environment jsdom */ -const path = require('path') -const fs = require('fs-extra') -const pdfDiff = require('pdf-diff') -const fetch = require('node-fetch') +import path from 'path' +import fs from 'fs-extra' +import pdfDiff from 'pdf-diff' +import fetch from 'node-fetch' +import { jest } from '@jest/globals' + +import PDFMerger from '../browser' + /* add a global `windows.fetch` to mock fetch */ @@ -13,8 +17,7 @@ global.window.fetch = jest.fn().mockImplementation((requestUrl) => { return Promise.resolve(fetch(requestUrl)) }) -const PDFMerger = require('../browser') - +const __dirname = path.dirname(new URL(import.meta.url).pathname) const FIXTURES_DIR = path.join(__dirname, 'fixtures') const TMP_DIR = path.join(__dirname, 'tmp') diff --git a/test/fixtures.test.js b/test/fixtures.test.js index e25ef60..cc00ee1 100644 --- a/test/fixtures.test.js +++ b/test/fixtures.test.js @@ -1,10 +1,12 @@ -const path = require('path') -const fs = require('fs-extra') -const pdfDiff = require('pdf-diff') -const { PDFDocument } = require('pdf-lib') +import path from 'path' +import fs from 'fs-extra' +import pdfDiff from 'pdf-diff' +import { PDFDocument } from 'pdf-lib' +import { jest } from '@jest/globals' -const PDFMerger = require('../index') +import PDFMerger from '../index' +const __dirname = path.dirname(new URL(import.meta.url).pathname) const FIXTURES_DIR = path.join(__dirname, 'fixtures') const TMP_DIR = path.join(__dirname, 'tmp') diff --git a/test/issues.test.js b/test/issues.test.js index d247be2..31ce131 100644 --- a/test/issues.test.js +++ b/test/issues.test.js @@ -1,8 +1,10 @@ -const path = require('path') -const fs = require('fs-extra') +import path from 'path' +import fs from 'fs-extra' +import { jest } from '@jest/globals' -const PDFMerger = require('../index') +import PDFMerger from '../index' +const __dirname = path.dirname(new URL(import.meta.url).pathname) const FIXTURES_DIR = path.join(__dirname, 'fixtures') const TMP_DIR = path.join(__dirname, 'tmp')