- generazione della raccolta PDF OK !!!

This commit is contained in:
Surya Paolo
2025-05-30 16:45:01 +02:00
parent f0c25366db
commit 3d6455f23c
6 changed files with 1653 additions and 1528 deletions

View File

@@ -37,6 +37,7 @@ const RaccoltaCataloghiSchema = new Schema({
nomefile_da_generare: String, nomefile_da_generare: String,
pdf_generato: String,
pdf_generato_size: String, pdf_generato_size: String,
pdf_generato_stampa: String, pdf_generato_stampa: String,
data_generato: { data_generato: {

File diff suppressed because it is too large Load Diff

View File

@@ -86,6 +86,7 @@ class GenPdf {
try { try {
console.log(`caricamento pagina: ${url}`); console.log(`caricamento pagina: ${url}`);
await page.goto(url, { waitUntil: 'networkidle0' }); await page.goto(url, { waitUntil: 'networkidle0' });
await page.waitForNavigation({ waitUntil: 'networkidle0' }).catch(() => {});
page.on('console', (msg) => { page.on('console', (msg) => {
if (msg.type() === 'error') { if (msg.type() === 'error') {
@@ -93,7 +94,7 @@ class GenPdf {
} }
}); });
await tools.attendiNSecondi(8); await tools.attendiNSecondi(6);
let success = false; let success = false;
let numTentativi1 = 0; let numTentativi1 = 0;
while (numTentativi1 < maxTentativi) { while (numTentativi1 < maxTentativi) {

View File

@@ -239,13 +239,13 @@ async function compressPdfWithPs2Pdf(inputFile, outputFile, compression = 'ebook
// DIAGNOSI COMPLETA DEL PROBLEMA // DIAGNOSI COMPLETA DEL PROBLEMA
async function diagnosePDFProblem() { async function diagnosePDFProblem() {
console.log('=== DIAGNOSI COMPLETA SISTEMA ==='); console.log('=== DIAGNOSI COMPLETA SISTEMA ===');
// 1. Test ambiente Node.js // 1. Test ambiente Node.js
console.log('Node.js version:', process.version); console.log('Node.js version:', process.version);
console.log('Platform:', process.platform); console.log('Platform:', process.platform);
console.log('Architecture:', process.arch); console.log('Architecture:', process.arch);
console.log('Current working directory:', process.cwd()); console.log('Current working directory:', process.cwd());
// 2. Test moduli disponibili // 2. Test moduli disponibili
try { try {
console.log('Testing gs module...'); console.log('Testing gs module...');
@@ -253,12 +253,12 @@ async function diagnosePDFProblem() {
} catch (error) { } catch (error) {
console.log('gs module error:', error.message); console.log('gs module error:', error.message);
} }
// 3. Test comando di sistema // 3. Test comando di sistema
const { exec } = require('child_process'); const { exec } = require('child_process');
const util = require('util'); const util = require('util');
const execAsync = util.promisify(exec); const execAsync = util.promisify(exec);
try { try {
console.log('Testing gs command from system...'); console.log('Testing gs command from system...');
const { stdout, stderr } = await execAsync('gs -version'); const { stdout, stderr } = await execAsync('gs -version');
@@ -267,12 +267,12 @@ async function diagnosePDFProblem() {
} catch (error) { } catch (error) {
console.log('System gs command failed:', error.message); console.log('System gs command failed:', error.message);
} }
// 4. Test scrittura file // 4. Test scrittura file
const fs = require('fs').promises; const fs = require('fs').promises;
const path = require('path'); const path = require('path');
const testFile = path.join(process.cwd(), 'test_write.txt'); const testFile = path.join(process.cwd(), 'test_write.txt');
try { try {
await fs.writeFile(testFile, 'test content'); await fs.writeFile(testFile, 'test content');
console.log('File write test: SUCCESS'); console.log('File write test: SUCCESS');
@@ -282,19 +282,18 @@ async function diagnosePDFProblem() {
} }
} }
// ALTERNATIVA 1: Usando child_process direttamente // ALTERNATIVA 1: Usando child_process direttamente
async function convertPDF_ChildProcess(inputFile, outputFile, width, height, compressionLevel = 'screen') { async function convertPDF_ChildProcess(inputFile, outputFile, width, height, compressionLevel = 'screen') {
const { spawn } = require('child_process'); const { spawn } = require('child_process');
const path = require('path'); const path = require('path');
console.log('=== CONVERSIONE CON CHILD_PROCESS E COMPRESSIONE ==='); console.log('=== CONVERSIONE CON CHILD_PROCESS E COMPRESSIONE ===');
// Verifica input // Verifica input
if (!(await tools.isFileExistsAsync(inputFile))) { if (!(await tools.isFileExistsAsync(inputFile))) {
throw new Error(`File input non trovato: ${inputFile}`); throw new Error(`File input non trovato: ${inputFile}`);
} }
// Assicurati che la directory output esista // Assicurati che la directory output esista
const outputDir = path.dirname(outputFile); const outputDir = path.dirname(outputFile);
const fs = require('fs').promises; const fs = require('fs').promises;
@@ -303,44 +302,40 @@ async function convertPDF_ChildProcess(inputFile, outputFile, width, height, com
} catch (error) { } catch (error) {
// Directory già esistente, ok // Directory già esistente, ok
} }
// const widthPt = Math.round(width * 28.34646); // const widthPt = Math.round(width * 28.34646);
// const heightPt = Math.round(height * 28.34646); // const heightPt = Math.round(height * 28.34646);
const widthPt = Math.round(width * 28.34646* 10); const widthPt = Math.round(width * 28.34646 * 10);
const heightPt = Math.round(height * 28.34646 * 10); const heightPt = Math.round(height * 28.34646 * 10);
// Parametri di compressione ottimizzati // Parametri di compressione ottimizzati
const compressionSettings = { const compressionSettings = {
'maximum': [ maximum: [
'-dPDFSETTINGS=/screen', '-dPDFSETTINGS=/screen',
'-dDownsampleColorImages=true', '-dDownsampleColorImages=true',
'-dColorImageResolution=72', '-dColorImageResolution=72',
'-dDownsampleGrayImages=true', '-dDownsampleGrayImages=true',
'-dGrayImageResolution=72', '-dGrayImageResolution=72',
'-dDownsampleMonoImages=true', '-dDownsampleMonoImages=true',
'-dMonoImageResolution=72' '-dMonoImageResolution=72',
], ],
'high': [ high: [
'-dPDFSETTINGS=/ebook', '-dPDFSETTINGS=/ebook',
'-dDownsampleColorImages=true', '-dDownsampleColorImages=true',
'-dColorImageResolution=150', '-dColorImageResolution=150',
'-dDownsampleGrayImages=true', '-dDownsampleGrayImages=true',
'-dGrayImageResolution=150' '-dGrayImageResolution=150',
], ],
'printer': [ printer: ['-dPDFSETTINGS=/printer', '-dDownsampleColorImages=true', '-dColorImageResolution=300'],
'-dPDFSETTINGS=/printer', screen: [
'-dDownsampleColorImages=true',
'-dColorImageResolution=300'
],
'screen': [
'-dPDFSETTINGS=/screen', '-dPDFSETTINGS=/screen',
'-dDownsampleColorImages=true', '-dDownsampleColorImages=true',
'-dColorImageResolution=96', '-dColorImageResolution=96',
'-dDownsampleGrayImages=true', '-dDownsampleGrayImages=true',
'-dGrayImageResolution=96' '-dGrayImageResolution=96',
] ],
}; };
return new Promise((resolve, reject) => { return new Promise((resolve, reject) => {
const args = [ const args = [
'-sDEVICE=pdfwrite', '-sDEVICE=pdfwrite',
@@ -349,52 +344,53 @@ async function convertPDF_ChildProcess(inputFile, outputFile, width, height, com
'-dQUIET', '-dQUIET',
'-dBATCH', '-dBATCH',
'-dSAFER', '-dSAFER',
// Parametri di compressione // Parametri di compressione
...compressionSettings[compressionLevel] || compressionSettings['screen'], ...(compressionSettings[compressionLevel] || compressionSettings['screen']),
'-dCompressFonts=true', '-dCompressFonts=true',
'-dSubsetFonts=true', '-dSubsetFonts=true',
'-dColorImageFilter=/DCTEncode', '-dColorImageFilter=/DCTEncode',
'-dGrayImageFilter=/DCTEncode', '-dGrayImageFilter=/DCTEncode',
'-dEmbedAllFonts=true', '-dEmbedAllFonts=true',
// Dimensioni pagina // Dimensioni pagina
`-g${widthPt}x${heightPt}`, `-g${widthPt}x${heightPt}`,
'-dFIXEDMEDIA', '-dFIXEDMEDIA',
// '-dPDFFitPage', // '-dPDFFitPage',
// Output // Output
`-sOutputFile=${outputFile}`, `-sOutputFile=${outputFile}`,
inputFile inputFile,
]; ];
console.log('Spawning gs with compression args:', args.join(' ')); console.log('Spawning gs with compression args:', args.join(' '));
const gsProcess = spawn('gs', args, { const gsProcess = spawn('gs', args, {
stdio: ['ignore', 'pipe', 'pipe'], stdio: ['ignore', 'pipe', 'pipe'],
shell: process.platform === 'win32' shell: process.platform === 'win32',
}); });
let stdout = ''; let stdout = '';
let stderr = ''; let stderr = '';
gsProcess.stdout.on('data', (data) => { gsProcess.stdout.on('data', (data) => {
stdout += data.toString(); stdout += data.toString();
if (stdout.length < 1000) { // Evita log troppo lunghi if (stdout.length < 1000) {
// Evita log troppo lunghi
console.log('GS OUT:', data.toString().trim()); console.log('GS OUT:', data.toString().trim());
} }
}); });
gsProcess.stderr.on('data', (data) => { gsProcess.stderr.on('data', (data) => {
stderr += data.toString(); stderr += data.toString();
if (stderr.length < 1000) { if (stderr.length < 1000) {
console.log('GS ERR:', data.toString().trim()); console.log('GS ERR:', data.toString().trim());
} }
}); });
gsProcess.on('close', async (code) => { gsProcess.on('close', async (code) => {
console.log(`GS process closed with code: ${code}`); console.log(`GS process closed with code: ${code}`);
if (code === 0) { if (code === 0) {
// Attendi e verifica // Attendi e verifica
setTimeout(async () => { setTimeout(async () => {
@@ -405,8 +401,8 @@ async function convertPDF_ChildProcess(inputFile, outputFile, width, height, com
try { try {
const originalStats = await tools.getFileStatsAsync(inputFile); const originalStats = await tools.getFileStatsAsync(inputFile);
const newStats = await tools.getFileStatsAsync(outputFile); const newStats = await tools.getFileStatsAsync(outputFile);
const compressionRatio = ((originalStats.size - newStats.size) / originalStats.size * 100).toFixed(1); const compressionRatio = (((originalStats.size - newStats.size) / originalStats.size) * 100).toFixed(1);
console.log(`📁 File originale: ${(originalStats.size / 1024 / 1024).toFixed(2)} MB`); console.log(`📁 File originale: ${(originalStats.size / 1024 / 1024).toFixed(2)} MB`);
console.log(`📁 File compresso: ${(newStats.size / 1024 / 1024).toFixed(2)} MB`); console.log(`📁 File compresso: ${(newStats.size / 1024 / 1024).toFixed(2)} MB`);
console.log(`🗜️ Compressione: ${compressionRatio}%`); console.log(`🗜️ Compressione: ${compressionRatio}%`);
@@ -414,7 +410,7 @@ async function convertPDF_ChildProcess(inputFile, outputFile, width, height, com
} catch (statsError) { } catch (statsError) {
console.log('Warning: impossibile calcolare statistiche compressione'); console.log('Warning: impossibile calcolare statistiche compressione');
} }
resolve(outputFile); resolve(outputFile);
} else { } else {
console.log('❌ FAIL: File non generato nonostante exit code 0'); console.log('❌ FAIL: File non generato nonostante exit code 0');
@@ -428,7 +424,7 @@ async function convertPDF_ChildProcess(inputFile, outputFile, width, height, com
reject(new Error(`Ghostscript failed with code ${code}: ${stderr}`)); reject(new Error(`Ghostscript failed with code ${code}: ${stderr}`));
} }
}); });
gsProcess.on('error', (error) => { gsProcess.on('error', (error) => {
console.log('GS process error:', error); console.log('GS process error:', error);
reject(new Error(`Failed to start Ghostscript: ${error.message}`)); reject(new Error(`Failed to start Ghostscript: ${error.message}`));
@@ -631,6 +627,7 @@ router.post('/online-pdf', authenticate, async (req, res) => {
try { try {
let myrec = null; let myrec = null;
// Aggiorna il PDF OnLine, copiando il file da Generato a OnLine // Aggiorna il PDF OnLine, copiando il file da Generato a OnLine
if (id_catalog) { if (id_catalog) {
myrec = await Catalog.findOne({ _id: id_catalog }); myrec = await Catalog.findOne({ _id: id_catalog });
@@ -645,7 +642,7 @@ router.post('/online-pdf', authenticate, async (req, res) => {
if (stampa) { if (stampa) {
myrec.pdf_online_stampa = myrec.pdf_generato_stampa.replace('_generato', ''); myrec.pdf_online_stampa = myrec.pdf_generato_stampa.replace('_generato', '');
} else { } else {
myrec.pdf_online = myrec.pdf_generato.replace('_generato', ''); myrec.pdf_online = myrec.pdf_generato?.replace('_generato', '');
} }
// Aggiorna il PDF OnLine, copiando il file da Generato a OnLine // Aggiorna il PDF OnLine, copiando il file da Generato a OnLine
@@ -699,17 +696,20 @@ async function JoinPDFCatalogs(cataloghi, options, outputFile, stampa) {
for (let id_catalog of cataloghi) { for (let id_catalog of cataloghi) {
let catalog = await Catalog.findOne({ _id: id_catalog }); let catalog = await Catalog.findOne({ _id: id_catalog });
if (catalog) { if (catalog) {
let filename = stampa ? catalog.pdf_generato_stampa : catalog.pdf_generato; let filename = stampa ? catalog.pdf_online_stampa : catalog.pdf_online;
if (filename) { if (filename) {
const pdfBytes = await fs.promises.readFile(options.mydir + filename); let myfile = tools.fixFilePath(options.mydir + '/' + filename);
const pdf = await PDFDocument.load(pdfBytes); if (await tools.isFileExistsAsync(myfile)) {
const pages = pdf.getPages(); const pdfBytes = await fs.promises.readFile(myfile);
const copiedPages = await pdfDoc.copyPages( const pdf = await PDFDocument.load(pdfBytes);
pdf, const pages = pdf.getPages();
pages.map((p, i) => i) const copiedPages = await pdfDoc.copyPages(
); pdf,
for (let page of copiedPages) { pages.map((p, i) => i)
pdfDoc.addPage(page); );
for (let page of copiedPages) {
pdfDoc.addPage(page);
}
} }
} else { } else {
console.log('ATTENZIONE! Catalogo non ancora Generato ! ', catalog.title); console.log('ATTENZIONE! Catalogo non ancora Generato ! ', catalog.title);
@@ -725,6 +725,12 @@ async function JoinPDFCatalogs(cataloghi, options, outputFile, stampa) {
const outputFilename = path.basename(outputFile); const outputFilename = path.basename(outputFile);
const outputPath = path.join(options.dir_out, outputFilename); const outputPath = path.join(options.dir_out, outputFilename);
if (await tools.isFileExistsAsync(outputFile)) {
console.log('✅ Catalogo Completo Generato correttamente ! ', outputFile);
} else {
console.log('❌ Catalogo non generato ! ', outputFile);
}
const ris = { const ris = {
outputPath, outputPath,
}; };
@@ -746,7 +752,8 @@ router.post('/join-pdf', authenticate, async (req, res) => {
options.mydir = tools.getdirByIdApp(idapp); options.mydir = tools.getdirByIdApp(idapp);
try { try {
const full_dir_out = tools.getdirByIdApp(options.idapp) + '/' + options.dir_out; const mydirpath = tools.getdirByIdApp(options.idapp);
const full_dir_out = tools.fixFilePath(path.join(mydirpath, options.dir_out));
await fs.promises.mkdir(full_dir_out, { recursive: true }); await fs.promises.mkdir(full_dir_out, { recursive: true });
// Aggiorna il PDF OnLine, copiando il file da Generato a OnLine // Aggiorna il PDF OnLine, copiando il file da Generato a OnLine
@@ -767,13 +774,16 @@ router.post('/join-pdf', authenticate, async (req, res) => {
const ris_stampa = await JoinPDFCatalogs(cataloghi, options, outputFileStampa, true); const ris_stampa = await JoinPDFCatalogs(cataloghi, options, outputFileStampa, true);
if (ris_stampa) { if (ris_stampa) {
raccolta.pdf_generato_stampa = ris_stampa.outputPath; raccolta.pdf_generato_stampa = ris_stampa.outputPath;
let myfilecheckstampa = path.join(mydirpath, ris_stampa.outputPath);
raccolta.pdf_generato_stampa_size = await tools.getSizeFile(myfilecheckstampa);
} }
} else { } else {
// Creazione file per WEB // Creazione file per WEB
const ris = await JoinPDFCatalogs(cataloghi, options, outputFile, false); const ris = await JoinPDFCatalogs(cataloghi, options, outputFile, false);
if (ris) { if (ris) {
raccolta.pdf_generato = ris.outputPath; raccolta.pdf_generato = ris.outputPath;
raccolta.pdf_generato_size = await tools.getSizeFile(ris.outputPath); let myfilecheck = path.join(mydirpath, ris.outputPath);
raccolta.pdf_generato_size = await tools.getSizeFile(myfilecheck);
} }
} }
@@ -2663,5 +2673,4 @@ router.post('/generate-pdf', async (req, res) => {
} }
}); });
module.exports = router; module.exports = router;

View File

@@ -1173,7 +1173,7 @@ router.post('/dbop', authenticate, async (req, res) => {
idapp = req.body.idapp; idapp = req.body.idapp;
locale = req.body.locale; locale = req.body.locale;
if (!User.isAdmin(req.user.perm)) { if (!User.isCollaboratore(req.user.perm)) {
return res.status(404).send({ code: server_constants.RIS_CODE_ERR_UNAUTHORIZED }); return res.status(404).send({ code: server_constants.RIS_CODE_ERR_UNAUTHORIZED });
} }

View File

@@ -6186,5 +6186,9 @@ module.exports = {
async attendiNSecondi(numsec) { async attendiNSecondi(numsec) {
await new Promise(resolve => setTimeout(resolve, numsec * 1000)); await new Promise(resolve => setTimeout(resolve, numsec * 1000));
} },
fixFilePath(myfilepath) {
return myfilepath.replace(/\\/g, '/');
},
}; };