feat(now supports pdf -> jpg): update
This commit is contained in:
parent
fe6be928a9
commit
d157a3acd9
20
package.json
20
package.json
@ -18,22 +18,24 @@
|
|||||||
"@gitzone/tsdoc": "^1.1.12",
|
"@gitzone/tsdoc": "^1.1.12",
|
||||||
"@gitzone/tsrun": "^1.2.44",
|
"@gitzone/tsrun": "^1.2.44",
|
||||||
"@gitzone/tstest": "^1.0.77",
|
"@gitzone/tstest": "^1.0.77",
|
||||||
"@push.rocks/tapbundle": "^5.0.12",
|
"@push.rocks/tapbundle": "^5.0.23",
|
||||||
"@types/node": "^20.4.5"
|
"@types/node": "^20.12.7"
|
||||||
},
|
},
|
||||||
"dependencies": {
|
"dependencies": {
|
||||||
|
"@push.rocks/smartbuffer": "^3.0.4",
|
||||||
"@push.rocks/smartdelay": "^3.0.5",
|
"@push.rocks/smartdelay": "^3.0.5",
|
||||||
"@push.rocks/smartfile": "^10.0.28",
|
"@push.rocks/smartfile": "^11.0.14",
|
||||||
"@push.rocks/smartnetwork": "^3.0.0",
|
"@push.rocks/smartnetwork": "^3.0.0",
|
||||||
"@push.rocks/smartpath": "^5.0.11",
|
"@push.rocks/smartpath": "^5.0.18",
|
||||||
"@push.rocks/smartpromise": "^4.0.3",
|
"@push.rocks/smartpromise": "^4.0.3",
|
||||||
"@push.rocks/smartpuppeteer": "^2.0.2",
|
"@push.rocks/smartpuppeteer": "^2.0.2",
|
||||||
"@push.rocks/smartunique": "^3.0.3",
|
"@push.rocks/smartunique": "^3.0.9",
|
||||||
"@tsclass/tsclass": "^4.0.42",
|
"@tsclass/tsclass": "^4.0.54",
|
||||||
"@types/express": "^4.17.17",
|
"@types/express": "^4.17.21",
|
||||||
"express": "^4.18.1",
|
"express": "^4.19.2",
|
||||||
"pdf-lib": "^1.17.1",
|
"pdf-lib": "^1.17.1",
|
||||||
"pdf2json": "^2.0.0"
|
"pdf2json": "^3.0.5",
|
||||||
|
"pdf2pic": "^3.1.1"
|
||||||
},
|
},
|
||||||
"files": [
|
"files": [
|
||||||
"ts/**/*",
|
"ts/**/*",
|
||||||
|
1296
pnpm-lock.yaml
generated
1296
pnpm-lock.yaml
generated
File diff suppressed because it is too large
Load Diff
10
test/test.ts
10
test/test.ts
@ -43,16 +43,22 @@ tap.test('should create a valid PDFResult', async () => {
|
|||||||
await writePDfToDisk('https://layer.io', '2.pdf');
|
await writePDfToDisk('https://layer.io', '2.pdf');
|
||||||
});
|
});
|
||||||
|
|
||||||
tap.test('should combine pdfs', async () => {
|
tap.test('should merge pdfs', async () => {
|
||||||
const fs = await import('fs');
|
const fs = await import('fs');
|
||||||
const pdf1 = await testSmartPdf.readFileToPdfObject('.nogit/1.pdf');
|
const pdf1 = await testSmartPdf.readFileToPdfObject('.nogit/1.pdf');
|
||||||
const pdf2 = await testSmartPdf.readFileToPdfObject('.nogit/2.pdf');
|
const pdf2 = await testSmartPdf.readFileToPdfObject('.nogit/2.pdf');
|
||||||
fs.writeFileSync(
|
fs.writeFileSync(
|
||||||
`.nogit/combined.pdf`,
|
`.nogit/combined.pdf`,
|
||||||
(await testSmartPdf.mergePdfs([pdf1, pdf2])).buffer as Buffer
|
await testSmartPdf.mergePdfs([pdf1.buffer, pdf2.buffer])
|
||||||
);
|
);
|
||||||
});
|
});
|
||||||
|
|
||||||
|
tap.test('should create images from an pdf', async () => {
|
||||||
|
const pdfObject = await testSmartPdf.readFileToPdfObject('.nogit/combined.pdf');
|
||||||
|
const images = await testSmartPdf.convertPDFToJPGBytes(pdfObject.buffer);
|
||||||
|
console.log(images);
|
||||||
|
});
|
||||||
|
|
||||||
tap.test('should be able to close properly', async () => {
|
tap.test('should be able to close properly', async () => {
|
||||||
await testSmartPdf.stop();
|
await testSmartPdf.stop();
|
||||||
});
|
});
|
||||||
|
@ -3,6 +3,6 @@
|
|||||||
*/
|
*/
|
||||||
export const commitinfo = {
|
export const commitinfo = {
|
||||||
name: '@push.rocks/smartpdf',
|
name: '@push.rocks/smartpdf',
|
||||||
version: '3.0.17',
|
version: '3.1.0',
|
||||||
description: 'create pdfs on the fly'
|
description: 'A library for creating PDFs dynamically from HTML or websites with additional features like merging PDFs.'
|
||||||
}
|
}
|
||||||
|
@ -183,18 +183,16 @@ export class SmartPdf {
|
|||||||
};
|
};
|
||||||
}
|
}
|
||||||
|
|
||||||
public async mergePdfs(pdfArrayArg: plugins.tsclass.business.IPdf[]): Promise<IPdf> {
|
public async mergePdfs(inputPdfBuffers: Uint8Array[]): Promise<Uint8Array> {
|
||||||
const merger = new plugins.pdfMerger();
|
const mergedPdf = await plugins.pdfLib.PDFDocument.create();
|
||||||
for (const pdf of pdfArrayArg) {
|
for (const pdfBytes of inputPdfBuffers) {
|
||||||
merger.add(Buffer.from(pdf.buffer));
|
const pdfDoc = await plugins.pdfLib.PDFDocument.load(pdfBytes);
|
||||||
|
const pages = await mergedPdf.copyPages(pdfDoc, pdfDoc.getPageIndices());
|
||||||
|
pages.forEach((page) => mergedPdf.addPage(page));
|
||||||
}
|
}
|
||||||
const resultBuffer = await merger.saveAsBuffer();
|
|
||||||
return {
|
const mergedPdfBytes = await mergedPdf.save();
|
||||||
name: 'mergedPdf',
|
return mergedPdfBytes;
|
||||||
buffer: resultBuffer,
|
|
||||||
id: null,
|
|
||||||
metadata: null,
|
|
||||||
};
|
|
||||||
}
|
}
|
||||||
|
|
||||||
public async readFileToPdfObject(pathArg: string): Promise<plugins.tsclass.business.IPdf> {
|
public async readFileToPdfObject(pathArg: string): Promise<plugins.tsclass.business.IPdf> {
|
||||||
@ -226,4 +224,39 @@ export class SmartPdf {
|
|||||||
pdfParser.parseBuffer(pdfBufferArg);
|
pdfParser.parseBuffer(pdfBufferArg);
|
||||||
return deferred.promise;
|
return deferred.promise;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
public async convertPDFToJPGBytes(
|
||||||
|
pdfBytes: Uint8Array,
|
||||||
|
options: {
|
||||||
|
width?: number;
|
||||||
|
height?: number;
|
||||||
|
quality?: number;
|
||||||
|
} = {}
|
||||||
|
): Promise<Uint8Array[]> {
|
||||||
|
const { width = 1024, height = 768, quality = 100 } = options;
|
||||||
|
|
||||||
|
// Load the PDF document
|
||||||
|
const pdfDoc = await plugins.pdfLib.PDFDocument.load(pdfBytes);
|
||||||
|
|
||||||
|
const converter = plugins.pdf2pic.fromBuffer(Buffer.from(pdfBytes), {
|
||||||
|
density: 100, // Image density (DPI)
|
||||||
|
format: 'jpg', // Image format
|
||||||
|
width, // Output image width
|
||||||
|
height, // Output image height
|
||||||
|
quality, // Output image quality
|
||||||
|
});
|
||||||
|
|
||||||
|
// Get array promises that resolve to JPG buffers
|
||||||
|
const imagePromises: Promise<Buffer>[] = [];
|
||||||
|
const numPages = pdfDoc.getPageCount();
|
||||||
|
|
||||||
|
for (let i = 0; i < numPages; i++) {
|
||||||
|
imagePromises.push(converter(i + 1, {
|
||||||
|
responseType: 'buffer',
|
||||||
|
}).then((output) => output.buffer));
|
||||||
|
}
|
||||||
|
|
||||||
|
// Resolve all promises and return the array of buffers
|
||||||
|
return Promise.all(imagePromises);
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
@ -5,6 +5,7 @@ import * as path from 'path';
|
|||||||
export { http, path };
|
export { http, path };
|
||||||
|
|
||||||
// @pushrocks
|
// @pushrocks
|
||||||
|
import * as smartbuffer from '@push.rocks/smartbuffer';
|
||||||
import * as smartfile from '@push.rocks/smartfile';
|
import * as smartfile from '@push.rocks/smartfile';
|
||||||
import * as smartdelay from '@push.rocks/smartdelay';
|
import * as smartdelay from '@push.rocks/smartdelay';
|
||||||
import * as smartpromise from '@push.rocks/smartpromise';
|
import * as smartpromise from '@push.rocks/smartpromise';
|
||||||
@ -14,6 +15,7 @@ import * as smartnetwork from '@push.rocks/smartnetwork';
|
|||||||
import * as smartunique from '@push.rocks/smartunique';
|
import * as smartunique from '@push.rocks/smartunique';
|
||||||
|
|
||||||
export {
|
export {
|
||||||
|
smartbuffer,
|
||||||
smartfile,
|
smartfile,
|
||||||
smartdelay,
|
smartdelay,
|
||||||
smartpromise,
|
smartpromise,
|
||||||
@ -29,9 +31,9 @@ import * as tsclass from '@tsclass/tsclass';
|
|||||||
export { tsclass };
|
export { tsclass };
|
||||||
|
|
||||||
// thirdparty
|
// thirdparty
|
||||||
import pdfMerger from 'pdf-merger-js';
|
|
||||||
// @ts-ignore
|
|
||||||
import pdf2json from 'pdf2json';
|
|
||||||
import express from 'express';
|
import express from 'express';
|
||||||
|
import pdf2json from 'pdf2json';
|
||||||
|
import pdf2pic from 'pdf2pic';
|
||||||
|
import pdfLib from 'pdf-lib';
|
||||||
|
|
||||||
export { pdfMerger, pdf2json, express };
|
export { express, pdf2json, pdf2pic, pdfLib, };
|
||||||
|
Loading…
Reference in New Issue
Block a user