Neues Paket internal/pdfconvert nach dem Muster von internal/thumbnail (DOC-04): Konvertierung von Office-Formaten (docx/xlsx/pptx, odt/ods/odp, doc/xls/ppt) zu PDF als Vorschau-/Archivderivat der Datei-Revision, ueber FDN-04 (internal/jobqueue) asynchron mit Wiederholung/Backoff/DLQ verarbeitet. - format.go: einzige Format-/Endungs-Zuordnungsstelle (MIME -> Endung/Label) mit Property-Test, statt paralleler Kopien in Konvertierungsfunktionen (siehe "Bekannte Fehler vermeiden" im Ticket). - convert.go: Generator ruft headless soffice ueber exec.CommandContext mit Zeitlimit auf, eigenes Temp-/Profilverzeichnis je Aufruf (Isolation, kein geteilter Zustand zwischen gleichzeitigen Konvertierungen). - pdfconvert.go: State-Machine (pending/processing/ready/failed) in neuer Tabelle revision_pdf_derivatives (Migration 0016), ein Zustand je Datei-Revision, analog revision_thumbnails. - VER-07 (digitale Signatur) und QA-03 (Pruefgate) bewusst nicht implementiert, keine Schnittstelle dafuer noetig (reines Ablegen eines weiteren Revisions-Derivats, keine Bearbeitungs-/Freigabe-Schnittstelle betroffen). Co-Authored-By: Claude Sonnet 5 <noreply@anthropic.com>
50 lines
1.7 KiB
Go
50 lines
1.7 KiB
Go
package pdfconvert
|
|
|
|
import "strings"
|
|
|
|
// officeFormat beschreibt EIN unterstuetztes Office-Format: MIME-Typ,
|
|
// Dateiendung (fuer soffice zur Filtererkennung noetig) und Bezeichnung
|
|
// fuer source_format. Einzige Stelle, an der Format-/Endungs-Zuordnung
|
|
// gepflegt wird (siehe "Bekannte Fehler vermeiden" im Ticket: keine
|
|
// parallelen Kopien dieser Zuordnung).
|
|
type officeFormat struct {
|
|
mimeType string
|
|
extension string
|
|
label string
|
|
}
|
|
|
|
var supportedFormats = []officeFormat{
|
|
{"application/vnd.openxmlformats-officedocument.wordprocessingml.document", "docx", "docx"},
|
|
{"application/vnd.openxmlformats-officedocument.spreadsheetml.sheet", "xlsx", "xlsx"},
|
|
{"application/vnd.openxmlformats-officedocument.presentationml.presentation", "pptx", "pptx"},
|
|
{"application/vnd.oasis.opendocument.text", "odt", "odt"},
|
|
{"application/vnd.oasis.opendocument.spreadsheet", "ods", "ods"},
|
|
{"application/vnd.oasis.opendocument.presentation", "odp", "odp"},
|
|
{"application/msword", "doc", "doc"},
|
|
{"application/vnd.ms-excel", "xls", "xls"},
|
|
{"application/vnd.ms-powerpoint", "ppt", "ppt"},
|
|
}
|
|
|
|
// lookupFormat liefert die einzige Zuordnungsstelle MIME-Typ -> Endung/Label
|
|
// fuer Konvertierungszwecke. Zweiter Rueckgabewert false = nicht
|
|
// unterstuetztes Format.
|
|
func lookupFormat(mimeType string) (officeFormat, bool) {
|
|
normalized := strings.ToLower(strings.TrimSpace(mimeType))
|
|
for _, f := range supportedFormats {
|
|
if f.mimeType == normalized {
|
|
return f, true
|
|
}
|
|
}
|
|
return officeFormat{}, false
|
|
}
|
|
|
|
// SupportedMimeTypes liefert die Liste unterstuetzter Quell-MIME-Typen, z.B.
|
|
// fuer Dokumentation/Anzeige im UI.
|
|
func SupportedMimeTypes() []string {
|
|
out := make([]string, len(supportedFormats))
|
|
for i, f := range supportedFormats {
|
|
out[i] = f.mimeType
|
|
}
|
|
return out
|
|
}
|