Verbesserung Ablagedialog hinsichtlich PDF-Konvertierung und nicht konvertierbaren Dateien
This commit is contained in:
@@ -190,6 +190,79 @@ function kopfblock(d, daten, groesse) {
|
||||
d.y = oben - hoehe;
|
||||
}
|
||||
|
||||
/**
|
||||
* Beliebigen Text als PDF setzen, mit der Ursprungsdatei als Anhang.
|
||||
*
|
||||
* Für Anhänge, die Text enthalten - HTML, Nur-Text, eingebettete
|
||||
* Nachrichten. Formate wie DOCX oder XLSX lassen sich hier NICHT
|
||||
* umwandeln; dafür bräuchte es eine Darstellungsmaschine.
|
||||
*/
|
||||
export function baueTextPdf(daten, opt = {}) {
|
||||
const basis = begrenzen(Number(opt.schrift) || 11, 7, 16);
|
||||
const papier = FORMATE[String(opt.format || "a4").toLowerCase()]
|
||||
|| FORMATE.a4;
|
||||
const r = opt.rand || {};
|
||||
const grenze = (wert, vorgabe) =>
|
||||
Math.min(papier.breite / 3, Math.max(0, Number(wert) ?? vorgabe));
|
||||
|
||||
const d = new PdfDokument({
|
||||
titel: daten.titel || "Dokument",
|
||||
breite: mm(papier.breite),
|
||||
hoehe: mm(papier.hoehe),
|
||||
randLinks: mm(grenze(r.links ?? 20, 20)),
|
||||
randRechts: mm(grenze(r.rechts ?? 10, 10)),
|
||||
randOben: mm(grenze(r.oben ?? 10, 10)),
|
||||
randUnten: mm(grenze(r.unten ?? 10, 10))
|
||||
});
|
||||
d.neueSeite();
|
||||
|
||||
d.absatz(daten.titel || "Dokument",
|
||||
{ groesse: basis + 2, fett: true, abstand: 1.25 });
|
||||
d.abstand(6);
|
||||
d.linie();
|
||||
d.abstand(8);
|
||||
|
||||
const text = String(daten.text ?? "").replace(/\r\n?/g, "\n").trimEnd();
|
||||
if (text) {
|
||||
for (const zeile of text.split("\n")) {
|
||||
d.absatz(zeile || " ", { groesse: basis, abstand: 1.35 });
|
||||
}
|
||||
} else {
|
||||
d.absatz("(kein Textinhalt - siehe eingebettete Originaldatei)",
|
||||
{ groesse: basis, farbe: GRAU_TEXT });
|
||||
}
|
||||
|
||||
d.abstand(10);
|
||||
d.linie();
|
||||
d.absatz("Aus der Originaldatei erzeugt, die diesem PDF beiliegt.",
|
||||
{ groesse: Math.max(6.5, basis - 3), farbe: GRAU_TEXT });
|
||||
|
||||
for (const f of daten.dateien ?? []) {
|
||||
d.anhang(f.name, f.daten, {
|
||||
beschreibung: f.beschreibung || "",
|
||||
mime: f.mime || "application/octet-stream"
|
||||
});
|
||||
}
|
||||
return d.bauen();
|
||||
}
|
||||
|
||||
/**
|
||||
* Lässt sich diese Datei als PDF aufbereiten?
|
||||
*
|
||||
* Nur was Text enthält. Bei DOCX oder XLSX müsste die Erweiterung das
|
||||
* Format auswerten und setzen - dafür gibt es keine Grundlage.
|
||||
*/
|
||||
export function umwandelbar(mime, name = "") {
|
||||
const m = String(mime || "").toLowerCase();
|
||||
if (/^text\//.test(m)) return true;
|
||||
if (m === "message/rfc822") return true;
|
||||
if (["application/json", "application/xml", "application/xhtml+xml",
|
||||
"application/rtf"].includes(m)) return true;
|
||||
// Manche Server melden alles als octet-stream. Dann entscheidet die
|
||||
// Endung.
|
||||
return /\.(txt|htm|html|xml|json|csv|md|log|eml)$/i.test(String(name));
|
||||
}
|
||||
|
||||
function begrenzen(wert, min, max) {
|
||||
return Math.min(max, Math.max(min, wert));
|
||||
}
|
||||
|
||||
Reference in New Issue
Block a user