tenta fix pdfservice.js

This commit is contained in:
rodrigo committed 2025-04-22 15:09:42 -03:00
1 parent 5b25414b9c
commit 705ef97ff8
1 file changed
+18 -36
+18 -36
View File
@@ -2,51 +2,37 @@ import puppeteer from 'puppeteer';
import { prisma } from '../prismaClient'; import { prisma } from '../prismaClient';
// Função utilitária para converter pixels em milímetros (1px ≈ 0.264583 mm) // Função utilitária para converter pixels em milímetros (1px ≈ 0.264583 mm)
function pxToMm(px: number): string { function pxToMm(px: number | null | undefined): string {
if (!px) return '0mm';
return (px * 0.264583).toFixed(2) + 'mm'; return (px * 0.264583).toFixed(2) + 'mm';
} }
export class PdfService { export class PdfService {
// Busca configuração do documento, usando apenas campos válidos do schema
private async getConfiguracao() { private async getConfiguracao() {
try { try {
// Buscar configuração ou usar valores padrão
const config = await prisma.configuracaoDocumento.findFirst({ const config = await prisma.configuracaoDocumento.findFirst({
orderBy: { criadoEm: 'desc' }, orderBy: { criadoEm: 'desc' },
select: { select: {
id: true, id: true,
headerImageUrl: true,
footerImageUrl: true,
logoUrl: true,
timbradoUrl: true, timbradoUrl: true,
timbradoMarginTop: true, timbradoMarginTop: true,
timbradoMarginBottom: true, timbradoMarginBottom: true,
timbradoMarginLeft: true, timbradoMarginLeft: true,
timbradoMarginRight: true, timbradoMarginRight: true,
cabecalhoHtml: true, templatePadrao: true,
rodapeHtml: true, margensTemplate: true,
criadoEm: true criadoEm: true
} }
}); });
// Retorna configuração padrão se não existir
// Retornar configuração padrão se não existir
return { return {
cabecalhoHtml: config?.cabecalhoHtml || `
<div style="text-align: center; padding: 20px;">
<h2 style="margin:0;font-size:14pt">{{escritorio.nome}}</h2>
</div>
`,
rodapeHtml: config?.rodapeHtml || `
<div style="text-align: center; font-size: 10pt;">
{{escritorio.endereco}}<br>
Tel: {{escritorio.telefone}} | Email: {{escritorio.email}}
</div>
`,
logoUrl: config?.logoUrl || '',
timbradoUrl: config?.timbradoUrl || '', timbradoUrl: config?.timbradoUrl || '',
timbradoMarginTop: config?.timbradoMarginTop || 100, timbradoMarginTop: config?.timbradoMarginTop ?? 100,
timbradoMarginBottom: config?.timbradoMarginBottom || 50, timbradoMarginBottom: config?.timbradoMarginBottom ?? 50,
timbradoMarginLeft: config?.timbradoMarginLeft || 50, timbradoMarginLeft: config?.timbradoMarginLeft ?? 50,
timbradoMarginRight: config?.timbradoMarginRight || 50 timbradoMarginRight: config?.timbradoMarginRight ?? 50,
templatePadrao: config?.templatePadrao || '',
}; };
} catch (error) { } catch (error) {
console.error('Erro ao buscar configuração:', error); console.error('Erro ao buscar configuração:', error);
@@ -54,12 +40,11 @@ export class PdfService {
} }
} }
// Gera HTML com timbrado e margens
private gerarHTML(content: string, config: any) { private gerarHTML(content: string, config: any) {
const timbradoUrl = config.timbradoUrl const timbradoUrl = config.timbradoUrl
? `${process.env.FRONTEND_URL || 'http://localhost:5000'}${config.timbradoUrl}` ? `${process.env.FRONTEND_URL || 'http://localhost:5000'}${config.timbradoUrl}`
: ''; : '';
// CSS para background em todas as páginas
return ` return `
<!DOCTYPE html> <!DOCTYPE html>
<html> <html>
@@ -116,21 +101,18 @@ export class PdfService {
`; `;
} }
async gerarPDF(conteudo: string, escritorio: any) { // Gera PDF a partir do HTML, respeitando margens e timbrado
async gerarPDF(conteudo: string) {
try { try {
const config = await this.getConfiguracao(); const config = await this.getConfiguracao();
const html = this.gerarHTML(conteudo, config); // Usa templatePadrao se não houver conteúdo
const html = this.gerarHTML(conteudo || config.templatePadrao, config);
const browser = await puppeteer.launch({ const browser = await puppeteer.launch({ headless: true, args: ['--no-sandbox'] });
headless: 'new',
args: ['--no-sandbox']
});
const page = await browser.newPage(); const page = await browser.newPage();
await page.setContent(html, { await page.setContent(html, {
waitUntil: ['networkidle0', 'load'], waitUntil: ['networkidle0', 'load'],
timeout: 30000 timeout: 30000
}); });
// Margens convertidas para mm
const margin = { const margin = {
top: pxToMm(config.timbradoMarginTop), top: pxToMm(config.timbradoMarginTop),
bottom: pxToMm(config.timbradoMarginBottom), bottom: pxToMm(config.timbradoMarginBottom),