Verbesserung Ablagedialog hinsichtlich PDF-Konvertierung und nicht konvertierbaren Dateien
This commit is contained in:
@@ -16,7 +16,8 @@ import {
|
||||
ladeEinstellungen, vollstaendig, sichererName, versionslabel,
|
||||
titelAusBetreff, zugriffsmuster, t
|
||||
} from "./lib/settings.js";
|
||||
import { baueMailPdf, alsEmpfaenger } from "./lib/mailpdf.js";
|
||||
import { baueMailPdf, baueTextPdf, alsEmpfaenger, umwandelbar }
|
||||
from "./lib/mailpdf.js";
|
||||
|
||||
/**
|
||||
* Ergebnis einer Nachrichten-Abfrage vereinheitlichen.
|
||||
@@ -684,11 +685,75 @@ async function datenHolen(auftrag, s) {
|
||||
if (!d.ausgewaehlt) continue;
|
||||
const datei = await browser.messages.getAttachmentFile(
|
||||
d.messageId, d.partName);
|
||||
|
||||
// Aufbereiten nur, wenn der Anwender es gewählt hat UND das Format es
|
||||
// hergibt. Eine Rechnung als PDF ist bereits das Dokument; sie durch
|
||||
// eine Textfassung zu ersetzen wäre Unfug.
|
||||
if (d.alsPdf && umwandelbar(d.contentType, d.name)) {
|
||||
try {
|
||||
out.push(await anhangAlsPdf(datei, d, s));
|
||||
continue;
|
||||
} catch (err) {
|
||||
console.error("[paperless] Anhang konnte nicht aufbereitet werden",
|
||||
d.name, err);
|
||||
// Nicht abbrechen: lieber das Original ablegen als gar nichts.
|
||||
}
|
||||
}
|
||||
out.push({ blob: datei, name: sichererName(d.name) });
|
||||
}
|
||||
return out;
|
||||
}
|
||||
|
||||
/**
|
||||
* Einen Textanhang als PDF aufbereiten, mit der Ursprungsdatei darin.
|
||||
*
|
||||
* Sinnvoll etwa bei einem HTML-Anhang, den im Archiv sonst niemand
|
||||
* ansieht. Für Formate ohne Textinhalt greift diese Funktion nicht -
|
||||
* das prüft umwandelbar() vorher.
|
||||
*/
|
||||
async function anhangAlsPdf(datei, beschreibung, s) {
|
||||
const roh = new Uint8Array(await datei.arrayBuffer());
|
||||
let text = new TextDecoder("utf-8", { fatal: false }).decode(roh);
|
||||
|
||||
const istHtml = /^text\/html$/i.test(beschreibung.contentType || "")
|
||||
|| /\.(html?|xhtml)$/i.test(beschreibung.name || "")
|
||||
|| /<\s*html[\s>]/i.test(text.slice(0, 2000));
|
||||
|
||||
if (istHtml && browser.messengerUtilities?.convertToPlainText) {
|
||||
try {
|
||||
text = await browser.messengerUtilities.convertToPlainText(text);
|
||||
} catch { /* dann bleibt der Rohtext */ }
|
||||
}
|
||||
|
||||
const basis = String(beschreibung.name || "Dokument")
|
||||
.replace(/\.[^.]{1,8}$/, "");
|
||||
|
||||
const pdf = baueTextPdf({
|
||||
titel: basis,
|
||||
text,
|
||||
dateien: [{
|
||||
name: sichererName(beschreibung.name || "original"),
|
||||
daten: roh,
|
||||
mime: beschreibung.contentType || "application/octet-stream",
|
||||
beschreibung: "Originaldatei"
|
||||
}]
|
||||
}, {
|
||||
schrift: Number(s.pdfSchriftgroesse) || 11,
|
||||
format: s.pdfFormat || "a4",
|
||||
rand: {
|
||||
links: Number(s.pdfRandLinks ?? 20),
|
||||
rechts: Number(s.pdfRandRechts ?? 10),
|
||||
oben: Number(s.pdfRandOben ?? 10),
|
||||
unten: Number(s.pdfRandUnten ?? 10)
|
||||
}
|
||||
});
|
||||
|
||||
return {
|
||||
blob: new Blob([pdf], { type: "application/pdf" }),
|
||||
name: sichererName(`${basis}.pdf`)
|
||||
};
|
||||
}
|
||||
|
||||
async function ablegen(nachricht) {
|
||||
const c = await client();
|
||||
const s = await ladeEinstellungen();
|
||||
|
||||
Reference in New Issue
Block a user