From 43cc832274561310e625ee7b84a258a9beb72eb9 Mon Sep 17 00:00:00 2001 From: Rodrigo Martins Date: Tue, 22 Apr 2025 15:19:48 -0300 Subject: [PATCH] tenta fix pdfservice.js --- src/server/services/PdfService.ts | 36 +++++++++++++++++++++++++++++-- 1 file changed, 34 insertions(+), 2 deletions(-) diff --git a/src/server/services/PdfService.ts b/src/server/services/PdfService.ts index 206a59d..067e012 100644 --- a/src/server/services/PdfService.ts +++ b/src/server/services/PdfService.ts @@ -1,4 +1,7 @@ import puppeteer from 'puppeteer'; +import { PDFDocument } from 'pdf-lib'; +import fs from 'fs/promises'; +import path from 'path'; import { prisma } from '../prismaClient'; // Função utilitária para converter pixels em milímetros (1px ≈ 0.264583 mm) @@ -103,7 +106,7 @@ export class PdfService { `; } - // Gera PDF a partir do HTML, respeitando margens e timbrado + // Gera PDF a partir do HTML, depois sobrepõe o timbrado em cada página async gerarPDF(conteudo: string) { try { const config = await this.getConfiguracao(); @@ -128,7 +131,36 @@ export class PdfService { preferCSSPageSize: true }); await browser.close(); - return Buffer.from(pdfBuffer); + + // Se não houver timbrado, retorna direto + if (!config.timbradoUrl) { + return Buffer.from(pdfBuffer); + } + + // Caminho absoluto do PDF de timbrado + const timbradoPath = config.timbradoUrl.startsWith('/uploads') + ? path.join(process.cwd(), 'public', config.timbradoUrl) + : path.join(process.cwd(), 'public', 'uploads', path.basename(config.timbradoUrl)); + let timbradoBytes: Buffer; + try { + timbradoBytes = await fs.readFile(timbradoPath); + } catch (e) { + console.error('Timbrado não encontrado:', timbradoPath); + return Buffer.from(pdfBuffer); + } + + // Mescla cada página do PDF gerado com o timbrado + const pdfDoc = await PDFDocument.load(pdfBuffer); + const timbradoDoc = await PDFDocument.load(timbradoBytes); + const timbradoPage = timbradoDoc.getPage(0); + const [timbradoEmbed] = await pdfDoc.embedPages([timbradoPage]); + const pageCount = pdfDoc.getPageCount(); + for (let i = 0; i < pageCount; i++) { + const page = pdfDoc.getPage(i); + page.drawPage(timbradoEmbed, { x: 0, y: 0, width: page.getWidth(), height: page.getHeight() }); + } + const mergedPdf = await pdfDoc.save(); + return Buffer.from(mergedPdf); } catch (error) { console.error('Erro ao gerar PDF:', error); throw new Error('Falha ao gerar PDF');