import 'server-only' import * as React from 'react' import { Document, Page, StyleSheet, Text, View } from '@react-pdf/renderer' import { fuerStandardschrift, pdfErzeugen } from '@/lib/pdf/erzeugen' /** * Das Schreiben als PDF - die Fassung, die in die Akte geht. * * Warum PDF und nicht die Word-Datei? * * Erstens der Ablageschutz: src/lib/speicher/dateityp.ts laesst nur PDF und * Bilder in den Objektspeicher, und zwar nach den Magic Bytes, nicht nach * Endung oder gemeldetem Typ. Eine .docx ist ein ZIP-Archiv; sie * durchzulassen hiesse, jedes ZIP durchzulassen. Diese Pruefung ist eine * bewusste Zusage der Anwendung, und sie fuer eine Bequemlichkeit * aufzuweichen waere der falsche Handel. * * Zweitens die Sache selbst: In der Akte liegt der Nachweis, was * hinausgegangen ist. Dafuer ist ein Format, das sich nicht mehr aendert, * das richtige. Die .docx ist die Arbeitsfassung zum Ausdrucken und * Unterschreiben - sie liegt beim Benutzer, nicht in der Akte. * * Zu beachten: Abgelegt wird der Text, wie er beim Ablegen im Browser * stand. Wer die Word-Datei danach noch aendert, hat in der Akte eine * andere Fassung als im Briefkasten. Die Oberflaeche sagt das dazu. */ const stile = StyleSheet.create({ seite: { paddingTop: 70, paddingBottom: 56, paddingLeft: 71, // 25 mm - da wird gelocht paddingRight: 57, fontSize: 10.5, lineHeight: 1.45, fontFamily: 'Helvetica', color: '#111111', }, zeile: { marginBottom: 0 }, leer: { height: 9 }, betreff: { fontFamily: 'Helvetica-Bold', marginBottom: 4 }, datum: { textAlign: 'right' }, fuss: { position: 'absolute', bottom: 28, left: 71, right: 57, fontSize: 7.5, color: '#777777', textAlign: 'center', }, }) function istBetreff(zeile: string): boolean { return /^Betreff:/i.test(zeile.trim()) } function istDatumszeile(zeile: string): boolean { return /^([A-Za-zÄÖÜäöüß .-]+,\s*)?\d{1,2}\.\d{1,2}\.\d{4}$/.test(zeile.trim()) } export function Briefdokument({ text, erzeugtAm, }: { text: string erzeugtAm: Date }): React.JSX.Element { const zeilen = text.split('\n') return ( {zeilen.map((zeile, i) => { if (zeile.trim() === '') return const stil = istBetreff(zeile) ? [stile.zeile, stile.betreff] : istDatumszeile(zeile) ? [stile.zeile, stile.datum] : stile.zeile return ( {fuerStandardschrift(zeile)} ) })} {fuerStandardschrift( `Aus dem Betreuungs-Cockpit erzeugt am ${erzeugtAm.toLocaleDateString('de-DE')}. ` + 'Diese Fassung liegt in der Akte.', )} ) } /** Fertiges PDF als Buffer, fuer die Ablage im Objektspeicher. */ export async function briefPdfErzeugen(text: string, erzeugtAm: Date): Promise { return pdfErzeugen() }