Konverter-Plugin
Dokumente in 45 Zielformate konvertieren
Das Konverter-Plugin verwandelt Doconut in einen Dokumentkonvertierungsdienst. Es liefert die Engine hinter der öffentlichen DocumentConverter‑Fassade und – optional – ein sofort einsetzbares Widget mit eigenem HTTP‑Vertrag, sodass Sie Dokumente aus C#, aus dem Widget oder aus einem von Ihnen selbst geschriebenen Frontend konvertieren können.
Paket installieren
Installieren Sie das neueste stabile Converter-Plugin:
dotnet add package Doconut.NETStandard.ConverterUm das Plugin auf die aktuelle Version 26.8.0 festzulegen, geben Sie die Version separat an:
dotnet add package Doconut.NETStandard.Converter --version 26.8.0Halten Sie das Converter-Paket in derselben Version wie Doconut.NETStandard. Die Paket-ID lautet
Doconut.NETStandard.Converter; .26.8.0 erscheint nur im heruntergeladenen .nupkg‑Dateinamen.
Plugin registrieren
Es gibt keine AddConverter()‑Methode – Doconut's Plugin‑Modell ist einheitlich. Jedes Plugin, einschließlich Converter, wird auf dieselbe Weise registriert: Rufen Sie AddPlugin<TPlugin>() innerhalb von AddDoconut() auf. ConverterPlugin wird in seinem eigenen NuGet‑Paket Doconut.NETStandard.Converter ausgeliefert, das zusammen mit dem Basis‑Viewer‑Paket installiert wird.
builder.Services.AddDoconut(options =>
{
options.LicensePath = "Doconut.Viewer.lic";
options.AddPlugin<Doconut.Plugins.Converter.ConverterPlugin>();
});Dieser Aufruf wirft beim Starten eine Ausnahme, wenn eine Lizenz fehlt, eine veraltete
TRIAL‑Datei vorhanden ist oder eine nicht‑temporäre Lizenz, die dieConverter‑Fähigkeit nicht gewährt – eineInvalidOperationException, die ausAddDoconut()heraus ausgelöst wird, bevor die Anwendung Anfragen bedient. Temporäre Demo/NFR‑Registrierungen werden akzeptiert; nach ihrem Ablauf bleibt die Konvertierung mit einem Wasserzeichen‑Ausgabe verfügbar. Es gibt keine stille Gratis‑Stufe. Siehe Lizenzsetup für Informationen, wie Lizenzen geladen werden.
Konvertieren aus C#
Jede Konvertierung gibt einen durchsuchbaren MemoryStream zurück, der bei 0 positioniert ist und sofort gelesen oder kopiert werden kann. Holen Sie DocumentConverter aus dem DI‑Container, wo immer Sie ihn benötigen – er ist von Grund auf zustandslos, sodass eine einzelne Instanz sicher über mehrere Anfragen hinweg wiederverwendet werden kann.
viewer.Converter.GetConverter() gibt es hier nicht. Die Konvertierung wird nicht mehr über die Viewer‑Instanz aufgerufen: Injizieren Sie stattdessen Doconut.DocumentConverter.
// Inject DocumentConverter; its constructor is internal, so never `new` it.
Stream pdf = await converter.ConvertAsync("contract.docx", ConversionTarget.Pdf, ct: ct);// sourceExtension includes the leading dot. password is null unless the document is protected.
Stream png = await converter.ConvertAsync(upload, ".xlsx", ConversionTarget.Png, password: null, ct: ct);Stream html = await converter.WordToHtmlAsync("report.docx", ct);Stream docx = await converter.HtmlToWordAsync(html, ConversionTarget.Docx, ct);Zwei Details, die leicht falsch gemacht werden können: sourceExtension bei der Stream‑Überladung muss den führenden Punkt enthalten (".xlsx" statt "xlsx" ) – der Konverter vergleicht ihn mit dem Formatkatalog und eine reine Erweiterung wird nicht aufgelöst. Und trotz seines Namens gibt WordToHtmlAsync ein Task<Stream> zurück, nicht ein Task<string> – Sie erhalten das HTML‑Dokument (Bilder als Base64 eingebettet) als Stream, genau wie jedes andere Konvertierungsergebnis.
Zielformate
ConversionTarget (Namespace Doconut.Configs.Conversion) hat 45 Mitglieder:
Pdf, Docx, Doc, Html, Xlsx, Pptx, Png, Jpeg, Csv, Tiff, Bmp, Gif, Svg, Xml,
Txt, Xls, Jp2, Rtf, Odt, Ods, Odp, Epub, Xps, Webp, Msg, Eml, Emlx, Mhtml,
Xlsm, Xlsb, Ppt, Docm, Dot, Dotx, Dotm, Vsdx, Vssx, Vstx, Vsdm, Vssm, Vstm,
Vdx, Vsx, Vtx, IcoDieses eine Enum deckt jede Quellfamilie ab. Die vorherige Bibliothek hatte für jede Familie einen eigenen *ConfigConverter‑Typ – WordConfigConverter, ExcelConfigConverter usw. – jeweils mit einem eigenen verschachtelten EnTargetFormat‑Enum sowie einem SourceFormatConverter‑Enum für die Eingabe. All das ist verschwunden; siehe den Migrationsleitfaden.
Nicht jede Quelle lässt sich in jedes Ziel konvertieren – das Plugin ordnet jeder Formatfamilie der Quelle (Word, Excel, PowerPoint, PDF, CAD, Bild, E‑Mail, Diagramm, Projekt/Aufgabe, PSD, Web‑Dokument) ihr eigenes festes Set zulässiger Ziele zu. Kodieren Sie dieses Enum nicht fest in die Ziel‑Liste Ihrer UI: ?convert=open liefert die tatsächlichen allowedTargets für die gerade hochgeladene Datei, und diese sollten den Picker steuern.
Drop-in-Widget
Die Endpunkte des Widgets ?convert=open|run|download sind standardmäßig optional und deaktiviert — sicher per Vorgabe. Aktivieren Sie sie serverseitig, zusammen mit der Plugin‑Registrierung:
builder.Services.AddDoconut(options =>
{
options.LicensePath = "Doconut.Viewer.lic";
options.AddPlugin<Doconut.Plugins.Converter.ConverterPlugin>();
options.AddConverterWidget(widget =>
{
widget.MaxUploadMb = 25;
});
});<div id="doconut-convert"></div>
<script src="/doconut-res/js/doconutConverter.js"></script>
<script>
Doconut.convert('#doconut-convert', { basePath: '/doconut', resPath: '/doconut-res', maxUploadMb: 25 });
</script>Ohne AddConverterWidget() geben die drei ?convert=‑Endpunkte 404 zurück — die JS‑Datei wird jedoch weiterhin ausgeliefert (es handelt sich um eine einfache eingebettete statische Ressource; nur die Endpunkte, zu denen sie kommuniziert, sind gesperrt). AddConverterWidget() erfordert weiterhin, dass das Converter‑Plugin registriert ist und eine Lizenz vorhanden ist, die Converter gewährt — es verleiht nicht von selbst Konvertierungsrechte.
Widget anpassen
Initialisierungsoptionen, die an Doconut.convert(selector, options) übergeben werden:
| Option | Typ | Standard | Hinweise |
|---|---|---|---|
basePath | string | /doconut | Basis‑Pfad für die ?convert=‑Endpunkte; er muss mit dem ASP.NET‑Zweig übereinstimmen, an dem UseDoconut() tatsächlich eingebunden ist (normalerweise über MiddlewarePath koordiniert) |
resPath | string | /doconut-res | Akzeptiert zur Konsistenz der Konfiguration mit anderen Doconut‑Widgets; das Converter‑Widget erzeugt derzeit keine URL daraus |
maxUploadMb | number | 25 | Nur clientseitige Vorprüfung — verwirft eine zu große Datei vor dem Hochladen. Der Server erzwingt seine eigene Obergrenze unabhängig und gibt 413 zurück, wenn sie überschritten wird |
licenseUrl | string | null | null | Wenn gesetzt, wird der Wasserzeichen‑Hinweis auf dem Ergebnisbildschirm in einen Link zu dieser URL umgewandelt |
labels | object | {} | Überschreibt beliebige Teilmenge der englischen Standardzeichenketten des Widgets (Drop‑Text, Schaltflächen, aria‑live‑Ankündigungen, Fehlermeldungen) |
Rückruffunktionen:
| Callback | Wird ausgelöst, wenn | Nutzdaten |
|---|---|---|
onReady() | Das Widget hat seinen Leerlauf‑/Drop‑Bildschirm gerendert | — |
onSourceLoaded({ token, pages, sourceExt, allowedTargets }) | ?convert=open erfolgreich | Quell‑Session‑Token, Seitenanzahl, Quell‑Erweiterung (ohne führenden Punkt), Liste erlaubter Ziele |
onConverted({ downloadToken, resultToken, resultPages, downloadName, watermarked, target }) | ?convert=run erfolgreich | gleiche Felder wie die Run‑Antwort, plus das angeforderte target |
onDownload({ downloadName, downloadToken }) | Der Benutzer klickt auf den Download‑Link | wird zusammen mit dem nativen Download des Browsers ausgelöst — es wird nicht abgefangen oder ersetzt |
onError({ phase, message }) | Ein Open‑ oder Run‑Request schlägt fehl | phase ist 'open' oder 'run'; message ist der bereinigte Serverfehler (oder eine clientseitige Meldung für die Vorprüfung der Upload‑Größe) |
Doconut.convert() gibt die Widget‑Instanz selbst zurück — behalten Sie sie, um das Widget programmgesteuert zu steuern:
const conv = Doconut.convert('#doconut-convert', { basePath: '/doconut' });
conv.reset(); // zurück zum Leerlauf‑/Drop‑Bildschirm; löst onReady nicht erneut aus
conv.loadFile(file); // startet den Ablauf mit einem File‑Objekt; keine Aktion, wenn nicht im Leerlauf
conv.destroy(); // entfernt Listener, leert den Mount; die Instanz ist danach unbrauchbarEigenes Frontend erstellen
Das Widget ist lediglich ein Client für diesen HTTP‑Vertrag — erstellen Sie ein eigenes Frontend, das direkt darauf zugreift, für ein anderes UX. Alle drei Routen befinden sich unter dem ASP.NET‑Zweig, an dem UseDoconut() eingebunden ist (normalerweise /doconut):
| Route | Zweck | Erfolgsantwort |
|---|---|---|
POST ?convert=open (multipart, field file) | Hochladen und Öffnen eines Quell‑Dokuments zur Vorschau | 200 — { token, pages, sourceExt, allowedTargets } |
POST ?token=<token>&convert=run&target=<ext> | Konvertiert die zwischengespeicherte Quelle zu target | 200 — { downloadToken, resultToken, resultPages, downloadName, watermarked } |
GET ?convert=download&token=<downloadToken> | Streamt die konvertierte Datei | 200 — file bytes, Content-Disposition: attachment, Cache-Control: no-store |
Hochgeladene Quellbytes werden serverseitig mit einer TTL von 30 Minuten zwischengespeichert; sobald dieses Zeitfenster abläuft, gibt run 404 zurück und die Datei muss erneut geöffnet werden. Das konvertierte Ergebnis verbleibt im selben Zwischenspeicher — downloadToken erhält ein eigenes frisches 30‑Minuten‑Fenster, wenn die Konvertierung abgeschlossen ist — während resultToken ein gewöhnliches Viewer‑Session‑Token ist, dessen Lebensdauer dem Session‑Cache des Viewers folgt, unabhängig vom Zwischenspeicher.
sourceExt in der open‑Antwort hat keinen führenden Punkt (z. B. "docx") — die gegenteilige Konvention zum Parameter sourceExtension bei DocumentConverter.ConvertAsync, der einen Punkt erfordert.
Fehlermodi, nach Route gruppiert:
| Route | Status | Wann | Body |
|---|---|---|---|
| any | 404 | Das Widget ist nicht aktiviert (AddConverterWidget() wurde nie aufgerufen) — geprüft, bevor einer der drei Routen verarbeitet wird | nur Status |
| any | 405 | Falsches HTTP‑Verb (open/run erfordern POST; download erfordert GET) | nur Status |
open | 413 | Hochgeladene Datei überschreitet MaxUploadMb | { "error": "File is too large." } |
open | 400 | Kein multipart‑Body, keine Datei oder eine Quell‑Erweiterung, die nicht konvertiert werden kann | { "error": "..." } |
run | 400 | Fehlerhaftes Token (kein GUID) oder ein target, das nicht in einen ConversionTarget geparst werden kann | { "error": "Invalid token." } / { "error": "Unknown target format." } |
run | 400 | target ist nicht in den allowedTargets der Quelle enthalten | { "error": "That target format is not available for this file." } |
run | 404 | Der zwischengespeicherte Upload ist abgelaufen (30‑Minuten‑TTL) oder das Token wurde nie geöffnet | { "error": "Upload expired — please re-open the file." } |
open, run | 500 | Verarbeitung intern fehlgeschlagen | { "error": "<sanitized message>" } — bereinigt auf dieselbe Weise wie jeder andere Doconut‑Fehlerpfad; gibt niemals interne Engine‑Namen preis |
download | 400 | Fehlerhaftes Token (kein GUID) | nur Status |
download | 404 | Unbekanntes oder abgelaufenes Download‑Token | nur Status |
Ressourcenbesitz
Der Konverter gibt einen durchsuchbaren MemoryStream zurück, der bei Null positioniert ist. Der Aufrufer besitzt diesen Stream und sollte ihn nach dem Kopieren oder Zurückgeben seines Inhalts freigeben. Der DocumentConverter‑Dienst selbst ist zustandslos und wird über Dependency Injection aufgelöst; erstellen oder entsorgen Sie den Dienst nicht manuell.
Für das Web‑Widget haben die Upload‑ und Download‑Zwischenspeicher unabhängige TTLs von 30 Minuten. Ein Viewer‑resultToken folgt stattdessen der Lebensdauer der Viewer‑Sitzung. Das Schließen eines Viewer‑Ergebnisses löscht keinen noch gültigen Download‑Zwischenspeicher, und das Zurücksetzen des Browser‑Widgets verlängert keine der beiden TTLs.
Fehlerbehebung
| Symptom | Prüfung |
|---|---|
Auflösen von DocumentConverter schlägt fehl | ConverterPlugin‑Registrierung erfolgte innerhalb von AddDoconut() |
| Anwendung schlägt beim Starten fehl | Die geladene Lizenz gewährt Converter |
| Stream‑Konvertierung gibt an, dass das Format nicht unterstützt wird | sourceExtension enthält den führenden Punkt |
| Widget‑JavaScript wird geladen, aber Anfragen geben 404 zurück | AddConverterWidget() wurde nicht aufgerufen |
| Widget‑Anfragen verwenden die falsche URL | basePath stimmt mit dem Zweig überein, in dem UseDoconut() gemappt ist |
| Ziel fehlt | Verwenden Sie allowedTargets, das von convert=open zurückgegeben wird; nicht jede Quelle unterstützt jedes Enum‑Ziel |
| Download abgelaufen | Wiederholen Sie convert=open/convert=run; Stash‑Tokens sind absichtlich temporär |
Wasserzeichen
Mit registriertem ConverterPlugin befindet sich die Lizenz des Hosts in einem von drei Zuständen:
| Lizenzstatus | Startbedingungen | Ausgabe der Konvertierung |
|---|---|---|
Bezahlte Viewer‑Lizenz, die Converter gewährt, innerhalb ihres Gültigkeitszeitraums | Bestanden | Sauber — watermarked: false |
| Aktive Evaluations‑ (Demo/NFR)‑Lizenz | Bestanden | Konvertiert erfolgreich, versehen mit dem Evaluations‑Wasserzeichen — watermarked: true |
Unlizenziert, eine veraltete TRIAL‑Datei oder eine nicht‑temporäre Lizenz, die Converter nicht gewährt | App startet nie — die oben beschriebene Startbedingung wirft eine Ausnahme | — |
| Abgelaufene temporäre/Demo‑Lizenz | Registrierung überlebt das Ablaufdatum | Konvertiert mit dem Evaluations‑Wasserzeichen — watermarked: true |
Beide Aufrufpfade berechnen das Flag nach derselben Regel: Die C#‑Fassade des DocumentConverter leitet es intern aus dem IsViewerLicensed‑ und IsTemporary‑Zustand der Lizenz ab, und der ?convert=run‑Handler des Widgets führt die äquivalente Prüfung (IsViewerLicensed && !IsTrial && !IsTemporary) durch, um das zurückgegebene Feld watermarked zu füllen. Eine Integration kann end‑to‑end auf einer Evaluations‑Lizenz vor dem Kauf aufgebaut und getestet werden — nur die Ausgabebytes ändern sich.
War diese Seite hilfreich?