Converter-Plugin
Dokumente in 24 Zielformate konvertieren
Das Converter‑Plugin verwandelt Doconut in einen Dokument‑Konvertierungsservice. Es stellt die Engine hinter der öffentlichen DocumentConverter‑Fassade bereit und – optional – ein Drop‑in‑Widget mit eigenem HTTP‑Vertrag, sodass Sie Dokumente aus C#, aus dem Widget oder aus einem selbst geschriebenen Frontend konvertieren können.
Paket installieren
Installieren Sie das neueste stabile Converter‑Plugin:
dotnet add package Doconut.NET6.ConverterUm das Plugin auf die aktuelle Version 26.7.0 festzulegen, geben Sie die Version separat an:
dotnet add package Doconut.NET6.Converter --version 26.7.0Halten Sie das Converter‑Paket in derselben Version wie Doconut.NET6. Die Paket‑ID lautet
Doconut.NET6.Converter; .26.7.0 erscheint nur im heruntergeladenen .nupkg‑Dateinamen.
Plugin registrieren
Es gibt keine AddConverter()‑Methode – Doconut’s Plugin‑Modell ist einheitlich. Jedes Plugin, Converter eingeschlossen, wird auf dieselbe Weise registriert: Rufen Sie AddPlugin<TPlugin>() innerhalb von AddDoconut() auf. ConverterPlugin wird in seinem eigenen NuGet‑Paket Doconut.NET6.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 vorliegt oder eine nicht‑temporäre Lizenz 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 Ablauf ihres Kalenders bleibt die Konvertierung mit Wasserzeichen‑Ausgabe verfügbar. Es gibt keine stillschweigende Gratis‑Stufe. Siehe Lizenzsetup für das Laden von Lizenzen.
Konvertieren aus C#
Jede Konvertierung liefert einen seek‑fähigen MemoryStream, der bei 0 positioniert ist und sofort gelesen oder kopiert werden kann. Lösen Sie DocumentConverter über DI dort auf, wo Sie ihn benötigen – er ist per Design zustandslos, sodass eine einzelne Instanz sicher über mehrere Anfragen hinweg wiederverwendet werden kann.
// 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", nicht "xlsx" ) – der Konverter vergleicht dies mit dem Formatkatalog und ein bloßer Extension‑String wird nicht aufgelöst. Und trotz des Namens liefert WordToHtmlAsync Task<Stream>, nicht Task<string> – Sie erhalten das HTML‑Dokument (Bilder als Base64 eingebettet) als Stream, genau wie jedes andere Konvertierungsergebnis.
Zielformate
Pdf, Docx, Doc, Html, Xlsx, Pptx, Png, Jpeg, Csv, Tiff, Bmp, Gif, Svg, Xml,
Txt, Xls, Jp2, Rtf, Odt, Ods, Odp, Epub, Xps, WebpNicht jedes Quellformat lässt sich in jedes Zielformat konvertieren – das Plugin ordnet jede Quell‑Formatfamilie (Word, Excel, PowerPoint, PDF, CAD, Bild, E‑Mail, Diagramm, Projekt/Aufgabe, PSD, Web‑Dokument) einem festen Satz zulässiger Ziele zu. Kodieren Sie dieses Enum nicht fest in Ihrer UI: ?convert=open liefert die tatsächlichen allowedTargets für die gerade hochgeladene Datei, und diese sollten die Auswahl bestimmen.
Drop‑in‑Widget
Die Endpunkte des Widgets ?convert=open|run|download sind optional und standardmäßig 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() antworten die drei ?convert=‑Endpunkte mit 404 – die JS‑Datei selbst wird jedoch weiterhin ausgeliefert (es ist eine einfache eingebettete statische Ressource; nur die Endpunkte, mit denen sie kommuniziert, sind gesperrt). AddConverterWidget() erfordert weiterhin, dass das Converter‑Plugin registriert ist und eine Lizenz vorliegt, die Converter gewährt – es verleiht nicht von selbst Konvertierungsrechte.
Widget anpassen
Initiale Optionen, die an Doconut.convert(selector, options) übergeben werden:
| Option | Typ | Standard | Hinweis |
|---|---|---|---|
basePath | string | /doconut | Basis‑Pfad für die ?convert=‑Endpunkte; er muss mit dem ASP.NET‑Zweig übereinstimmen, an dem UseDoconut() tatsächlich gemountet ist (normalerweise über MiddlewarePath koordiniert) |
resPath | string | /doconut-res | Wird aus Konsistenzgründen mit anderen Doconut‑Widgets akzeptiert; das Converter‑Widget baut derzeit keine URL daraus |
maxUploadMb | number | 25 | Nur clientseitige Vorprüfung – verwirft zu große Dateien vor dem Hochladen. Der Server erzwingt seine eigene Obergrenze unabhängig und antwortet mit 413, wenn sie überschritten wird |
licenseUrl | string | null | null | Wenn gesetzt, wird der Wasserzeichen‑Hinweis auf dem Ergebnisbildschirm zu einem Link zu dieser URL |
labels | object | {} | Überschreibt beliebige Teilmenge der englischen Standard‑Strings des Widgets (Platzhalter‑Text, Buttons, aria‑live‑Ankündigungen, Fehlermeldungen) |
Callbacks:
| Callback | Wird ausgelöst, wenn | Nutzdaten |
|---|---|---|
onReady() | Das Widget hat seinen Leerlauf‑/Drop‑Screen gerendert | — |
onSourceLoaded({ token, pages, sourceExt, allowedTargets }) | ?convert=open erfolgreich | Sitzungs‑Token, Seitenzahl, Quell‑Extension (ohne führenden Punkt), erlaubte Zielliste |
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 den Download‑Link | wird zusammen mit dem nativen Browser‑Download 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 die bereinigte Server‑Fehlermeldung (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‑Screen; löst onReady nicht erneut aus
conv.loadFile(file); // startet den Ablauf mit einem File‑Objekt; hat keine Wirkung, wenn nicht im Leerlauf |
conv.destroy(); // entfernt Listener, leert den Mount‑Punkt; die Instanz ist danach unbrauchbarEigenes Frontend bauen
Das Widget ist lediglich ein Client für diesen HTTP‑Vertrag – bauen Sie Ihr eigenes Frontend direkt darauf für ein anderes UX. Alle drei Routen liegen unter dem ASP.NET‑Zweig, an dem UseDoconut() gemountet ist (normalerweise /doconut):
| Route | Zweck | Erfolgs‑Antwort |
|---|---|---|
POST ?convert=open (multipart, Feld file) | Hochladen und Öffnen eines Quell‑Dokuments zur Vorschau | 200 – { token, pages, sourceExt, allowedTargets } |
POST ?token=<token>&convert=run&target=<ext> | Konvertieren der zwischengespeicherten Quelle zu target | 200 – { downloadToken, resultToken, resultPages, downloadName, watermarked } |
GET ?convert=download&token=<downloadToken> | Streamen der konvertierten Datei | 200 – Dateibytes, Content-Disposition: attachment, Cache-Control: no-store |
Hochgeladene Quellbytes werden serverseitig mit einer TTL von 30 Minuten zwischengespeichert; nach Ablauf dieses Fensters antwortet run mit 404 und die Datei muss erneut geöffnet werden. Das konvertierte Ergebnis verbleibt im selben Speicher – downloadToken erhält sein eigenes frisches 30‑Minuten‑Fenster, sobald die Konvertierung abgeschlossen ist – während resultToken ein gewöhnlicher Viewer‑Sitzungs‑Token ist, dessen Lebensdauer der Viewer‑Sitzungs‑Cache bestimmt, unabhängig vom Zwischenspeicher.
sourceExt in der open‑Antwort hat keinen führenden Punkt (z. B. "docx" ) – das ist das Gegenstück zum Parameter sourceExtension von DocumentConverter.ConvertAsync, der einen Punkt verlangt.
Fehlermodi, gruppiert nach Route:
| 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 benötigen POST; download benötigt GET) | nur Status |
open | 413 | Hochgeladene Datei überschreitet MaxUploadMb | { "error": "File is too large." } |
open | 400 | Kein multipart‑Body, keine Datei oder eine Quell‑Extension, die nicht konvertierbar ist | { "error": "..." } |
run | 400 | Fehlformatiger Token (kein GUID) oder ein target, das nicht in 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 der Token wurde nie geöffnet | { "error": "Upload expired — please re-open the file." } |
open, run | 500 | Interner Verarbeitungsfehler | { "error": "<sanitized message>" } – auf dieselbe Weise bereinigt wie jeder andere Doconut‑Fehlerpfad; interne Engine‑Namen werden nie geleakt |
download | 400 | Fehlformatierter Token (kein GUID) | nur Status |
download | 404 | Unbekannter oder abgelaufener Download‑Token | nur Status |
Ressourcen‑Eigentum
Der Konverter liefert einen seek‑fähigen MemoryStream, der bei Null positioniert ist. Der Aufrufer besitzt diesen Stream und sollte ihn nach dem Kopieren oder Zurückgeben des Inhalts freigeben. Der DocumentConverter‑Dienst selbst ist zustandslos und wird über Dependency Injection aufgelöst; bauen Sie den Dienst nicht manuell auf und geben Sie ihn nicht frei.
Für das Web‑Widget haben die Upload‑ und Download‑Zwischenspeicher unabhängige TTLs von 30 Minuten. Ein Viewer‑resultToken folgt 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.
Fehlersuche
| 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 meldet nicht unterstütztes Format | sourceExtension enthält den führenden Punkt |
| Widget‑JavaScript lädt, aber Anfragen erhalten 404 | AddConverterWidget() wurde nicht aufgerufen |
| Widget‑Anfragen verwenden falsche URL | basePath stimmt mit dem Zweig überein, an dem UseDoconut() gemappt ist |
| Ziel fehlt | Verwenden Sie allowedTargets, die von convert=open zurückgegeben werden; nicht jede Quelle unterstützt jedes Enum‑Ziel |
| Download abgelaufen | Wiederholen Sie convert=open/convert=run; Zwischenspeicher‑Tokens sind bewusst temporär |
Wasserzeichen
Mit registriertem ConverterPlugin befindet sich die Lizenz des Hosts in einem von drei Zuständen:
| Lizenz‑Zustand | Start‑Gate | Konvertierungs‑Ausgabe |
|---|---|---|
Bezahlte Viewer‑Lizenz, die Converter gewährt, innerhalb der Gültigkeitsdauer | Besteht | Sauber – watermarked: false |
| Aktive Evaluations‑ (Demo/NFR)‑Lizenz | Besteht | Konvertiert erfolgreich, versehen mit dem Evaluations‑Wasserzeichen – watermarked: true |
Unlizenzierte, veraltete TRIAL‑Datei oder nicht‑temporäre Lizenz, die Converter nicht gewährt | Anwendung startet nie – das oben beschriebene Start‑Gate wirft | — |
| 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 DocumentConverter leitet es intern aus den Lizenz‑Eigenschaften IsViewerLicensed und IsTemporary ab, und der Widget‑Handler ?convert=run führt die äquivalente Prüfung (IsViewerLicensed && !IsTrial && !IsTemporary) durch, um das zurückgegebene Feld watermarked zu füllen. Eine Integration kann komplett auf einer Evaluations‑Lizenz aufgebaut und getestet werden, bevor ein Kauf erfolgt – nur die Ausgabebytes ändern sich.
War diese Seite hilfreich?