diff --git a/src/server/services/PdfService.ts b/src/server/services/PdfService.ts index 4d8f0d9..65db0cb 100644 --- a/src/server/services/PdfService.ts +++ b/src/server/services/PdfService.ts @@ -375,24 +375,28 @@ export class PdfService { } // Fonte Fira Sans (se disponível), senão Helvetica - let font = await pdfDoc.embedFont(StandardFonts.Helvetica); - let fontBold = font, fontItalic = font, fontBoldItalic = font; + let font = null, fontBold = null, fontItalic = null, fontBoldItalic = null; + let useCustomFont = false; try { const firaPath = path.join(process.cwd(), 'public', 'fonts', 'FiraSans-Regular.ttf'); const firaBoldPath = path.join(process.cwd(), 'public', 'fonts', 'FiraSans-Bold.ttf'); const firaItalicPath = path.join(process.cwd(), 'public', 'fonts', 'FiraSans-Italic.ttf'); const firaBoldItalicPath = path.join(process.cwd(), 'public', 'fonts', 'FiraSans-BoldItalic.ttf'); - const [fira, firaBold, firaItalic, firaBoldItalic] = await Promise.all([ + const [fira, firaBoldBuf, firaItalicBuf, firaBoldItalicBuf] = await Promise.all([ fs.readFile(firaPath).catch(() => null), fs.readFile(firaBoldPath).catch(() => null), fs.readFile(firaItalicPath).catch(() => null), fs.readFile(firaBoldItalicPath).catch(() => null), ]); - if (fira) font = await pdfDoc.embedFont(fira); - if (firaBold) fontBold = await pdfDoc.embedFont(firaBold); - if (firaItalic) fontItalic = await pdfDoc.embedFont(firaItalic); - if (firaBoldItalic) fontBoldItalic = await pdfDoc.embedFont(firaBoldItalic); + if (fira) { font = await pdfDoc.embedFont(fira); useCustomFont = true; } + if (firaBoldBuf) fontBold = await pdfDoc.embedFont(firaBoldBuf); + if (firaItalicBuf) fontItalic = await pdfDoc.embedFont(firaItalicBuf); + if (firaBoldItalicBuf) fontBoldItalic = await pdfDoc.embedFont(firaBoldItalicBuf); } catch { /* fallback para Helvetica */ } + if (!font) font = await pdfDoc.embedFont(StandardFonts.Helvetica); + if (!fontBold) fontBold = await pdfDoc.embedFont(StandardFonts.HelveticaBold); + if (!fontItalic) fontItalic = await pdfDoc.embedFont(StandardFonts.HelveticaOblique); + if (!fontBoldItalic) fontBoldItalic = fontBold; // Parse TinyMCE HTML para blocos estilizados const blocks = parseHtmlToBlocks(conteudo); @@ -426,8 +430,11 @@ export class PdfService { if (block.styles.heading === 'h2') blockFontSize = 18; if (block.styles.heading === 'h3') blockFontSize = 16; + // Remove quebras de linha do texto antes de medir e desenhar + const cleanText = (block.text || '').replace(/\r?\n/g, ' '); + let x = margens.left + (block.styles.indent ? FONT_SIZE * 2 : 0); - let width = usedFont.widthOfTextAtSize(block.text, blockFontSize); + let width = usedFont.widthOfTextAtSize(cleanText, blockFontSize); // Centralização if (block.styles.align === 'center' || block.styles.heading === 'h1') { @@ -453,8 +460,8 @@ export class PdfService { y = PAGE_HEIGHT - margens.top; } - // Renderiza o texto - page.drawText(block.text, { + // Renderiza o texto (sem \n) + page.drawText(cleanText, { x, y, size: blockFontSize,