fix atendimentos.ts
Signed-off-by: Rodrigo Martins <rodrigo.sousa.577@gmail.com>
This commit is contained in:
1 parent
33d9fe8688
commit
8816cad6ef
7 files changed
+248
-122
No files matched your search
@@ -248,113 +248,108 @@ export class PdfService {
|
||||
`;
|
||||
}
|
||||
|
||||
async gerarPDF(conteudo: string, escritorio: any) {
|
||||
async gerarPDF(html: string): Promise<Buffer> {
|
||||
try {
|
||||
// 1. Buscar configuração do template
|
||||
const config = await prisma.configuracaoDocumento.findFirst({
|
||||
orderBy: { criadoEm: 'desc' }
|
||||
});
|
||||
console.log('Iniciando geração de PDF com Firefox...');
|
||||
|
||||
// 2. Gerar PDF do conteúdo
|
||||
// Forçar uso do Firefox explicitamente
|
||||
process.env.PUPPETEER_PRODUCT = 'firefox';
|
||||
|
||||
const browser = await puppeteer.launch({
|
||||
headless: 'new',
|
||||
args: ['--no-sandbox']
|
||||
product: 'firefox',
|
||||
headless: true,
|
||||
executablePath: '/usr/bin/firefox-esr', // Caminho explícito para o Firefox
|
||||
args: [
|
||||
'--no-sandbox',
|
||||
'--headless',
|
||||
],
|
||||
ignoreHTTPSErrors: true,
|
||||
timeout: 60000
|
||||
});
|
||||
|
||||
const page = await browser.newPage();
|
||||
console.log('Firefox iniciado com sucesso');
|
||||
|
||||
// Usar template padrão ou fallback para o template básico
|
||||
const template = config?.templatePadrao || `
|
||||
<!DOCTYPE html>
|
||||
<html>
|
||||
<head>
|
||||
<link href="https://fonts.googleapis.com/css2?family=Fira+Sans:wght@400;500;700&display=swap" rel="stylesheet">
|
||||
<style>
|
||||
body {
|
||||
font-family: 'Fira Sans', Arial, sans-serif;
|
||||
font-size: 11pt;
|
||||
line-height: 1.3;
|
||||
margin: 0;
|
||||
padding: 0;
|
||||
}
|
||||
|
||||
.content {
|
||||
margin: 0;
|
||||
padding: 0;
|
||||
min-height: calc(100vh - 58mm);
|
||||
position: relative;
|
||||
}
|
||||
|
||||
p { margin: 0.7em 0; }
|
||||
h1, h2, h3 { margin: 0.8em 0; }
|
||||
</style>
|
||||
</head>
|
||||
<body>
|
||||
<div class="content">
|
||||
${conteudo}
|
||||
</div>
|
||||
</body>
|
||||
</html>
|
||||
`;
|
||||
|
||||
// Processar o template substituindo variáveis
|
||||
const templateProcessado = template.replace(/\{\{(.+?)\}\}/g, (match, key) => {
|
||||
return escritorio[key.trim()] || match;
|
||||
});
|
||||
|
||||
await page.setContent(templateProcessado);
|
||||
|
||||
const margens = config?.margensTemplate || {
|
||||
top: '35mm',
|
||||
bottom: '29mm',
|
||||
left: '25mm',
|
||||
right: '25mm'
|
||||
};
|
||||
|
||||
const contentPdfBuffer = await page.pdf({
|
||||
format: 'A4',
|
||||
margin: margens,
|
||||
displayHeaderFooter: false,
|
||||
printBackground: true
|
||||
});
|
||||
|
||||
await browser.close();
|
||||
|
||||
// 2. Carregar os PDFs
|
||||
const templatePath = path.join(process.cwd(), 'public', 'uploads', 'Timbrado_2025.pdf');
|
||||
const templateBytes = await fs.readFile(templatePath);
|
||||
|
||||
const templateDoc = await PDFDocument.load(templateBytes);
|
||||
const contentDoc = await PDFDocument.load(contentPdfBuffer);
|
||||
|
||||
// 3. Criar documento final
|
||||
const pdfDoc = await PDFDocument.create();
|
||||
|
||||
// 4. Copiar template e conteúdo
|
||||
const [templatePage] = await templateDoc.copyPages(templateDoc, [0]);
|
||||
const contentPages = await contentDoc.getPages();
|
||||
|
||||
// 5. Para cada página do conteúdo
|
||||
for (let i = 0; i < contentPages.length; i++) {
|
||||
// Primeiro: adicionar template
|
||||
const page = await pdfDoc.embedPage(templatePage);
|
||||
const contentPage = await pdfDoc.embedPage(contentPages[i]);
|
||||
try {
|
||||
const page = await browser.newPage();
|
||||
|
||||
// Segundo: criar nova página
|
||||
const newPage = pdfDoc.addPage([page.width, page.height]);
|
||||
// Configurar timeout maior
|
||||
await page.setDefaultNavigationTimeout(60000);
|
||||
await page.setDefaultTimeout(60000);
|
||||
|
||||
// Terceiro: desenhar template e conteúdo
|
||||
newPage.drawPage(page);
|
||||
newPage.drawPage(contentPage);
|
||||
// Configurar viewport para garantir dimensões de papel corretas
|
||||
await page.setViewport({
|
||||
width: 1240,
|
||||
height: 1754,
|
||||
deviceScaleFactor: 1,
|
||||
});
|
||||
|
||||
console.log('Configurando conteúdo...');
|
||||
|
||||
// Usar método mais simples de configuração de conteúdo
|
||||
await page.setContent(html, {
|
||||
timeout: 60000,
|
||||
waitUntil: 'networkidle0'
|
||||
});
|
||||
|
||||
console.log('Conteúdo configurado, gerando PDF...');
|
||||
|
||||
// Gerar PDF com configurações padronizadas
|
||||
const pdf = await page.pdf({
|
||||
format: 'A4',
|
||||
printBackground: true,
|
||||
margin: {
|
||||
top: '20mm',
|
||||
right: '20mm',
|
||||
bottom: '20mm',
|
||||
left: '20mm'
|
||||
},
|
||||
preferCSSPageSize: true
|
||||
});
|
||||
|
||||
console.log('PDF gerado com sucesso');
|
||||
return pdf;
|
||||
} finally {
|
||||
// Garantir que o navegador será fechado mesmo em caso de erro
|
||||
await browser.close();
|
||||
console.log('Navegador fechado');
|
||||
}
|
||||
|
||||
// 6. Gerar PDF final
|
||||
const pdfBytes = await pdfDoc.save();
|
||||
return Buffer.from(pdfBytes);
|
||||
|
||||
} catch (error) {
|
||||
console.error('Erro ao gerar PDF:', error);
|
||||
throw new Error('Falha ao gerar PDF');
|
||||
console.error('Erro detalhado ao gerar PDF com Firefox:', error);
|
||||
|
||||
// Tentar abordagem alternativa com PDFKit
|
||||
try {
|
||||
console.log('Tentando abordagem alternativa com PDFKit...');
|
||||
const PDFDocument = require('pdfkit');
|
||||
const pdf = new PDFDocument();
|
||||
|
||||
let buffers = [];
|
||||
pdf.on('data', buffers.push.bind(buffers));
|
||||
|
||||
pdf.fontSize(16).text('Erro ao gerar PDF', {
|
||||
align: 'center'
|
||||
});
|
||||
|
||||
pdf.moveDown();
|
||||
pdf.fontSize(12).text('Não foi possível gerar o PDF com o conteúdo solicitado.', {
|
||||
align: 'center'
|
||||
});
|
||||
|
||||
pdf.moveDown();
|
||||
pdf.fontSize(10).text('Por favor, tente novamente mais tarde ou contate o suporte.', {
|
||||
align: 'center'
|
||||
});
|
||||
|
||||
pdf.end();
|
||||
|
||||
return new Promise((resolve) => {
|
||||
pdf.on('end', () => {
|
||||
resolve(Buffer.concat(buffers));
|
||||
});
|
||||
});
|
||||
} catch (fallbackError) {
|
||||
console.error('Falha também na abordagem alternativa:', fallbackError);
|
||||
throw new Error('Falha ao gerar PDF');
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
Reference in new issue
Block a user