@iqx-limited/quick-pdf 1.0.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/LICENSE +21 -0
- package/README.md +73 -0
- package/dist/canvas.js +25 -0
- package/dist/canvas.js.map +1 -0
- package/dist/index.js +10 -0
- package/dist/index.js.map +1 -0
- package/dist/modules/html2pdf.js +38 -0
- package/dist/modules/html2pdf.js.map +1 -0
- package/dist/modules/img2pdf.js +64 -0
- package/dist/modules/img2pdf.js.map +1 -0
- package/dist/modules/pdf2img.js +49 -0
- package/dist/modules/pdf2img.js.map +1 -0
- package/dist/test.js +51 -0
- package/dist/test.js.map +1 -0
- package/dist/tsconfig.tsbuildinfo +1 -0
- package/dist/utilies.js +37 -0
- package/dist/utilies.js.map +1 -0
- package/package.json +57 -0
package/LICENSE
ADDED
|
@@ -0,0 +1,21 @@
|
|
|
1
|
+
MIT License
|
|
2
|
+
|
|
3
|
+
Copyright (c) 2024 IQX Limited
|
|
4
|
+
|
|
5
|
+
Permission is hereby granted, free of charge, to any person obtaining a copy
|
|
6
|
+
of this software and associated documentation files (the "Software"), to deal
|
|
7
|
+
in the Software without restriction, including without limitation the rights
|
|
8
|
+
to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
|
|
9
|
+
copies of the Software, and to permit persons to whom the Software is
|
|
10
|
+
furnished to do so, subject to the following conditions:
|
|
11
|
+
|
|
12
|
+
The above copyright notice and this permission notice shall be included in all
|
|
13
|
+
copies or substantial portions of the Software.
|
|
14
|
+
|
|
15
|
+
THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
|
|
16
|
+
IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
|
|
17
|
+
FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
|
|
18
|
+
AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
|
|
19
|
+
LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
|
|
20
|
+
OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
|
|
21
|
+
SOFTWARE.
|
package/README.md
ADDED
|
@@ -0,0 +1,73 @@
|
|
|
1
|
+
# QuickPDF
|
|
2
|
+
Handling PDFs in NodeJS (📃 to 🖼️)
|
|
3
|
+
|
|
4
|
+
This project provides a set of utilities for converting various file formats without the need for additional dependencies. It supports multiple file types and leverages technologies like `Playwright`, `PDFKit`, and `pdfjs-dist` for file processing.
|
|
5
|
+
|
|
6
|
+
## Features
|
|
7
|
+
|
|
8
|
+
- **HTML to PDF**: Converts HTML content (from a URL or file path) into a PDF.
|
|
9
|
+
- **Image to PDF**: Converts images (JPEG, PNG) into a PDF, with optional headers and footers.
|
|
10
|
+
- **PDF to Image**: Converts PDF files to image formats (JPEG or PNG) using `pdfjs-dist` and `canvas`.
|
|
11
|
+
- **Utilities**: Includes helper functions to fetch and read HTML files and read files from local directories.
|
|
12
|
+
|
|
13
|
+
## Requirements
|
|
14
|
+
|
|
15
|
+
- **Node.js**: This project is built with Node.js and uses ES modules. NodeJS > v22 required.
|
|
16
|
+
|
|
17
|
+
# Operations Available in the Package
|
|
18
|
+
|
|
19
|
+
## 1. `html2pdf`
|
|
20
|
+
|
|
21
|
+
### Function Signature:
|
|
22
|
+
```typescript
|
|
23
|
+
html2pdf(input: string | URL)
|
|
24
|
+
```
|
|
25
|
+
|
|
26
|
+
### Parameters:
|
|
27
|
+
|
|
28
|
+
| Parameter | Type | Description | Data that can be passed |
|
|
29
|
+
|-----------|---------------|--------------------------------------------------|--------------------------------------------|
|
|
30
|
+
| `input` | `string \| URL` | The HTML content to convert to PDF. | A file path or a URL pointing to HTML content, as either a Node URL object or a Node string. Alternativly pass an html string directly. |
|
|
31
|
+
|
|
32
|
+
## 2. `img2pdf`
|
|
33
|
+
|
|
34
|
+
### Function Signature:
|
|
35
|
+
```typescript
|
|
36
|
+
img2pdf(input: Buffer | string | URL, options: Options = {})
|
|
37
|
+
```
|
|
38
|
+
|
|
39
|
+
### Parameters:
|
|
40
|
+
|
|
41
|
+
| Parameter | Type | Description | Data that can be passed |
|
|
42
|
+
|-----------|---------------------------|--------------------------------------------------|--------------------------------------------|
|
|
43
|
+
| `input` | `Buffer \| string \| URL` | The image content to convert to PDF. | A Buffer, file path, or URL pointing to an image. String or URL object can be passed for an HTTP or Local Path. |
|
|
44
|
+
| `options` | `Options` | Optional configuration for the PDF conversion. | An object with optional headers and footers |
|
|
45
|
+
|
|
46
|
+
### Options Type:
|
|
47
|
+
|
|
48
|
+
| Property | Type | Description |
|
|
49
|
+
|-----------|----------|--------------------------------------------------|
|
|
50
|
+
| `header` | `string` | Optional header text to include in the PDF. |
|
|
51
|
+
| `footer` | `string` | Optional footer text to include in the PDF. |
|
|
52
|
+
|
|
53
|
+
## 3. `pdf2img`
|
|
54
|
+
|
|
55
|
+
### Function Signature:
|
|
56
|
+
```typescript
|
|
57
|
+
pdf2img(input: Buffer | string | URL, options: Options = {})
|
|
58
|
+
```
|
|
59
|
+
|
|
60
|
+
### Parameters:
|
|
61
|
+
|
|
62
|
+
| Parameter | Type | Description | Data that can be passed |
|
|
63
|
+
|-----------|---------------------------|--------------------------------------------------|--------------------------------------------|
|
|
64
|
+
| `input` | `Buffer \| string \| URL` | The PDF content to convert to images. | A Buffer, file path, or URL pointing to a PDF. String or URL object can be passed for an HTTP or Local Path. |
|
|
65
|
+
| `options` | `Options` | Optional configuration for the image conversion. | An object with optional scale, password, and buffer configuration |
|
|
66
|
+
|
|
67
|
+
### Options Type:
|
|
68
|
+
|
|
69
|
+
| Property | Type | Description |
|
|
70
|
+
|-----------|----------------------------------------------------------------------|--------------------------------------------------|
|
|
71
|
+
| `scale` | `number` | Scaling factor for rendering the PDF pages. Default is 1. |
|
|
72
|
+
| `password`| `string` | Optional password for decrypting password-protected PDFs. |
|
|
73
|
+
| `buffer` | `{ mime: "image/png"; options: PngConfig } \| { mime: "image/jpeg"; options: JpegConfig }` | Optional configuration for output image format and quality (PNG or JPEG). These types can be found in [pdfjs-dist](https://github.com/mozilla/pdf.js) |
|
package/dist/canvas.js
ADDED
|
@@ -0,0 +1,25 @@
|
|
|
1
|
+
import { Canvas } from "canvas";
|
|
2
|
+
export class CanvasFactory {
|
|
3
|
+
create(width, height, transparent) {
|
|
4
|
+
if (width <= 0 || height <= 0) {
|
|
5
|
+
throw new Error("Invalid canvas size");
|
|
6
|
+
}
|
|
7
|
+
const canvas = new Canvas(width, height);
|
|
8
|
+
const context = canvas.getContext("2d");
|
|
9
|
+
if (transparent) {
|
|
10
|
+
context.clearRect(0, 0, width, height);
|
|
11
|
+
}
|
|
12
|
+
return {
|
|
13
|
+
canvas,
|
|
14
|
+
context
|
|
15
|
+
};
|
|
16
|
+
}
|
|
17
|
+
reset(canvas, width, height) {
|
|
18
|
+
if (width <= 0 || height <= 0) {
|
|
19
|
+
throw new Error("Invalid canvas size");
|
|
20
|
+
}
|
|
21
|
+
canvas.width = width;
|
|
22
|
+
canvas.height = height;
|
|
23
|
+
}
|
|
24
|
+
}
|
|
25
|
+
//# sourceMappingURL=canvas.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"canvas.js","sourceRoot":"","sources":["../src/canvas.ts"],"names":[],"mappings":"AAMA,OAAO,EAAE,MAAM,EAAE,MAAM,QAAQ,CAAA;AAE/B,MAAM,OAAO,aAAa;IAWjB,MAAM,CAAG,KAAa,EAAE,MAAc,EAAE,WAAoB;QACjE,IAAK,KAAK,IAAI,CAAC,IAAI,MAAM,IAAI,CAAC,EAAG,CAAC;YAChC,MAAM,IAAI,KAAK,CAAG,qBAAqB,CAAE,CAAA;QAC3C,CAAC;QAED,MAAM,MAAM,GAAG,IAAI,MAAM,CAAG,KAAK,EAAE,MAAM,CAAE,CAAA;QAC3C,MAAM,OAAO,GAAG,MAAM,CAAC,UAAU,CAAG,IAAI,CAAE,CAAA;QAE1C,IAAK,WAAW,EAAG,CAAC;YAClB,OAAO,CAAC,SAAS,CAAG,CAAC,EAAE,CAAC,EAAE,KAAK,EAAE,MAAM,CAAE,CAAA;QAC3C,CAAC;QAED,OAAO;YACL,MAAM;YACN,OAAO;SACR,CAAA;IACH,CAAC;IAUM,KAAK,CAAG,MAAc,EAAE,KAAa,EAAE,MAAc;QAC1D,IAAK,KAAK,IAAI,CAAC,IAAI,MAAM,IAAI,CAAC,EAAG,CAAC;YAChC,MAAM,IAAI,KAAK,CAAG,qBAAqB,CAAE,CAAA;QAC3C,CAAC;QAED,MAAM,CAAC,KAAK,GAAG,KAAK,CAAA;QACpB,MAAM,CAAC,MAAM,GAAG,MAAM,CAAA;IACxB,CAAC;CACF"}
|
package/dist/index.js
ADDED
|
@@ -0,0 +1,10 @@
|
|
|
1
|
+
import { satisfies } from "semver";
|
|
2
|
+
const requiredVersion = ">=22.0.0";
|
|
3
|
+
if (!satisfies(process.version, requiredVersion)) {
|
|
4
|
+
console.error(`\nError: Node.js version ${requiredVersion} is required. You are using ${process.version}.\n`);
|
|
5
|
+
process.exit(1);
|
|
6
|
+
}
|
|
7
|
+
export * from "./modules/pdf2img.js";
|
|
8
|
+
export * from "./modules/img2pdf.js";
|
|
9
|
+
export * from "./modules/html2pdf.js";
|
|
10
|
+
//# sourceMappingURL=index.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"index.js","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,SAAS,EAAE,MAAM,QAAQ,CAAA;AAElC,MAAM,eAAe,GAAG,UAAU,CAAA;AAElC,IAAK,CAAC,SAAS,CAAG,OAAO,CAAC,OAAO,EAAE,eAAe,CAAE,EAAG,CAAC;IACtD,OAAO,CAAC,KAAK,CACX,4BAA4B,eAAe,+BAA+B,OAAO,CAAC,OAAO,KAAK,CAC/F,CAAA;IACD,OAAO,CAAC,IAAI,CAAG,CAAC,CAAE,CAAA;AACpB,CAAC;AAED,cAAc,sBAAsB,CAAA;AAEpC,cAAc,sBAAsB,CAAA;AAEpC,cAAc,uBAAuB,CAAA"}
|
|
@@ -0,0 +1,38 @@
|
|
|
1
|
+
import { existsSync } from "fs";
|
|
2
|
+
import { HtmlValidate } from "html-validate/node";
|
|
3
|
+
import { chromium } from "playwright";
|
|
4
|
+
import { fetchHtmlFromUrl, readHtmlFromFilePath } from "src/utilies";
|
|
5
|
+
export const html2pdf = async (input) => {
|
|
6
|
+
const validator = new HtmlValidate();
|
|
7
|
+
let htmlContent = input.toString();
|
|
8
|
+
if (htmlContent.startsWith("http://") || htmlContent.startsWith("https://")) {
|
|
9
|
+
htmlContent = await fetchHtmlFromUrl(htmlContent);
|
|
10
|
+
}
|
|
11
|
+
else if (existsSync(input)) {
|
|
12
|
+
htmlContent = await readHtmlFromFilePath(htmlContent);
|
|
13
|
+
}
|
|
14
|
+
return validator.validateString(htmlContent).then(async (res) => {
|
|
15
|
+
if (res.valid) {
|
|
16
|
+
const browser = await chromium.launch();
|
|
17
|
+
const page = await browser.newPage();
|
|
18
|
+
await page.setContent(htmlContent, { waitUntil: "load" });
|
|
19
|
+
const pdfBuffer = await page.pdf({ format: "A4", printBackground: true });
|
|
20
|
+
await browser.close();
|
|
21
|
+
return pdfBuffer;
|
|
22
|
+
}
|
|
23
|
+
else {
|
|
24
|
+
return Promise.reject(`Validation Error\n` +
|
|
25
|
+
res.results
|
|
26
|
+
.map((result) => {
|
|
27
|
+
return (`File Path: ${result.filePath}\n` +
|
|
28
|
+
result.messages
|
|
29
|
+
.map((message) => {
|
|
30
|
+
return `Message: ${message.message}\nLine: ${message.line}\nColumn: ${message.column}\nSource: ${result.source}`;
|
|
31
|
+
})
|
|
32
|
+
.join("\n"));
|
|
33
|
+
})
|
|
34
|
+
.join("\n"));
|
|
35
|
+
}
|
|
36
|
+
});
|
|
37
|
+
};
|
|
38
|
+
//# sourceMappingURL=html2pdf.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"html2pdf.js","sourceRoot":"","sources":["../../src/modules/html2pdf.ts"],"names":[],"mappings":"AAIA,OAAO,EAAE,UAAU,EAAE,MAAM,IAAI,CAAA;AAC/B,OAAO,EAAE,YAAY,EAAE,MAAM,oBAAoB,CAAA;AACjD,OAAO,EAAE,QAAQ,EAAE,MAAM,YAAY,CAAA;AACrC,OAAO,EAAE,gBAAgB,EAAE,oBAAoB,EAAE,MAAM,aAAa,CAAA;AASpE,MAAM,CAAC,MAAM,QAAQ,GAAG,KAAK,EAC3B,KAAmB,EACnB,EAAE;IACF,MAAM,SAAS,GAAG,IAAI,YAAY,EAAG,CAAA;IAErC,IAAI,WAAW,GAAG,KAAK,CAAC,QAAQ,EAAG,CAAA;IAGnC,IAAK,WAAW,CAAC,UAAU,CAAG,SAAS,CAAE,IAAI,WAAW,CAAC,UAAU,CAAG,UAAU,CAAE,EAAG,CAAC;QACpF,WAAW,GAAG,MAAM,gBAAgB,CAAG,WAAW,CAAE,CAAA;IACtD,CAAC;SAEI,IAAK,UAAU,CAAG,KAAK,CAAE,EAAG,CAAC;QAChC,WAAW,GAAG,MAAM,oBAAoB,CAAG,WAAW,CAAE,CAAA;IAC1D,CAAC;IAED,OAAO,SAAS,CAAC,cAAc,CAAG,WAAW,CAAE,CAAC,IAAI,CAAG,KAAK,EAAG,GAAG,EAAG,EAAE;QACrE,IAAK,GAAG,CAAC,KAAK,EAAG,CAAC;YAChB,MAAM,OAAO,GAAG,MAAM,QAAQ,CAAC,MAAM,EAAG,CAAA;YACxC,MAAM,IAAI,GAAG,MAAM,OAAO,CAAC,OAAO,EAAG,CAAA;YACrC,MAAM,IAAI,CAAC,UAAU,CAAG,WAAW,EAAE,EAAE,SAAS,EAAE,MAAM,EAAE,CAAE,CAAA;YAC5D,MAAM,SAAS,GAAG,MAAM,IAAI,CAAC,GAAG,CAAG,EAAE,MAAM,EAAE,IAAI,EAAE,eAAe,EAAE,IAAI,EAAE,CAAE,CAAA;YAC5E,MAAM,OAAO,CAAC,KAAK,EAAG,CAAA;YACtB,OAAO,SAAS,CAAA;QAClB,CAAC;aAAM,CAAC;YAEN,OAAO,OAAO,CAAC,MAAM,CACnB,oBAAoB;gBAClB,GAAG,CAAC,OAAO;qBACR,GAAG,CAAG,CAAE,MAAM,EAAG,EAAE;oBAClB,OAAO,CACL,cAAc,MAAM,CAAC,QAAQ,IAAI;wBACjC,MAAM,CAAC,QAAQ;6BACZ,GAAG,CAAG,CAAE,OAAO,EAAG,EAAE;4BACnB,OAAO,YAAY,OAAO,CAAC,OAAO,WAAW,OAAO,CAAC,IAAI,aAAa,OAAO,CAAC,MAAM,aAAa,MAAM,CAAC,MAAM,EAAE,CAAA;wBAClH,CAAC,CAAE;6BACF,IAAI,CAAG,IAAI,CAAE,CACjB,CAAA;gBACH,CAAC,CAAE;qBACF,IAAI,CAAG,IAAI,CAAE,CACnB,CAAA;QACH,CAAC;IACH,CAAC,CAAE,CAAA;AACL,CAAC,CAAA"}
|
|
@@ -0,0 +1,64 @@
|
|
|
1
|
+
import { fileTypeFromBuffer } from "file-type";
|
|
2
|
+
import { imageSize } from "image-size";
|
|
3
|
+
import PDFDocument from "pdfkit";
|
|
4
|
+
import { getBuffer } from "src/utilies";
|
|
5
|
+
export const img2pdf = async (input, options = {}) => {
|
|
6
|
+
return new Promise((resolve, reject) => {
|
|
7
|
+
getBuffer(input).then(async (buf) => {
|
|
8
|
+
const type = await fileTypeFromBuffer(buf);
|
|
9
|
+
if (type?.mime !== "image/jpeg" && type?.mime !== "image/png") {
|
|
10
|
+
console.error(`ERROR: Provided File is not a JPEG or a PNG.`);
|
|
11
|
+
process.exit(1);
|
|
12
|
+
}
|
|
13
|
+
const pdfBuffers = [];
|
|
14
|
+
const imgSize = imageSize(buf);
|
|
15
|
+
const landscape = imgSize.width && imgSize.height ? imgSize.width > imgSize.height : false;
|
|
16
|
+
const doc = new PDFDocument({
|
|
17
|
+
size: [imgSize.width, imgSize.height],
|
|
18
|
+
layout: landscape ? "landscape" : "portrait",
|
|
19
|
+
margins: {
|
|
20
|
+
top: 0,
|
|
21
|
+
bottom: 0,
|
|
22
|
+
left: 0,
|
|
23
|
+
right: 0
|
|
24
|
+
}
|
|
25
|
+
});
|
|
26
|
+
doc.on("data", (data) => {
|
|
27
|
+
pdfBuffers.push(data);
|
|
28
|
+
});
|
|
29
|
+
doc.on("end", () => {
|
|
30
|
+
resolve(Buffer.concat(pdfBuffers));
|
|
31
|
+
});
|
|
32
|
+
doc.fontSize(options.fontSize ?? 10);
|
|
33
|
+
const topMargin = options.header ? 20 : 0;
|
|
34
|
+
const bottomMargin = options.footer ? 20 : 0;
|
|
35
|
+
const sidePadding = 20;
|
|
36
|
+
const imageHeight = doc.page.height - topMargin - bottomMargin;
|
|
37
|
+
if (options.header) {
|
|
38
|
+
doc.text(options.header, sidePadding, topMargin / 2 - 6, {
|
|
39
|
+
align: "center",
|
|
40
|
+
baseline: "top",
|
|
41
|
+
width: doc.page.width - 2 * sidePadding,
|
|
42
|
+
height: topMargin - 5,
|
|
43
|
+
ellipsis: true
|
|
44
|
+
}).moveDown(0.5);
|
|
45
|
+
}
|
|
46
|
+
doc.image(buf, 0, topMargin, {
|
|
47
|
+
width: doc.page.width,
|
|
48
|
+
height: imageHeight
|
|
49
|
+
});
|
|
50
|
+
if (options.footer) {
|
|
51
|
+
doc.text(options.footer, sidePadding, doc.page.height - bottomMargin / 2 - 6, {
|
|
52
|
+
align: "center",
|
|
53
|
+
width: doc.page.width - 2 * sidePadding,
|
|
54
|
+
height: bottomMargin - 5,
|
|
55
|
+
ellipsis: true
|
|
56
|
+
});
|
|
57
|
+
}
|
|
58
|
+
doc.end();
|
|
59
|
+
}).catch((e) => {
|
|
60
|
+
reject(e);
|
|
61
|
+
});
|
|
62
|
+
});
|
|
63
|
+
};
|
|
64
|
+
//# sourceMappingURL=img2pdf.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"img2pdf.js","sourceRoot":"","sources":["../../src/modules/img2pdf.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,49 @@
|
|
|
1
|
+
import { CanvasFactory } from "../canvas.js";
|
|
2
|
+
import { getBuffer } from "../utilies.js";
|
|
3
|
+
import { getDocument } from "pdfjs-dist/legacy/build/pdf.mjs";
|
|
4
|
+
import { fileTypeFromBuffer } from "file-type";
|
|
5
|
+
const canvasFactory = new CanvasFactory();
|
|
6
|
+
export const pdf2img = async (input, options = {}) => {
|
|
7
|
+
const buffer = await getBuffer(input);
|
|
8
|
+
const type = await fileTypeFromBuffer(buffer);
|
|
9
|
+
if (type?.mime !== "application/pdf") {
|
|
10
|
+
console.error(`ERROR: Provided File is not a PDF.`);
|
|
11
|
+
process.exit(1);
|
|
12
|
+
}
|
|
13
|
+
const newoptions = {
|
|
14
|
+
password: options.password ?? undefined,
|
|
15
|
+
isEvalSupported: false,
|
|
16
|
+
data: Uint8Array.from(buffer)
|
|
17
|
+
};
|
|
18
|
+
const pdfDocument = await getDocument(newoptions).promise;
|
|
19
|
+
const metadata = await pdfDocument.getMetadata();
|
|
20
|
+
const pages = [];
|
|
21
|
+
for (let i = 1; i <= pdfDocument.numPages; i++) {
|
|
22
|
+
pages.push(await getPage(i));
|
|
23
|
+
}
|
|
24
|
+
async function getPage(pageNumber) {
|
|
25
|
+
const page = await pdfDocument.getPage(pageNumber);
|
|
26
|
+
const viewport = page.getViewport({ scale: options.scale ?? 1 });
|
|
27
|
+
const { canvas, context } = canvasFactory.create(viewport.width, viewport.height, true);
|
|
28
|
+
await page.render({
|
|
29
|
+
canvasContext: context,
|
|
30
|
+
viewport
|
|
31
|
+
}).promise;
|
|
32
|
+
if (options.buffer?.mime === "image/jpeg") {
|
|
33
|
+
return canvas.toBuffer("image/jpeg", options.buffer.options);
|
|
34
|
+
}
|
|
35
|
+
else {
|
|
36
|
+
return canvas.toBuffer("image/png", options.buffer?.options ?? {
|
|
37
|
+
resolution: 1920,
|
|
38
|
+
compressionLevel: 0,
|
|
39
|
+
filters: canvas.PNG_FILTER_NONE
|
|
40
|
+
});
|
|
41
|
+
}
|
|
42
|
+
}
|
|
43
|
+
return {
|
|
44
|
+
length: pdfDocument.numPages,
|
|
45
|
+
metadata: metadata.info,
|
|
46
|
+
pages
|
|
47
|
+
};
|
|
48
|
+
};
|
|
49
|
+
//# sourceMappingURL=pdf2img.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"pdf2img.js","sourceRoot":"","sources":["../../src/modules/pdf2img.ts"],"names":[],"mappings":"AAIA,OAAO,EAAE,aAAa,EAAE,MAAM,cAAc,CAAA;AAC5C,OAAO,EAAE,SAAS,EAAE,MAAM,eAAe,CAAA;AACzC,OAAO,EAAE,WAAW,EAAE,MAAM,iCAAiC,CAAA;AAE7D,OAAO,EAAE,kBAAkB,EAAE,MAAM,WAAW,CAAA;AA0B9C,MAAM,aAAa,GAAG,IAAI,aAAa,EAAI,CAAA;AAU3C,MAAM,CAAC,MAAM,OAAO,GAAG,KAAK,EAC1B,KAA4B,EAC5B,UAAmB,EAAG,EACtB,EAAE;IAEF,MAAM,MAAM,GAAG,MAAM,SAAS,CAAG,KAAK,CAAE,CAAA;IAGxC,MAAM,IAAI,GAAG,MAAM,kBAAkB,CAAG,MAAM,CAAE,CAAA;IAChD,IAAK,IAAI,EAAE,IAAI,KAAK,iBAAiB,EAAG,CAAC;QACvC,OAAO,CAAC,KAAK,CAAG,oCAAoC,CAAE,CAAA;QACtD,OAAO,CAAC,IAAI,CAAG,CAAC,CAAE,CAAA;IACpB,CAAC;IAGD,MAAM,UAAU,GAAQ;QACtB,QAAQ,EAAE,OAAO,CAAC,QAAQ,IAAI,SAAS;QACvC,eAAe,EAAE,KAAK;QACtB,IAAI,EAAE,UAAU,CAAC,IAAI,CAAG,MAAM,CAAE;KACjC,CAAA;IAGD,MAAM,WAAW,GAAG,MAAM,WAAW,CAAG,UAAU,CAAE,CAAC,OAAO,CAAA;IAE5D,MAAM,QAAQ,GAAG,MAAM,WAAW,CAAC,WAAW,EAAI,CAAA;IAElD,MAAM,KAAK,GAAG,EAAG,CAAA;IAEjB,KAAM,IAAI,CAAC,GAAG,CAAC,EAAE,CAAC,IAAI,WAAW,CAAC,QAAQ,EAAE,CAAC,EAAE,EAAG,CAAC;QACjD,KAAK,CAAC,IAAI,CAAG,MAAM,OAAO,CAAG,CAAC,CAAE,CAAE,CAAA;IACpC,CAAC;IAGD,KAAK,UAAU,OAAO,CAAG,UAAkB;QACzC,MAAM,IAAI,GAAG,MAAM,WAAW,CAAC,OAAO,CAAG,UAAU,CAAE,CAAA;QAGrD,MAAM,QAAQ,GAAG,IAAI,CAAC,WAAW,CAAG,EAAE,KAAK,EAAE,OAAO,CAAC,KAAK,IAAI,CAAC,EAAE,CAAE,CAAA;QAGnE,MAAM,EAAE,MAAM,EAAE,OAAO,EAAE,GAAG,aAAa,CAAC,MAAM,CAC9C,QAAQ,CAAC,KAAK,EACd,QAAQ,CAAC,MAAM,EACf,IAAI,CACL,CAAA;QAGD,MAAM,IAAI,CAAC,MAAM,CAAG;YAClB,aAAa,EAAE,OAAc;YAC7B,QAAQ;SACT,CAAE,CAAC,OAAO,CAAA;QAGX,IAAK,OAAO,CAAC,MAAM,EAAE,IAAI,KAAK,YAAY,EAAG,CAAC;YAC5C,OAAO,MAAM,CAAC,QAAQ,CAAG,YAAY,EAAE,OAAO,CAAC,MAAM,CAAC,OAAO,CAAE,CAAA;QACjE,CAAC;aAAM,CAAC;YACN,OAAO,MAAM,CAAC,QAAQ,CAAG,WAAW,EAAE,OAAO,CAAC,MAAM,EAAE,OAAO,IAAI;gBAC/D,UAAU,EAAE,IAAI;gBAChB,gBAAgB,EAAE,CAAC;gBACnB,OAAO,EAAE,MAAM,CAAC,eAAe;aAChC,CAAE,CAAA;QACL,CAAC;IACH,CAAC;IAGD,OAAO;QACL,MAAM,EAAE,WAAW,CAAC,QAAQ;QAC5B,QAAQ,EAAE,QAAQ,CAAC,IAAI;QACvB,KAAK;KACN,CAAA;AACH,CAAC,CAAA"}
|
package/dist/test.js
ADDED
|
@@ -0,0 +1,51 @@
|
|
|
1
|
+
import { mkdirSync, rmdirSync, statSync, writeFileSync } from "fs";
|
|
2
|
+
import { writeFile } from "fs/promises";
|
|
3
|
+
import { dirname, resolve } from "path";
|
|
4
|
+
import { html2pdf, img2pdf, pdf2img } from "src";
|
|
5
|
+
import { fileURLToPath } from "url";
|
|
6
|
+
const __filename = fileURLToPath(import.meta.url);
|
|
7
|
+
const __dirname = dirname(__filename);
|
|
8
|
+
const isDirectory = (dirPath) => {
|
|
9
|
+
try {
|
|
10
|
+
const stats = statSync(dirPath);
|
|
11
|
+
return stats.isDirectory();
|
|
12
|
+
}
|
|
13
|
+
catch (err) {
|
|
14
|
+
return false;
|
|
15
|
+
}
|
|
16
|
+
};
|
|
17
|
+
if (!isDirectory(resolve(__dirname, "../test-assets"))) {
|
|
18
|
+
mkdirSync(resolve(__dirname, "../test-assets"));
|
|
19
|
+
}
|
|
20
|
+
const pdf = "https://www.orimi.com/pdf-test.pdf";
|
|
21
|
+
pdf2img(pdf)
|
|
22
|
+
.then(async (res) => {
|
|
23
|
+
let index = 1;
|
|
24
|
+
for (const page of res.pages) {
|
|
25
|
+
writeFileSync(resolve(__dirname, `../test-assets/test-${index}.png`), page);
|
|
26
|
+
index++;
|
|
27
|
+
}
|
|
28
|
+
})
|
|
29
|
+
.then(() => {
|
|
30
|
+
return img2pdf(resolve(__dirname, "../test-assets/test-1.png"), {
|
|
31
|
+
header: "Header",
|
|
32
|
+
footer: "Footer"
|
|
33
|
+
});
|
|
34
|
+
})
|
|
35
|
+
.then(async (res) => {
|
|
36
|
+
writeFile(resolve(__dirname, `../test-assets/test-img.pdf`), res);
|
|
37
|
+
})
|
|
38
|
+
.then(() => {
|
|
39
|
+
return html2pdf("<h1>Hello World</h1>");
|
|
40
|
+
})
|
|
41
|
+
.then(async (res) => {
|
|
42
|
+
writeFile(resolve(__dirname, `../test-assets/test-html.pdf`), res);
|
|
43
|
+
})
|
|
44
|
+
.catch(e => {
|
|
45
|
+
console.error(e);
|
|
46
|
+
process.exit(1);
|
|
47
|
+
})
|
|
48
|
+
.finally(() => {
|
|
49
|
+
rmdirSync(resolve(__dirname, "../test-assets"), { recursive: true });
|
|
50
|
+
});
|
|
51
|
+
//# sourceMappingURL=test.js.map
|
package/dist/test.js.map
ADDED
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"test.js","sourceRoot":"","sources":["../src/test.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,SAAS,EAAE,SAAS,EAAE,QAAQ,EAAE,aAAa,EAAE,MAAM,IAAI,CAAA;AAClE,OAAO,EAAE,SAAS,EAAE,MAAM,aAAa,CAAA;AACvC,OAAO,EAAE,OAAO,EAAE,OAAO,EAAE,MAAM,MAAM,CAAA;AACvC,OAAO,EAAE,QAAQ,EAAE,OAAO,EAAE,OAAO,EAAE,MAAM,KAAK,CAAA;AAChD,OAAO,EAAE,aAAa,EAAE,MAAM,KAAK,CAAA;AAEnC,MAAM,UAAU,GAAG,aAAa,CAAG,MAAM,CAAC,IAAI,CAAC,GAAG,CAAE,CAAA;AACpD,MAAM,SAAS,GAAG,OAAO,CAAG,UAAU,CAAE,CAAA;AAQxC,MAAM,WAAW,GAAG,CAAE,OAAe,EAAY,EAAE;IACjD,IAAI,CAAC;QACH,MAAM,KAAK,GAAG,QAAQ,CAAG,OAAO,CAAE,CAAA;QAClC,OAAO,KAAK,CAAC,WAAW,EAAI,CAAA;IAC9B,CAAC;IAAC,OAAS,GAAG,EAAG,CAAC;QAChB,OAAO,KAAK,CAAA;IACd,CAAC;AACH,CAAC,CAAA;AAED,IAAK,CAAC,WAAW,CAAG,OAAO,CAAG,SAAS,EAAE,gBAAgB,CAAE,CAAE,EAAG,CAAC;IAC/D,SAAS,CAAG,OAAO,CAAG,SAAS,EAAE,gBAAgB,CAAE,CAAE,CAAA;AACvD,CAAC;AAED,MAAM,GAAG,GAAG,oCAAoC,CAAA;AAEhD,OAAO,CAAG,GAAG,CAAE;KACd,IAAI,CAAG,KAAK,EAAC,GAAG,EAAC,EAAE;IAClB,IAAI,KAAK,GAAG,CAAC,CAAA;IACb,KAAM,MAAM,IAAI,IAAI,GAAG,CAAC,KAAK,EAAG,CAAC;QAC/B,aAAa,CAAG,OAAO,CAAG,SAAS,EAAE,uBAAuB,KAAK,MAAM,CAAE,EAAE,IAAI,CAAE,CAAA;QACjF,KAAK,EAAE,CAAA;IACT,CAAC;AACH,CAAC,CAAE;KACF,IAAI,CAAG,GAAI,EAAE;IACZ,OAAO,OAAO,CAAG,OAAO,CAAG,SAAS,EAAE,2BAA2B,CAAE,EAAE;QACnE,MAAM,EAAE,QAAQ;QAChB,MAAM,EAAE,QAAQ;KACjB,CAAE,CAAA;AACL,CAAC,CAAE;KACF,IAAI,CAAG,KAAK,EAAC,GAAG,EAAC,EAAE;IAClB,SAAS,CAAG,OAAO,CAAG,SAAS,EAAE,6BAA6B,CAAE,EAAE,GAAG,CAAE,CAAA;AACzE,CAAC,CAAE;KACF,IAAI,CAAG,GAAI,EAAE;IACZ,OAAO,QAAQ,CAAG,sBAAsB,CAAE,CAAA;AAC5C,CAAC,CAAE;KACF,IAAI,CAAG,KAAK,EAAC,GAAG,EAAC,EAAE;IAClB,SAAS,CAAG,OAAO,CAAG,SAAS,EAAE,8BAA8B,CAAE,EAAE,GAAG,CAAE,CAAA;AAC1E,CAAC,CAAE;KACF,KAAK,CAAG,CAAC,CAAC,EAAE;IACX,OAAO,CAAC,KAAK,CAAG,CAAC,CAAE,CAAA;IACnB,OAAO,CAAC,IAAI,CAAG,CAAC,CAAE,CAAA;AACpB,CAAC,CAAE;KACF,OAAO,CAAG,GAAI,EAAE;IACf,SAAS,CAAG,OAAO,CAAG,SAAS,EAAE,gBAAgB,CAAE,EAAE,EAAE,SAAS,EAAE,IAAI,EAAE,CAAE,CAAA;AAC5E,CAAC,CAAE,CAAA"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"root":["../src/canvas.ts","../src/index.ts","../src/test.ts","../src/utilies.ts","../src/modules/html2pdf.ts","../src/modules/img2pdf.ts","../src/modules/pdf2img.ts"],"version":"5.6.3"}
|
package/dist/utilies.js
ADDED
|
@@ -0,0 +1,37 @@
|
|
|
1
|
+
import { existsSync, readFileSync } from "fs";
|
|
2
|
+
export async function getBuffer(input) {
|
|
3
|
+
if (input instanceof Buffer) {
|
|
4
|
+
return input;
|
|
5
|
+
}
|
|
6
|
+
return fetch(input.toString())
|
|
7
|
+
.then(res => {
|
|
8
|
+
if (res.ok) {
|
|
9
|
+
return res.arrayBuffer();
|
|
10
|
+
}
|
|
11
|
+
else {
|
|
12
|
+
console.error("ERROR: Failed to Fetch the File");
|
|
13
|
+
process.exit(1);
|
|
14
|
+
}
|
|
15
|
+
})
|
|
16
|
+
.then(array => Buffer.from(array))
|
|
17
|
+
.catch(() => {
|
|
18
|
+
if (existsSync(input.toString())) {
|
|
19
|
+
return readFileSync(input.toString());
|
|
20
|
+
}
|
|
21
|
+
else {
|
|
22
|
+
console.error(`ERROR: '${input.toString()}' Not Found`);
|
|
23
|
+
process.exit(1);
|
|
24
|
+
}
|
|
25
|
+
});
|
|
26
|
+
}
|
|
27
|
+
export const fetchHtmlFromUrl = async (url) => {
|
|
28
|
+
const response = await fetch(url);
|
|
29
|
+
if (!response.ok) {
|
|
30
|
+
throw new Error(`Failed to fetch content from URL: ${url}`);
|
|
31
|
+
}
|
|
32
|
+
return await response.text();
|
|
33
|
+
};
|
|
34
|
+
export const readHtmlFromFilePath = async (filePath) => {
|
|
35
|
+
return readFileSync(filePath, "utf-8");
|
|
36
|
+
};
|
|
37
|
+
//# sourceMappingURL=utilies.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"utilies.js","sourceRoot":"","sources":["../src/utilies.ts"],"names":[],"mappings":"AAIA,OAAO,EAAE,UAAU,EAAE,YAAY,EAAE,MAAM,IAAI,CAAA;AAY7C,MAAM,CAAC,KAAK,UAAU,SAAS,CAAG,KAA4B;IAC5D,IAAK,KAAK,YAAY,MAAM,EAAG,CAAC;QAC9B,OAAO,KAAK,CAAA;IACd,CAAC;IAED,OAAO,KAAK,CAAG,KAAK,CAAC,QAAQ,EAAI,CAAE;SAChC,IAAI,CAAG,GAAG,CAAC,EAAE;QACZ,IAAK,GAAG,CAAC,EAAE,EAAG,CAAC;YACb,OAAO,GAAG,CAAC,WAAW,EAAI,CAAA;QAC5B,CAAC;aAAM,CAAC;YACN,OAAO,CAAC,KAAK,CAAG,iCAAiC,CAAE,CAAA;YACnD,OAAO,CAAC,IAAI,CAAG,CAAC,CAAE,CAAA;QACpB,CAAC;IACH,CAAC,CAAE;SACF,IAAI,CAAG,KAAK,CAAC,EAAE,CAAC,MAAM,CAAC,IAAI,CAAG,KAAK,CAAE,CAAE;SACvC,KAAK,CAAG,GAAI,EAAE;QACb,IAAK,UAAU,CAAG,KAAK,CAAC,QAAQ,EAAI,CAAE,EAAG,CAAC;YACxC,OAAO,YAAY,CAAG,KAAK,CAAC,QAAQ,EAAI,CAAE,CAAA;QAC5C,CAAC;aAAM,CAAC;YACN,OAAO,CAAC,KAAK,CAAG,WAAW,KAAK,CAAC,QAAQ,EAAI,aAAa,CAAE,CAAA;YAC5D,OAAO,CAAC,IAAI,CAAG,CAAC,CAAE,CAAA;QACpB,CAAC;IACH,CAAC,CAAE,CAAA;AACP,CAAC;AASD,MAAM,CAAC,MAAM,gBAAgB,GAAG,KAAK,EAAG,GAAW,EAAG,EAAE;IACtD,MAAM,QAAQ,GAAG,MAAM,KAAK,CAAG,GAAG,CAAE,CAAA;IACpC,IAAK,CAAC,QAAQ,CAAC,EAAE,EAAG,CAAC;QACnB,MAAM,IAAI,KAAK,CAAG,qCAAqC,GAAG,EAAE,CAAE,CAAA;IAChE,CAAC;IACD,OAAO,MAAM,QAAQ,CAAC,IAAI,EAAI,CAAA;AAChC,CAAC,CAAA;AASD,MAAM,CAAC,MAAM,oBAAoB,GAAG,KAAK,EAAG,QAAgB,EAAG,EAAE;IAC/D,OAAO,YAAY,CAAG,QAAQ,EAAE,OAAO,CAAE,CAAA;AAC3C,CAAC,CAAA"}
|
package/package.json
ADDED
|
@@ -0,0 +1,57 @@
|
|
|
1
|
+
{
|
|
2
|
+
"name": "@iqx-limited/quick-pdf",
|
|
3
|
+
"version": "1.0.0",
|
|
4
|
+
"author": "IQX",
|
|
5
|
+
"description": "Converting PDFs to images (📃 to 📸)",
|
|
6
|
+
"exports": "./dist/index.js",
|
|
7
|
+
"types": "dist/index.d.ts",
|
|
8
|
+
"type": "module",
|
|
9
|
+
"license": "MIT",
|
|
10
|
+
"files": [
|
|
11
|
+
"dist/**/*",
|
|
12
|
+
"README.md",
|
|
13
|
+
"LICENSE"
|
|
14
|
+
],
|
|
15
|
+
"main": "dist/index.js",
|
|
16
|
+
"keywords": [
|
|
17
|
+
"pdf",
|
|
18
|
+
"jpeg",
|
|
19
|
+
"html",
|
|
20
|
+
"png",
|
|
21
|
+
"img",
|
|
22
|
+
"pdf-to-img",
|
|
23
|
+
"pdf-to-png",
|
|
24
|
+
"pdf-to-jpeg",
|
|
25
|
+
"html-to-pdf"
|
|
26
|
+
],
|
|
27
|
+
"repository": "https://github.com/IQXLimited/quickpdf",
|
|
28
|
+
"scripts": {
|
|
29
|
+
"build": "npx tsc --build",
|
|
30
|
+
"lint": "npx --yes eslint",
|
|
31
|
+
"test": "npx --yes tsx ./src/test.ts"
|
|
32
|
+
},
|
|
33
|
+
"engines": {
|
|
34
|
+
"node": ">=22.0.0"
|
|
35
|
+
},
|
|
36
|
+
"engineStrict": true,
|
|
37
|
+
"dependencies": {
|
|
38
|
+
"file-type": "^19.6.0",
|
|
39
|
+
"html-validate": "^8.24.2",
|
|
40
|
+
"image-size": "^1.1.1",
|
|
41
|
+
"pdfjs-dist": "^4.8.69",
|
|
42
|
+
"pdfkit": "^0.15.1",
|
|
43
|
+
"playwright": "^1.48.2",
|
|
44
|
+
"semver": "^7.6.3",
|
|
45
|
+
"skia-canvas": "^1.0.2"
|
|
46
|
+
},
|
|
47
|
+
"devDependencies": {
|
|
48
|
+
"@stylistic/eslint-plugin": "^2.10.1",
|
|
49
|
+
"@types/node": "^22.9.0",
|
|
50
|
+
"@types/pdfjs-dist": "2.10.377",
|
|
51
|
+
"@types/pdfkit": "^0.13.5",
|
|
52
|
+
"@types/semver": "^7.5.8",
|
|
53
|
+
"eslint": "^9.14.0",
|
|
54
|
+
"typescript": "^5.2.2",
|
|
55
|
+
"typescript-eslint": "^8.13.0"
|
|
56
|
+
}
|
|
57
|
+
}
|