tenta fix pdfservice.js
This commit is contained in:
1 parent
5b25414b9c
commit
705ef97ff8
1 file changed
+18
-36
@@ -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),
|
||||||
|
|||||||
Reference in new issue
Block a user