pdf: fix feature

Signed-off-by: Rodrigo Bertoldo de Sousa Martins <rodrigo.sousa.577@gmail.com>
This commit is contained in:
rodrigo committed 2026-02-27 19:18:39 -03:00
1 parent f4afe83db0
commit 9cd6208e4f
5 files changed
+441 -72

No files matched your search

+75 -6
View File
@@ -70,8 +70,9 @@ export class PDFController {
return;
}
const quality = req.body.quality ? parseInt(req.body.quality) : 95;
const quality = req.body.quality ? parseInt(req.body.quality) : 50; // Padrão 50 para mais compressão
const maxSizeMB = req.body.maxSizeMB ? parseInt(req.body.maxSizeMB) : undefined;
const enableOCR = req.body.enableOCR === 'true' || req.body.enableOCR === true;
const arquivosOriginais: string[] = [];
const arquivosResultado: string[] = [];
@@ -99,7 +100,23 @@ export class PDFController {
arquivosOriginais.push(file.path);
tamanhoOriginal += BigInt(file.size);
const result = await PDFService.compressPDF(file.path, undefined, {
let processedPath = file.path;
// Adiciona OCR se solicitado
if (enableOCR) {
try {
const ocrResult = await PDFService.addOCRLayerToPDF(file.path);
processedPath = ocrResult.outputPath;
// Remove arquivo temporário anterior
if (processedPath !== file.path) {
await fs.unlink(file.path).catch(() => {});
}
} catch (ocrError) {
console.warn('Erro ao adicionar OCR, continuando sem OCR:', ocrError);
}
}
const result = await PDFService.compressPDF(processedPath, undefined, {
quality,
maxSizeMB,
});
@@ -115,6 +132,10 @@ export class PDFController {
outputPath: result.outputPath,
});
// Remove o arquivo intermediário
if (processedPath !== file.path && processedPath !== result.outputPath) {
await fs.unlink(processedPath).catch(() => {});
}
// Remove o arquivo original
await fs.unlink(file.path).catch(() => {});
}
@@ -221,6 +242,16 @@ export class PDFController {
// Divide o PDF
const outputPaths = await PDFService.splitPDF(file.path, options);
// Cria ZIP se houver múltiplos arquivos
let zipPath: string | undefined;
if (outputPaths.length > 1) {
try {
zipPath = await PDFService.createZipFromFiles(outputPaths);
} catch (zipError) {
console.warn('Erro ao criar ZIP, disponibilizando arquivos individuais:', zipError);
}
}
// Calcula tamanho total dos arquivos resultantes
let tamanhoResultado = BigInt(0);
for (const outputPath of outputPaths) {
@@ -235,7 +266,7 @@ export class PDFController {
where: { id: operacaoId },
data: {
status: 'CONCLUIDO',
arquivosResultado: outputPaths,
arquivosResultado: zipPath ? [zipPath, ...outputPaths] : outputPaths,
tamanhoResultado,
tempoProcessamento,
},
@@ -249,6 +280,7 @@ export class PDFController {
operacaoId,
filesCreated: outputPaths.length,
outputPaths,
zipPath,
processingTime: tempoProcessamento,
});
} catch (error) {
@@ -293,6 +325,7 @@ export class PDFController {
return;
}
const enableOCR = req.body.enableOCR === 'true' || req.body.enableOCR === true;
const filePaths = files.map((f) => f.path);
let tamanhoOriginal = BigInt(0);
@@ -316,11 +349,23 @@ export class PDFController {
operacaoId = operacao.id;
// Mescla os PDFs
const outputPath = await PDFService.mergePDFs({
let outputPath = await PDFService.mergePDFs({
filePaths,
outputPath: path.join(process.cwd(), 'storage', 'pdf-output', `merged-${uuidv4()}.pdf`),
});
// Adiciona OCR se solicitado
if (enableOCR) {
try {
const ocrResult = await PDFService.addOCRLayerToPDF(outputPath);
// Remove arquivo anterior
await fs.unlink(outputPath).catch(() => {});
outputPath = ocrResult.outputPath;
} catch (ocrError) {
console.warn('Erro ao adicionar OCR ao PDF mesclado:', ocrError);
}
}
// Calcula tamanho do arquivo resultante
const stats = await fs.stat(outputPath);
const tamanhoResultado = BigInt(stats.size);
@@ -422,6 +467,16 @@ export class PDFController {
pages,
});
// Cria ZIP com todas as imagens
let zipPath: string | undefined;
if (outputPaths.length > 0) {
try {
zipPath = await PDFService.createZipFromFiles(outputPaths);
} catch (zipError) {
console.warn('Erro ao criar ZIP, disponibilizando imagens individuais:', zipError);
}
}
// Calcula tamanho total
let tamanhoResultado = BigInt(0);
for (const outputPath of outputPaths) {
@@ -436,7 +491,7 @@ export class PDFController {
where: { id: operacaoId },
data: {
status: 'CONCLUIDO',
arquivosResultado: outputPaths,
arquivosResultado: zipPath ? [zipPath, ...outputPaths] : outputPaths,
tamanhoResultado,
tempoProcessamento,
},
@@ -450,6 +505,7 @@ export class PDFController {
operacaoId,
imagesCreated: outputPaths.length,
outputPaths,
zipPath,
processingTime: tempoProcessamento,
});
} catch (error) {
@@ -503,6 +559,7 @@ export class PDFController {
const fitToPage = req.body.fitToPage === 'true';
const pageSize = req.body.pageSize ? JSON.parse(req.body.pageSize) : undefined;
const enableOCR = req.body.enableOCR === 'true' || req.body.enableOCR === true;
// Cria registro da operação
const operacao = await prisma.operacaoPDF.create({
@@ -520,13 +577,25 @@ export class PDFController {
operacaoId = operacao.id;
// Converte para PDF
const outputPath = await PDFService.imagesToPDF({
let outputPath = await PDFService.imagesToPDF({
imagePaths,
outputPath: path.join(process.cwd(), 'storage', 'pdf-output', `images-to-pdf-${uuidv4()}.pdf`),
fitToPage,
pageSize,
});
// Adiciona OCR se solicitado
if (enableOCR) {
try {
const ocrResult = await PDFService.addOCRLayerToPDF(outputPath);
// Remove arquivo anterior
await fs.unlink(outputPath).catch(() => {});
outputPath = ocrResult.outputPath;
} catch (ocrError) {
console.warn('Erro ao adicionar OCR ao PDF:', ocrError);
}
}
// Calcula tamanho do arquivo resultante
const stats = await fs.stat(outputPath);
const tamanhoResultado = BigInt(stats.size);