pdf: fix feature
Signed-off-by: Rodrigo Bertoldo de Sousa Martins <rodrigo.sousa.577@gmail.com>
This commit is contained in:
1 parent
f4afe83db0
commit
9cd6208e4f
5 files changed
+441
-72
No files matched your search
@@ -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);
|
||||
|
||||
Reference in new issue
Block a user