Compare commits
45 Commits
Author | SHA1 | Date | |
---|---|---|---|
4f93d258b8 | |||
60993fc005 | |||
db4965c8f5 | |||
36a964d931 | |||
6d90f4c9b4 | |||
839eafd73f | |||
f4141bf201 | |||
5a46028053 | |||
18d26647e1 | |||
0b5ec86780 | |||
5e15729045 | |||
c98a5f1ac3 | |||
7f02146a0e | |||
5dab8c7351 | |||
505e0e9a30 | |||
9e3510955a | |||
c006d4fbc7 | |||
5e02c44647 | |||
47f7cb18b5 | |||
3faf065c66 | |||
dfffd03790 | |||
796aa905d2 | |||
253fb95143 | |||
f3ea075b72 | |||
af725a7f78 | |||
016e0db797 | |||
4cf8b2e1f8 | |||
67b0aa9d47 | |||
567c6eafea | |||
ff890fb2af | |||
a512fd64b5 | |||
377318a62a | |||
671c871304 | |||
e0cc6b5655 | |||
e74b44b49c | |||
d6f0d88d4a | |||
9674e5b8dc | |||
ea4cf777a9 | |||
8a308fa9e3 | |||
56fa53b701 | |||
2a4ddd4e41 | |||
3d8a63fddd | |||
9d9b1d0399 | |||
739d60d410 | |||
9003034d0d |
9
.snyk
9
.snyk
@ -1,9 +0,0 @@
|
|||||||
# Snyk (https://snyk.io) policy file, patches or ignores known vulnerabilities.
|
|
||||||
version: v1.13.5
|
|
||||||
# ignores vulnerabilities until expiry date; change duration by modifying expiry date
|
|
||||||
ignore:
|
|
||||||
SNYK-JS-LODASH-450202:
|
|
||||||
- '@pushrocks/smartnetwork > portscanner > async > lodash':
|
|
||||||
reason: None given
|
|
||||||
expires: '2019-09-13T09:39:26.276Z'
|
|
||||||
patch: {}
|
|
20272
package-lock.json
generated
20272
package-lock.json
generated
File diff suppressed because it is too large
Load Diff
34
package.json
34
package.json
@ -1,33 +1,37 @@
|
|||||||
{
|
{
|
||||||
"name": "@pushrocks/smartpdf",
|
"name": "@pushrocks/smartpdf",
|
||||||
"version": "2.0.6",
|
"version": "3.0.9",
|
||||||
"private": false,
|
"private": false,
|
||||||
"description": "create pdfs on the fly",
|
"description": "create pdfs on the fly",
|
||||||
"main": "dist_ts/index.js",
|
"main": "dist_ts/index.js",
|
||||||
"typings": "dist_ts/index.d.ts",
|
"typings": "dist_ts/index.d.ts",
|
||||||
|
"type": "module",
|
||||||
"author": "Lossless GmbH",
|
"author": "Lossless GmbH",
|
||||||
"license": "MIT",
|
"license": "MIT",
|
||||||
"scripts": {
|
"scripts": {
|
||||||
"test": "(tstest test/ --web)",
|
"test": "(tstest test/ --web)",
|
||||||
"build": "(tsbuild --web)"
|
"build": "(tsbuild --web --allowimplicitany)"
|
||||||
},
|
},
|
||||||
"devDependencies": {
|
"devDependencies": {
|
||||||
"@gitzone/tsbuild": "^2.1.25",
|
"@gitzone/tsbuild": "^2.1.65",
|
||||||
"@gitzone/tsrun": "^1.2.12",
|
"@gitzone/tsrun": "^1.2.35",
|
||||||
"@gitzone/tstest": "^1.0.52",
|
"@gitzone/tstest": "^1.0.73",
|
||||||
"@pushrocks/tapbundle": "^3.2.14",
|
"@pushrocks/tapbundle": "^5.0.4",
|
||||||
"@types/node": "^14.14.37",
|
"@types/node": "^18.7.14"
|
||||||
"tslint": "^6.1.3",
|
|
||||||
"tslint-config-prettier": "^1.18.0"
|
|
||||||
},
|
},
|
||||||
"dependencies": {
|
"dependencies": {
|
||||||
"@pushrocks/smartfile": "^8.0.9",
|
"@pushrocks/smartdelay": "^2.0.13",
|
||||||
"@pushrocks/smartnetwork": "^2.0.4",
|
"@pushrocks/smartfile": "^10.0.5",
|
||||||
"@pushrocks/smartpromise": "^3.1.3",
|
"@pushrocks/smartnetwork": "^3.0.0",
|
||||||
"@pushrocks/smartpuppeteer": "^1.0.21",
|
"@pushrocks/smartpath": "^5.0.5",
|
||||||
|
"@pushrocks/smartpromise": "^3.1.7",
|
||||||
|
"@pushrocks/smartpuppeteer": "^2.0.2",
|
||||||
"@pushrocks/smartunique": "^3.0.3",
|
"@pushrocks/smartunique": "^3.0.3",
|
||||||
"@types/express": "^4.17.11",
|
"@tsclass/tsclass": "^4.0.19",
|
||||||
"express": "^4.17.1"
|
"@types/express": "^4.17.13",
|
||||||
|
"express": "^4.18.1",
|
||||||
|
"pdf-merger-js": "^4.1.0",
|
||||||
|
"pdf2json": "^2.0.0"
|
||||||
},
|
},
|
||||||
"files": [
|
"files": [
|
||||||
"ts/**/*",
|
"ts/**/*",
|
||||||
|
@ -29,7 +29,6 @@ Platform support | [ or [contribute monthly](https://lossless.link/contribute). :)
|
We are always happy for code contributions. If you are not the code contributing type that is ok. Still, maintaining Open Source repositories takes considerable time and thought. If you like the quality of what we do and our modules are useful to you we would appreciate a little monthly contribution: You can [contribute one time](https://lossless.link/contribute-onetime) or [contribute monthly](https://lossless.link/contribute). :)
|
||||||
|
|
||||||
|
|
||||||
## Contribution
|
## Contribution
|
||||||
|
|
||||||
We are always happy for code contributions. If you are not the code contributing type that is ok. Still, maintaining Open Source repositories takes considerable time and thought. If you like the quality of what we do and our modules are useful to you we would appreciate a little monthly contribution: You can [contribute one time](https://lossless.link/contribute-onetime) or [contribute monthly](https://lossless.link/contribute). :)
|
We are always happy for code contributions. If you are not the code contributing type that is ok. Still, maintaining Open Source repositories takes considerable time and thought. If you like the quality of what we do and our modules are useful to you we would appreciate a little monthly contribution: You can [contribute one time](https://lossless.link/contribute-onetime) or [contribute monthly](https://lossless.link/contribute). :)
|
||||||
|
38
test/test.ts
38
test/test.ts
@ -1,11 +1,11 @@
|
|||||||
import { expect, tap } from '@pushrocks/tapbundle';
|
import { expect, tap } from '@pushrocks/tapbundle';
|
||||||
import * as smartpdf from '../ts/index';
|
import * as smartpdf from '../ts/index.js';
|
||||||
|
|
||||||
let testSmartPdf: smartpdf.SmartPdf;
|
let testSmartPdf: smartpdf.SmartPdf;
|
||||||
|
|
||||||
tap.test('should create a valid instance of smartpdf', async () => {
|
tap.test('should create a valid instance of smartpdf', async () => {
|
||||||
testSmartPdf = new smartpdf.SmartPdf();
|
testSmartPdf = new smartpdf.SmartPdf();
|
||||||
expect(testSmartPdf).to.be.instanceof(smartpdf.SmartPdf);
|
expect(testSmartPdf).toBeInstanceOf(smartpdf.SmartPdf);
|
||||||
});
|
});
|
||||||
|
|
||||||
tap.test('should start the instance', async () => {
|
tap.test('should start the instance', async () => {
|
||||||
@ -13,7 +13,11 @@ tap.test('should start the instance', async () => {
|
|||||||
});
|
});
|
||||||
|
|
||||||
tap.test('should create a pdf from html string', async () => {
|
tap.test('should create a pdf from html string', async () => {
|
||||||
await testSmartPdf.getPdfResultForHtmlString('hi');
|
await testSmartPdf.getA4PdfResultForHtmlString('hi');
|
||||||
|
});
|
||||||
|
|
||||||
|
tap.test('should create a pdf from html string', async () => {
|
||||||
|
await testSmartPdf.getA4PdfResultForHtmlString('hi');
|
||||||
});
|
});
|
||||||
|
|
||||||
tap.test('should create a pdf from website as A4', async () => {
|
tap.test('should create a pdf from website as A4', async () => {
|
||||||
@ -25,18 +29,28 @@ tap.test('should create a pdf from website as single page PDF', async () => {
|
|||||||
});
|
});
|
||||||
|
|
||||||
tap.test('should create a valid PDFResult', async () => {
|
tap.test('should create a valid PDFResult', async () => {
|
||||||
const pdfResult = await testSmartPdf.getFullWebsiteAsSinglePdf(
|
const writePDfToDisk = async (urlArg: string, fileName: string) => {
|
||||||
'https://maintainedby.lossless.com'
|
const pdfResult = await testSmartPdf.getFullWebsiteAsSinglePdf(urlArg);
|
||||||
);
|
expect(pdfResult.buffer).toBeInstanceOf(Buffer);
|
||||||
expect(pdfResult.buffer).to.be.instanceOf(Buffer);
|
const fs = await import('fs');
|
||||||
const fs = await import('fs');
|
|
||||||
|
|
||||||
if (!fs.existsSync('.nogit/')) {
|
if (!fs.existsSync('.nogit/')) {
|
||||||
fs.mkdirSync('.nogit/');
|
fs.mkdirSync('.nogit/');
|
||||||
}
|
}
|
||||||
fs.writeFileSync('.nogit/sample.pdf', pdfResult.buffer);
|
fs.writeFileSync(`.nogit/${fileName}`, pdfResult.buffer as Buffer);
|
||||||
|
};
|
||||||
|
await writePDfToDisk('https://maintainedby.lossless.com/', '1.pdf')
|
||||||
|
await writePDfToDisk('https://rendertron.lossless.one/render/https://layer.io', '2.pdf')
|
||||||
});
|
});
|
||||||
|
|
||||||
|
tap.test('should combine pdfs', async () => {
|
||||||
|
const fs = await import('fs');
|
||||||
|
const pdf1 = await testSmartPdf.readFileToPdfObject('.nogit/1.pdf');
|
||||||
|
const pdf2 = await testSmartPdf.readFileToPdfObject('.nogit/2.pdf');
|
||||||
|
fs.writeFileSync(`.nogit/combined.pdf`, (await testSmartPdf.mergePdfs([pdf1, pdf2])).buffer as Buffer);
|
||||||
|
|
||||||
|
})
|
||||||
|
|
||||||
tap.test('should be able to close properly', async () => {
|
tap.test('should be able to close properly', async () => {
|
||||||
await testSmartPdf.stop();
|
await testSmartPdf.stop();
|
||||||
});
|
});
|
||||||
|
8
ts/00_commitinfo_data.ts
Normal file
8
ts/00_commitinfo_data.ts
Normal file
@ -0,0 +1,8 @@
|
|||||||
|
/**
|
||||||
|
* autocreated commitinfo by @pushrocks/commitinfo
|
||||||
|
*/
|
||||||
|
export const commitinfo = {
|
||||||
|
name: '@pushrocks/smartpdf',
|
||||||
|
version: '3.0.9',
|
||||||
|
description: 'create pdfs on the fly'
|
||||||
|
}
|
@ -6,4 +6,4 @@ declare global {
|
|||||||
}
|
}
|
||||||
|
|
||||||
// normal
|
// normal
|
||||||
export * from './smartpdf.classes.smartpdf';
|
export * from './smartpdf.classes.smartpdf.js';
|
||||||
|
@ -1 +0,0 @@
|
|||||||
export * from './interface.pdfresult';
|
|
@ -1,5 +0,0 @@
|
|||||||
export interface IPdfResult {
|
|
||||||
name: string;
|
|
||||||
id: string;
|
|
||||||
buffer: Buffer;
|
|
||||||
}
|
|
@ -1,8 +1,15 @@
|
|||||||
import * as plugins from './smartpdf.plugins';
|
/*
|
||||||
|
* pdf candidate is a construct used internally for mapping html
|
||||||
|
* to pdf buffers delivered by puppeteer
|
||||||
|
*/
|
||||||
|
import * as plugins from './smartpdf.plugins.js';
|
||||||
|
|
||||||
export class PdfCandidate {
|
export class PdfCandidate {
|
||||||
pdfId = plugins.smartunique.shortId();
|
public htmlString: string;
|
||||||
doneDeferred = plugins.smartpromise.defer();
|
public pdfId = plugins.smartunique.shortId();
|
||||||
|
public doneDeferred = plugins.smartpromise.defer();
|
||||||
|
|
||||||
constructor(public htmlString) {}
|
constructor(htmlStringArg: string) {
|
||||||
|
this.htmlString = htmlStringArg;
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
@ -1,13 +1,19 @@
|
|||||||
import * as plugins from './smartpdf.plugins';
|
import * as plugins from './smartpdf.plugins.js';
|
||||||
import * as paths from './smartpdf.paths';
|
import * as paths from './smartpdf.paths.js';
|
||||||
import { Server } from 'http';
|
import { Server } from 'http';
|
||||||
import { PdfCandidate } from './smartpdf.classes.pdfcandidate';
|
import { PdfCandidate } from './smartpdf.classes.pdfcandidate.js';
|
||||||
|
import { IPdf } from '@tsclass/tsclass/dist_ts/business/pdf.js';
|
||||||
|
|
||||||
declare const document;
|
declare const document: any;
|
||||||
|
|
||||||
import * as interfaces from './interfaces';
|
|
||||||
|
|
||||||
export class SmartPdf {
|
export class SmartPdf {
|
||||||
|
// STATIC
|
||||||
|
public static async create() {
|
||||||
|
const smartpdfInstance = new SmartPdf();
|
||||||
|
return smartpdfInstance;
|
||||||
|
}
|
||||||
|
|
||||||
|
// INSTANCE
|
||||||
htmlServerInstance: Server;
|
htmlServerInstance: Server;
|
||||||
serverPort: number;
|
serverPort: number;
|
||||||
headlessBrowser: plugins.smartpuppeteer.puppeteer.Browser;
|
headlessBrowser: plugins.smartpuppeteer.puppeteer.Browser;
|
||||||
@ -19,7 +25,8 @@ export class SmartPdf {
|
|||||||
this._readyDeferred = new plugins.smartpromise.Deferred();
|
this._readyDeferred = new plugins.smartpromise.Deferred();
|
||||||
}
|
}
|
||||||
|
|
||||||
async start(headlessBrowserArg?) {
|
async start(headlessBrowserArg?: plugins.smartpuppeteer.puppeteer.Browser) {
|
||||||
|
const done = plugins.smartpromise.defer();
|
||||||
// lets set the external browser in case one is provided
|
// lets set the external browser in case one is provided
|
||||||
this.headlessBrowser = headlessBrowserArg;
|
this.headlessBrowser = headlessBrowserArg;
|
||||||
// setup puppeteer
|
// setup puppeteer
|
||||||
@ -43,7 +50,9 @@ export class SmartPdf {
|
|||||||
this.htmlServerInstance.listen(3210, 'localhost');
|
this.htmlServerInstance.listen(3210, 'localhost');
|
||||||
this.htmlServerInstance.on('listening', () => {
|
this.htmlServerInstance.on('listening', () => {
|
||||||
this._readyDeferred.resolve();
|
this._readyDeferred.resolve();
|
||||||
|
done.resolve();
|
||||||
});
|
});
|
||||||
|
await done.promise;
|
||||||
}
|
}
|
||||||
|
|
||||||
// stop
|
// stop
|
||||||
@ -63,14 +72,19 @@ export class SmartPdf {
|
|||||||
/**
|
/**
|
||||||
* returns a pdf for a given html string;
|
* returns a pdf for a given html string;
|
||||||
*/
|
*/
|
||||||
async getPdfResultForHtmlString(htmlStringArg: string): Promise<interfaces.IPdfResult> {
|
async getA4PdfResultForHtmlString(htmlStringArg: string): Promise<plugins.tsclass.business.IPdf> {
|
||||||
await this._readyDeferred.promise;
|
await this._readyDeferred.promise;
|
||||||
const pdfCandidate = new PdfCandidate(htmlStringArg);
|
const pdfCandidate = new PdfCandidate(htmlStringArg);
|
||||||
this._candidates[pdfCandidate.pdfId] = pdfCandidate;
|
this._candidates[pdfCandidate.pdfId] = pdfCandidate;
|
||||||
const page = await this.headlessBrowser.newPage();
|
const page = await this.headlessBrowser.newPage();
|
||||||
|
await page.setViewport({
|
||||||
|
width: 794,
|
||||||
|
height: 1122,
|
||||||
|
});
|
||||||
const response = await page.goto(`http://localhost:3210/${pdfCandidate.pdfId}`, {
|
const response = await page.goto(`http://localhost:3210/${pdfCandidate.pdfId}`, {
|
||||||
waitUntil: 'networkidle2',
|
waitUntil: 'networkidle2',
|
||||||
});
|
});
|
||||||
|
await plugins.smartdelay.delayFor(1000);
|
||||||
const headers = response.headers();
|
const headers = response.headers();
|
||||||
if (headers['pdf-id'] !== pdfCandidate.pdfId) {
|
if (headers['pdf-id'] !== pdfCandidate.pdfId) {
|
||||||
console.log('Error! Headers do not match. For security reasons no pdf is being emitted!');
|
console.log('Error! Headers do not match. For security reasons no pdf is being emitted!');
|
||||||
@ -80,10 +94,10 @@ export class SmartPdf {
|
|||||||
}
|
}
|
||||||
|
|
||||||
const pdfBuffer = await page.pdf({
|
const pdfBuffer = await page.pdf({
|
||||||
format: 'A4',
|
width: 794,
|
||||||
|
height: 1122,
|
||||||
printBackground: true,
|
printBackground: true,
|
||||||
displayHeaderFooter: false,
|
displayHeaderFooter: false,
|
||||||
preferCSSPageSize: true,
|
|
||||||
});
|
});
|
||||||
await page.close();
|
await page.close();
|
||||||
delete this._candidates[pdfCandidate.pdfId];
|
delete this._candidates[pdfCandidate.pdfId];
|
||||||
@ -92,12 +106,19 @@ export class SmartPdf {
|
|||||||
return {
|
return {
|
||||||
id: pdfCandidate.pdfId,
|
id: pdfCandidate.pdfId,
|
||||||
name: `${pdfCandidate.pdfId}.js`,
|
name: `${pdfCandidate.pdfId}.js`,
|
||||||
|
metadata: {
|
||||||
|
textExtraction: await this.extractTextFromPdfBuffer(pdfBuffer),
|
||||||
|
},
|
||||||
buffer: pdfBuffer,
|
buffer: pdfBuffer,
|
||||||
};
|
};
|
||||||
}
|
}
|
||||||
|
|
||||||
async getPdfResultForWebsite(websiteUrl: string): Promise<interfaces.IPdfResult> {
|
async getPdfResultForWebsite(websiteUrl: string): Promise<plugins.tsclass.business.IPdf> {
|
||||||
const page = await this.headlessBrowser.newPage();
|
const page = await this.headlessBrowser.newPage();
|
||||||
|
await page.setViewport({
|
||||||
|
width: 1980,
|
||||||
|
height: 1200,
|
||||||
|
});
|
||||||
await page.emulateMediaType('screen');
|
await page.emulateMediaType('screen');
|
||||||
const response = await page.goto(websiteUrl, { waitUntil: 'networkidle2' });
|
const response = await page.goto(websiteUrl, { waitUntil: 'networkidle2' });
|
||||||
const pdfId = plugins.smartunique.shortId();
|
const pdfId = plugins.smartunique.shortId();
|
||||||
@ -108,45 +129,101 @@ export class SmartPdf {
|
|||||||
};
|
};
|
||||||
});
|
});
|
||||||
const pdfBuffer = await page.pdf({
|
const pdfBuffer = await page.pdf({
|
||||||
format: 'A4',
|
height: documentHeight,
|
||||||
height: documentWidth,
|
|
||||||
width: documentWidth,
|
width: documentWidth,
|
||||||
printBackground: true,
|
printBackground: true,
|
||||||
displayHeaderFooter: false,
|
displayHeaderFooter: false,
|
||||||
preferCSSPageSize: true,
|
|
||||||
});
|
});
|
||||||
await page.close();
|
await page.close();
|
||||||
return {
|
return {
|
||||||
id: pdfId,
|
id: pdfId,
|
||||||
name: `${pdfId}.js`,
|
name: `${pdfId}.js`,
|
||||||
|
metadata: {
|
||||||
|
textExtraction: await this.extractTextFromPdfBuffer(pdfBuffer),
|
||||||
|
},
|
||||||
buffer: pdfBuffer,
|
buffer: pdfBuffer,
|
||||||
};
|
};
|
||||||
}
|
}
|
||||||
|
|
||||||
async getFullWebsiteAsSinglePdf(websiteUrl: string) {
|
async getFullWebsiteAsSinglePdf(websiteUrl: string): Promise<plugins.tsclass.business.IPdf> {
|
||||||
const page = await this.headlessBrowser.newPage();
|
const page = await this.headlessBrowser.newPage();
|
||||||
|
await page.setViewport({
|
||||||
|
width: 1920,
|
||||||
|
height: 1200,
|
||||||
|
});
|
||||||
page.emulateMediaType('screen');
|
page.emulateMediaType('screen');
|
||||||
const response = await page.goto(websiteUrl, { waitUntil: 'networkidle2' });
|
const response = await page.goto(websiteUrl, { waitUntil: 'networkidle2' });
|
||||||
const pdfId = plugins.smartunique.shortId();
|
const pdfId = plugins.smartunique.shortId();
|
||||||
const { documentHeight, documentWidth } = await page.evaluate(() => {
|
const { documentHeight, documentWidth } = await page.evaluate(() => {
|
||||||
return {
|
return {
|
||||||
documentHeight: document.height,
|
documentHeight: document.body.scrollHeight,
|
||||||
documentWidth: document.width,
|
documentWidth: document.body.clientWidth,
|
||||||
};
|
};
|
||||||
});
|
});
|
||||||
|
await page.setViewport({
|
||||||
|
width: 1920,
|
||||||
|
height: documentHeight,
|
||||||
|
});
|
||||||
const pdfBuffer = await page.pdf({
|
const pdfBuffer = await page.pdf({
|
||||||
format: 'A4',
|
height: documentHeight,
|
||||||
height: documentWidth,
|
width: 1920,
|
||||||
width: documentWidth,
|
|
||||||
printBackground: true,
|
printBackground: true,
|
||||||
displayHeaderFooter: false,
|
displayHeaderFooter: false,
|
||||||
preferCSSPageSize: true,
|
scale: 1,
|
||||||
|
pageRanges: '1',
|
||||||
});
|
});
|
||||||
await page.close();
|
await page.close();
|
||||||
return {
|
return {
|
||||||
id: pdfId,
|
id: pdfId,
|
||||||
name: `${pdfId}.js`,
|
name: `${pdfId}.js`,
|
||||||
|
metadata: {
|
||||||
|
textExtraction: await this.extractTextFromPdfBuffer(pdfBuffer),
|
||||||
|
},
|
||||||
buffer: pdfBuffer,
|
buffer: pdfBuffer,
|
||||||
};
|
};
|
||||||
}
|
}
|
||||||
|
|
||||||
|
public async mergePdfs(pdfArrayArg: plugins.tsclass.business.IPdf[]): Promise<IPdf> {
|
||||||
|
const merger = new plugins.pdfMerger();
|
||||||
|
for (const pdf of pdfArrayArg) {
|
||||||
|
merger.add(pdf.buffer as Buffer);
|
||||||
|
}
|
||||||
|
const resultBuffer = await merger.saveAsBuffer();
|
||||||
|
return {
|
||||||
|
name: 'mergedPdf',
|
||||||
|
buffer: resultBuffer,
|
||||||
|
id: null,
|
||||||
|
metadata: null
|
||||||
|
};
|
||||||
|
}
|
||||||
|
|
||||||
|
public async readFileToPdfObject(pathArg: string): Promise<plugins.tsclass.business.IPdf> {
|
||||||
|
const path = plugins.smartpath.transform.makeAbsolute(pathArg);
|
||||||
|
const parsedPath = plugins.path.parse(path);
|
||||||
|
const buffer = await plugins.smartfile.fs.toBuffer(path);
|
||||||
|
return {
|
||||||
|
name: parsedPath.base,
|
||||||
|
buffer,
|
||||||
|
id: null,
|
||||||
|
metadata: null
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
public async extractTextFromPdfBuffer(pdfBufferArg: Buffer): Promise<string> {
|
||||||
|
const deferred = plugins.smartpromise.defer<string>();
|
||||||
|
const pdfParser: any = new plugins.pdf2json();
|
||||||
|
pdfParser.on('pdfParser_dataReady', (pdfData: any) => {
|
||||||
|
let finalText = '';
|
||||||
|
for (const page of pdfData.Pages) {
|
||||||
|
for (const text of page.Texts) {
|
||||||
|
for (const letter of text.R) {
|
||||||
|
finalText = finalText + letter.T;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
deferred.resolve(finalText);
|
||||||
|
});
|
||||||
|
pdfParser.parseBuffer(pdfBufferArg);
|
||||||
|
return deferred.promise;
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
@ -1,3 +1,3 @@
|
|||||||
import * as plugins from './smartpdf.plugins';
|
import * as plugins from './smartpdf.plugins.js';
|
||||||
|
|
||||||
export const packageDir = plugins.path.join(__dirname, '../');
|
export const packageDir = plugins.path.join(plugins.smartpath.get.dirnameFromImportMetaUrl(import.meta.url), '../');
|
||||||
|
@ -6,14 +6,26 @@ export { http, path };
|
|||||||
|
|
||||||
// @pushrocks
|
// @pushrocks
|
||||||
import * as smartfile from '@pushrocks/smartfile';
|
import * as smartfile from '@pushrocks/smartfile';
|
||||||
|
import * as smartdelay from '@pushrocks/smartdelay';
|
||||||
import * as smartpromise from '@pushrocks/smartpromise';
|
import * as smartpromise from '@pushrocks/smartpromise';
|
||||||
|
import * as smartpath from '@pushrocks/smartpath';
|
||||||
import * as smartpuppeteer from '@pushrocks/smartpuppeteer';
|
import * as smartpuppeteer from '@pushrocks/smartpuppeteer';
|
||||||
import * as smartnetwork from '@pushrocks/smartnetwork';
|
import * as smartnetwork from '@pushrocks/smartnetwork';
|
||||||
import * as smartunique from '@pushrocks/smartunique';
|
import * as smartunique from '@pushrocks/smartunique';
|
||||||
|
|
||||||
export { smartfile, smartpromise, smartpuppeteer, smartunique, smartnetwork };
|
export { smartfile, smartdelay, smartpromise, smartpath, smartpuppeteer, smartunique, smartnetwork };
|
||||||
|
|
||||||
|
// tsclass scope
|
||||||
|
import * as tsclass from '@tsclass/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';
|
||||||
|
|
||||||
export { express };
|
export { pdfMerger, pdf2json, express };
|
||||||
|
9
tsconfig.json
Normal file
9
tsconfig.json
Normal file
@ -0,0 +1,9 @@
|
|||||||
|
{
|
||||||
|
"compilerOptions": {
|
||||||
|
"experimentalDecorators": true,
|
||||||
|
"target": "ES2022",
|
||||||
|
"module": "ES2022",
|
||||||
|
"moduleResolution": "nodenext",
|
||||||
|
"allowSyntheticDefaultImports": true
|
||||||
|
}
|
||||||
|
}
|
17
tslint.json
17
tslint.json
@ -1,17 +0,0 @@
|
|||||||
{
|
|
||||||
"extends": ["tslint:latest", "tslint-config-prettier"],
|
|
||||||
"rules": {
|
|
||||||
"semicolon": [true, "always"],
|
|
||||||
"no-console": false,
|
|
||||||
"ordered-imports": false,
|
|
||||||
"object-literal-sort-keys": false,
|
|
||||||
"member-ordering": {
|
|
||||||
"options":{
|
|
||||||
"order": [
|
|
||||||
"static-method"
|
|
||||||
]
|
|
||||||
}
|
|
||||||
}
|
|
||||||
},
|
|
||||||
"defaultSeverity": "warning"
|
|
||||||
}
|
|
Reference in New Issue
Block a user