- anche la versione file compressa del PDF ora è ok.
This commit is contained in:
@@ -21,6 +21,7 @@
|
|||||||
"bluebird": "^3.7.2",
|
"bluebird": "^3.7.2",
|
||||||
"body-parser": "^1.20.3",
|
"body-parser": "^1.20.3",
|
||||||
"cheerio": "^1.0.0",
|
"cheerio": "^1.0.0",
|
||||||
|
"compress-pdf": "^0.5.3",
|
||||||
"cookie-parser": "^1.4.7",
|
"cookie-parser": "^1.4.7",
|
||||||
"cors": "^2.8.5",
|
"cors": "^2.8.5",
|
||||||
"country-codes-list": "^2.0.0",
|
"country-codes-list": "^2.0.0",
|
||||||
|
|||||||
Binary file not shown.
@@ -1,5 +1,7 @@
|
|||||||
const puppeteer = require('puppeteer');
|
const puppeteer = require('puppeteer');
|
||||||
const path = require('path');
|
const path = require('path');
|
||||||
|
const { exec } = require('child_process');
|
||||||
|
|
||||||
const fs = require('fs').promises;
|
const fs = require('fs').promises;
|
||||||
|
|
||||||
const gs = require('ghostscript4js');
|
const gs = require('ghostscript4js');
|
||||||
@@ -12,6 +14,8 @@ const { MyPage } = require('../models/mypage');
|
|||||||
const tools = require('../tools/general');
|
const tools = require('../tools/general');
|
||||||
const shared_consts = require('../tools/shared_nodejs');
|
const shared_consts = require('../tools/shared_nodejs');
|
||||||
|
|
||||||
|
const { compress } = require('compress-pdf');
|
||||||
|
|
||||||
class GenPdf {
|
class GenPdf {
|
||||||
constructor(idapp) {
|
constructor(idapp) {
|
||||||
this.idapp = idapp;
|
this.idapp = idapp;
|
||||||
@@ -42,26 +46,24 @@ class GenPdf {
|
|||||||
}
|
}
|
||||||
|
|
||||||
async autoScroll(page) {
|
async autoScroll(page) {
|
||||||
console.log('inizia a scrollare')
|
console.log('inizia a scrollare');
|
||||||
await page.evaluate(async () => {
|
await page.evaluate(async () => {
|
||||||
await new Promise((resolve) => {
|
await new Promise((resolve) => {
|
||||||
let totalHeight = 0;
|
let totalHeight = 0;
|
||||||
console.log('autoScroll...')
|
console.log('autoScroll...');
|
||||||
const distance = 100;
|
const distance = 100;
|
||||||
const timer = setInterval(() => {
|
const timer = setInterval(() => {
|
||||||
window.scrollBy(0, distance);
|
window.scrollBy(0, distance);
|
||||||
totalHeight += distance;
|
totalHeight += distance;
|
||||||
|
|
||||||
if (totalHeight >= document.body.scrollHeight) {
|
if (totalHeight >= document.body.scrollHeight) {
|
||||||
clearInterval(timer);
|
clearInterval(timer);
|
||||||
resolve();
|
resolve();
|
||||||
}
|
}
|
||||||
}, 40);
|
}, 40);
|
||||||
|
|
||||||
|
|
||||||
});
|
});
|
||||||
});
|
});
|
||||||
console.log(' FINE: autoScroll...')
|
console.log(' FINE: autoScroll...');
|
||||||
}
|
}
|
||||||
|
|
||||||
async generatePdfFromUrl(url, filenameOut, options = {}) {
|
async generatePdfFromUrl(url, filenameOut, options = {}) {
|
||||||
@@ -70,23 +72,37 @@ class GenPdf {
|
|||||||
}
|
}
|
||||||
|
|
||||||
const page = await this.browser.newPage();
|
const page = await this.browser.newPage();
|
||||||
|
const maxTentativi = 3;
|
||||||
|
|
||||||
try {
|
try {
|
||||||
|
console.log(`caricamento pagina: ${url}`);
|
||||||
await page.goto(url, { waitUntil: 'networkidle0' });
|
await page.goto(url, { waitUntil: 'networkidle0' });
|
||||||
await tools.attendiNSecondi(5);
|
await tools.attendiNSecondi(5);
|
||||||
await page.waitForSelector('#q-notify', { timeout: 60000 });
|
let success = false;
|
||||||
|
let numTentativi1 = 0;
|
||||||
|
while (numTentativi1 < maxTentativi) {
|
||||||
|
try {
|
||||||
|
await page.waitForSelector('.pdf-section', { timeout: 10000 });
|
||||||
|
success = true;
|
||||||
|
break;
|
||||||
|
} catch (e) {
|
||||||
|
console.log(`Tentativo ${numTentativi1 + 1}/${maxTentativi} fallito, ASPETTO DI PIU 10 secondi`);
|
||||||
|
await tools.attendiNSecondi(10);
|
||||||
|
}
|
||||||
|
numTentativi1++;
|
||||||
|
}
|
||||||
|
|
||||||
await this.autoScroll(page);
|
await this.autoScroll(page);
|
||||||
|
|
||||||
await tools.attendiNSecondi(5);
|
await tools.attendiNSecondi(5);
|
||||||
|
|
||||||
|
|
||||||
// Seleziona tutte le sezioni da stampare
|
// Seleziona tutte le sezioni da stampare
|
||||||
let sectionHandles = await page.$$('.pdf-section');
|
let sectionHandles = await page.$$('.pdf-section');
|
||||||
let numTentativi = 0;
|
let numTentativi = 0;
|
||||||
const maxTentativi = 3;
|
|
||||||
while (sectionHandles.length === 0 && numTentativi < maxTentativi) {
|
while (sectionHandles.length === 0 && numTentativi < maxTentativi) {
|
||||||
console.log(`Nessuna sezione .pdf-section trovata nella pagina, quindi ASPETTO DI PIU ${numTentativi + 1}/${maxTentativi}`);
|
console.log(
|
||||||
|
`Nessuna sezione .pdf-section trovata nella pagina, quindi ASPETTO DI PIU ${numTentativi + 1}/${maxTentativi}`
|
||||||
|
);
|
||||||
await tools.attendiNSecondi(5);
|
await tools.attendiNSecondi(5);
|
||||||
sectionHandles = await page.$$('.pdf-section');
|
sectionHandles = await page.$$('.pdf-section');
|
||||||
numTentativi++;
|
numTentativi++;
|
||||||
@@ -113,8 +129,7 @@ class GenPdf {
|
|||||||
height: el.scrollHeight, // piccolo padding
|
height: el.scrollHeight, // piccolo padding
|
||||||
}));
|
}));
|
||||||
|
|
||||||
console.log(`Larghezza: ${width}px, Altezza: ${height}px`);
|
// console.log(`Larghezza: ${width}px, Altezza: ${height}px`);
|
||||||
|
|
||||||
|
|
||||||
// Imposta viewport dinamico
|
// Imposta viewport dinamico
|
||||||
await page.setViewport({ width, height });
|
await page.setViewport({ width, height });
|
||||||
@@ -151,6 +166,9 @@ class GenPdf {
|
|||||||
|
|
||||||
console.log(`PDF finale generato: ${finalFilePath}`);
|
console.log(`PDF finale generato: ${finalFilePath}`);
|
||||||
|
|
||||||
|
if (options.compressione) {
|
||||||
|
}
|
||||||
|
|
||||||
return finalFilePath;
|
return finalFilePath;
|
||||||
} catch (error) {
|
} catch (error) {
|
||||||
console.error('Errore durante generazione PDF:', error);
|
console.error('Errore durante generazione PDF:', error);
|
||||||
@@ -361,6 +379,8 @@ class GenPdf {
|
|||||||
}
|
}
|
||||||
let filenamerelative = '';
|
let filenamerelative = '';
|
||||||
let fullnamepath = '';
|
let fullnamepath = '';
|
||||||
|
let fullnamepath_compr = '';
|
||||||
|
let filenamerelative_compressed = '';
|
||||||
let stampa = options.stampa;
|
let stampa = options.stampa;
|
||||||
|
|
||||||
/*if (stampa) {
|
/*if (stampa) {
|
||||||
@@ -373,28 +393,71 @@ class GenPdf {
|
|||||||
|
|
||||||
const catalog = await Catalog.findById(options.idCatalog);
|
const catalog = await Catalog.findById(options.idCatalog);
|
||||||
if (catalog) {
|
if (catalog) {
|
||||||
const url = tools.getHostByIdApp(this.idapp) + '/cataloghi?id=' + catalog._id + '&stampa=' + (stampa ? '1' : '0');
|
const url =
|
||||||
|
tools.getHostByIdApp(this.idapp) + '/cataloghi?id=' + catalog._id + '&stampa=' + (stampa ? '1' : '0') + '&hideHeader=1';
|
||||||
|
|
||||||
if (url) {
|
if (url) {
|
||||||
const myfilenameout = await this.getPathByPage(catalog.idPageAssigned);
|
const myfilenameout = await this.getPathByPage(catalog.idPageAssigned);
|
||||||
|
|
||||||
|
let addstr = stampa ? '_stampabile' : '';
|
||||||
let addstr = (stampa) ? '_stampabile' : '';
|
|
||||||
|
|
||||||
filenamerelative = options.path + `${myfilenameout}${addstr}_generato.pdf`;
|
filenamerelative = options.path + `${myfilenameout}${addstr}_generato.pdf`;
|
||||||
|
|
||||||
fullnamepath = tools.getdirByIdApp(this.idapp) + '/' + filenamerelative;
|
fullnamepath = tools.getdirByIdApp(this.idapp) + '/' + filenamerelative;
|
||||||
await this.generatePdfFromUrl(url, fullnamepath, options);
|
await this.generatePdfFromUrl(url, fullnamepath, options);
|
||||||
|
|
||||||
|
if (options.comprimi) {
|
||||||
|
filenamerelative_compressed = options.path + `${myfilenameout}${addstr}_generato_compressed.pdf`;
|
||||||
|
fullnamepath_compr = tools.getdirByIdApp(this.idapp) + '/' + filenamerelative_compressed;
|
||||||
|
await this.compressPdf(fullnamepath, fullnamepath_compr, options.compressione);
|
||||||
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
return {fileout: filenamerelative, filesize: await tools.getSizeFile(fullnamepath)};
|
return {
|
||||||
|
fileout: filenamerelative,
|
||||||
|
fileout_compressed: filenamerelative_compressed,
|
||||||
|
filesize: await tools.getSizeFile(fullnamepath),
|
||||||
|
filesize_compressed: await tools.getSizeFile(fullnamepath_compr),
|
||||||
|
};
|
||||||
} catch (error) {
|
} catch (error) {
|
||||||
console.error('Errore durante la generazione del PDF dal catalogo ID:', error);
|
console.error('Errore durante la generazione del PDF dal catalogo ID:', error);
|
||||||
return {fileout: '', filesize: 0, error: 'Errore durante la generazione del PDF dal catalogo ID:' + error?.message};
|
return {
|
||||||
|
fileout: '',
|
||||||
|
filesize: 0,
|
||||||
|
error: 'Errore durante la generazione del PDF dal catalogo ID:' + error?.message,
|
||||||
|
};
|
||||||
}
|
}
|
||||||
|
|
||||||
return {fileout: '', filesize: 0 };
|
return { fileout: '', filesize: 0 };
|
||||||
|
}
|
||||||
|
|
||||||
|
async compressPdf(inputPath, outputPath, compressione = 'printer') {
|
||||||
|
return new Promise((resolve, reject) => {
|
||||||
|
// Risolvi i percorsi assoluti
|
||||||
|
const inputFile = path.resolve(inputPath);
|
||||||
|
const outputFile = path.resolve(outputPath);
|
||||||
|
|
||||||
|
const validQualities = ['screen', 'ebook', 'printer', 'prepress', 'default'];
|
||||||
|
if (!validQualities.includes(compressione)) compressione = 'screen';
|
||||||
|
|
||||||
|
// Comando Ghostscript per compressione - impostazione per web (/screen)
|
||||||
|
const gsCommand = `gs -sDEVICE=pdfwrite -dCompatibilityLevel=1.4 -dPDFSETTINGS=/${compressione} -dNOPAUSE -dBATCH -dQUIET -sOutputFile="${outputFile}" "${inputFile}"`;
|
||||||
|
|
||||||
|
console.log('Eseguo comando:', gsCommand);
|
||||||
|
|
||||||
|
exec(gsCommand, (error, stdout, stderr) => {
|
||||||
|
if (error) {
|
||||||
|
console.error(`Errore compressione PDF: ${error.message}`);
|
||||||
|
return reject(error);
|
||||||
|
}
|
||||||
|
if (stderr) {
|
||||||
|
console.error(`Ghostscript stderr: ${stderr}`);
|
||||||
|
}
|
||||||
|
console.log(`Compressione completata. File salvato in: ${outputFile}`);
|
||||||
|
resolve(outputFile);
|
||||||
|
});
|
||||||
|
});
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|||||||
12
yarn.lock
12
yarn.lock
@@ -2363,6 +2363,14 @@ component-emitter@^1.3.0:
|
|||||||
resolved "https://registry.yarnpkg.com/component-emitter/-/component-emitter-1.3.1.tgz#ef1d5796f7d93f135ee6fb684340b26403c97d17"
|
resolved "https://registry.yarnpkg.com/component-emitter/-/component-emitter-1.3.1.tgz#ef1d5796f7d93f135ee6fb684340b26403c97d17"
|
||||||
integrity sha512-T0+barUSQRTUQASh8bx02dl+DhF54GtIDY13Y3m9oWTklKbb3Wv974meRpeZ3lp1JpLVECWWNHC4vaG2XHXouQ==
|
integrity sha512-T0+barUSQRTUQASh8bx02dl+DhF54GtIDY13Y3m9oWTklKbb3Wv974meRpeZ3lp1JpLVECWWNHC4vaG2XHXouQ==
|
||||||
|
|
||||||
|
compress-pdf@^0.5.3:
|
||||||
|
version "0.5.3"
|
||||||
|
resolved "https://registry.yarnpkg.com/compress-pdf/-/compress-pdf-0.5.3.tgz#15a8c5d43f2241437a1ad42306955ccb9319367e"
|
||||||
|
integrity sha512-LeDPmE+o0PwxzqLU/uGIsaLxmnzZy4lXaY0tBov03uhNgXV6dZjU3VTBy3LhAhiCV+moXyBBE9kCDOZzZcEobg==
|
||||||
|
dependencies:
|
||||||
|
dotenv "16.4.7"
|
||||||
|
lodash "4.17.21"
|
||||||
|
|
||||||
concat-map@0.0.1:
|
concat-map@0.0.1:
|
||||||
version "0.0.1"
|
version "0.0.1"
|
||||||
resolved "https://registry.yarnpkg.com/concat-map/-/concat-map-0.0.1.tgz#d8a96bd77fd68df7793a73036a3ba0d5405d477b"
|
resolved "https://registry.yarnpkg.com/concat-map/-/concat-map-0.0.1.tgz#d8a96bd77fd68df7793a73036a3ba0d5405d477b"
|
||||||
@@ -3009,7 +3017,7 @@ domutils@^3.0.1, domutils@^3.1.0:
|
|||||||
domelementtype "^2.3.0"
|
domelementtype "^2.3.0"
|
||||||
domhandler "^5.0.3"
|
domhandler "^5.0.3"
|
||||||
|
|
||||||
dotenv@^16.4.7:
|
dotenv@16.4.7, dotenv@^16.4.7:
|
||||||
version "16.4.7"
|
version "16.4.7"
|
||||||
resolved "https://registry.yarnpkg.com/dotenv/-/dotenv-16.4.7.tgz#0e20c5b82950140aa99be360a8a5f52335f53c26"
|
resolved "https://registry.yarnpkg.com/dotenv/-/dotenv-16.4.7.tgz#0e20c5b82950140aa99be360a8a5f52335f53c26"
|
||||||
integrity sha512-47qPchRCykZC03FhkYAhrvwU4xDBFIj1QPqaarj6mdM/hgUzfPHcpkHJOn3mJAufFeeAxAzeGsr5X0M4k6fLZQ==
|
integrity sha512-47qPchRCykZC03FhkYAhrvwU4xDBFIj1QPqaarj6mdM/hgUzfPHcpkHJOn3mJAufFeeAxAzeGsr5X0M4k6fLZQ==
|
||||||
@@ -5957,7 +5965,7 @@ lodash.some@^4.4.0:
|
|||||||
resolved "https://registry.yarnpkg.com/lodash.some/-/lodash.some-4.6.0.tgz#1bb9f314ef6b8baded13b549169b2a945eb68e4d"
|
resolved "https://registry.yarnpkg.com/lodash.some/-/lodash.some-4.6.0.tgz#1bb9f314ef6b8baded13b549169b2a945eb68e4d"
|
||||||
integrity sha512-j7MJE+TuT51q9ggt4fSgVqro163BEFjAt3u97IqU+JA2DkWl80nFTrowzLpZ/BnpN7rrl0JA/593NAdd8p/scQ==
|
integrity sha512-j7MJE+TuT51q9ggt4fSgVqro163BEFjAt3u97IqU+JA2DkWl80nFTrowzLpZ/BnpN7rrl0JA/593NAdd8p/scQ==
|
||||||
|
|
||||||
lodash@^4.17.10, lodash@^4.17.14, lodash@^4.17.15, lodash@^4.17.21:
|
lodash@4.17.21, lodash@^4.17.10, lodash@^4.17.14, lodash@^4.17.15, lodash@^4.17.21:
|
||||||
version "4.17.21"
|
version "4.17.21"
|
||||||
resolved "https://registry.yarnpkg.com/lodash/-/lodash-4.17.21.tgz#679591c564c3bffaae8454cf0b3df370c3d6911c"
|
resolved "https://registry.yarnpkg.com/lodash/-/lodash-4.17.21.tgz#679591c564c3bffaae8454cf0b3df370c3d6911c"
|
||||||
integrity sha512-v2kDEe57lecTulaDIuNTPy3Ry4gLGJ6Z1O3vE1krgXZNrsQ+LFTGHVxVjcXPs17LhbZVGedAJv8XZ1tvj5FvSg==
|
integrity sha512-v2kDEe57lecTulaDIuNTPy3Ry4gLGJ6Z1O3vE1krgXZNrsQ+LFTGHVxVjcXPs17LhbZVGedAJv8XZ1tvj5FvSg==
|
||||||
|
|||||||
Reference in New Issue
Block a user