diff --git a/src/lib/einvoice/facturx-pdf.ts b/src/lib/einvoice/facturx-pdf.ts index 809543b..c966cbf 100644 --- a/src/lib/einvoice/facturx-pdf.ts +++ b/src/lib/einvoice/facturx-pdf.ts @@ -24,12 +24,21 @@ const FONT_FILES = { type FontName = keyof typeof FONT_FILES; -let fontCache: Record | null = null; +/** undefined: noch nicht gelesen; null: Schriften fehlen (Rueckfall auf Standardschriften). */ +let fontCache: Record | null | undefined; -function fonts(): Record { - if (!fontCache) { - const entries = Object.entries(FONT_FILES).map(([name, file]) => [name, readFileSync(path.join(FONT_DIR, file))]); - fontCache = Object.fromEntries(entries) as Record; +function fonts(): Record | null { + if (fontCache === undefined) { + try { + const entries = Object.entries(FONT_FILES).map(([name, file]) => [name, readFileSync(path.join(FONT_DIR, file))]); + fontCache = Object.fromEntries(entries) as Record; + } catch (error: unknown) { + // Eine Rechnung darf nie an den Schriften scheitern: ohne sie entsteht + // das PDF mit Standardschriften und eingebettetem XML, nur nicht als + // PDF/A. Laut melden, damit das fehlende Verzeichnis auffaellt. + console.error(`[invoice-pdf] Schriften fuer PDF/A fehlen unter ${FONT_DIR} — Rechnungen ohne PDF/A:`, error); + fontCache = null; + } } return fontCache; } @@ -37,15 +46,17 @@ function fonts(): Record { /** * Optionen fuer new PDFDocument(): PDF/A-3b und eine eingebettete Grundschrift. * Ohne "font" laedt pdfkit beim Anlegen die Standard-Helvetica, die dann - * nicht eingebettet im Dokument stuende. + * nicht eingebettet im Dokument stuende. PDF 1.7 auch im Rueckfall, sonst + * schreibt pdfkit keine XMP-Metadaten (Factur-X-Angaben). */ export function pdfaOptions(): PDFKit.PDFDocumentOptions { + if (!fonts()) return { pdfVersion: "1.7" }; return { pdfVersion: "1.7", subset: "PDF/A-3b", font: path.join(FONT_DIR, FONT_FILES.Helvetica) }; } /** Registriert die eingebetteten Schriften unter den Namen der Standardschriften. */ export function registerEmbeddedFonts(doc: PDFKit.PDFDocument): void { - for (const [name, data] of Object.entries(fonts())) { + for (const [name, data] of Object.entries(fonts() ?? {})) { doc.registerFont(name, data); } }