Files
nexarch/dms/internal/pdfconvert/format.go
T
patrickandClaude Sonnet 5 3fc02ed697 DOC-06: office-zu-pdf-konverter
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>
2026-09-18 13:07:06 +02:00

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
}