Konverter-Plugin
Dokumente in 24 Zielformate konvertieren
Das Konverter-Plugin verwandelt Doconut in einen Dokumentkonvertierungsdienst. Es liefert die Engine hinter der öffentlichen DocumentConverter-Fassade und – optional – ein Plug‑in‑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 Konverter-Plugin:
dotnet add package Doconut.NET8.ConverterUm das Plugin an die aktuelle Version 26.7.0 zu binden, geben Sie die Version separat an:
dotnet add package Doconut.NET8.Converter --version 26.7.0Halten Sie das Konverter-Paket in derselben Version wie Doconut.NET8. Die Paket-ID ist Doconut.NET8.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, einschließlich Konverter, wird auf dieselbe Weise registriert: Rufen Sie AddPlugin<TPlugin>() innerhalb von AddDoconut() auf. ConverterPlugin wird in seinem eigenen NuGet‑Paket, Doconut.NET8.Converter, geliefert und zusammen mit dem Basis‑Viewer‑Paket installiert.
builder.Services.AddDoconut(options =>
{
options.LicensePath = "Doconut.Viewer.lic";
options.AddPlugin<Doconut.Plugins.Converter.ConverterPlugin>();
});Dieser Aufruf wirft beim Start eine Ausnahme bei fehlender Lizenz, einer veralteten
TRIAL‑Datei oder einer nicht‑temporären Lizenz, die dieConverter‑Fähigkeit nicht gewährt – einInvalidOperationException, ausgelöst von innen inAddDoconut(), bevor die Anwendung Anfragen bedient. Temporäre Demo/NFR‑Registrierungen werden akzeptiert; nach deren Ablauf bleibt die Konvertierung mit Wasserzeichen‑Ausgabe verfügbar. Es gibt keine stille kostenlose Stufe. Siehe Lizenz‑Setup für Informationen, wie Lizenzen geladen werden.
Konvertieren aus C#
Jede Konvertierung liefert ein durchsuchbares MemoryStream, das bei 0 positioniert ist und sofort gelesen oder kopiert werden kann. Lösen Sie DocumentConverter aus dem DI auf, wo immer Sie es benötigen – es ist per Design zustandslos, sodass eine einzelne Instanz sicher über mehrere Anfragen hinweg wiederverwendet werden kann.
// Inject DocumentConverter; sein Konstruktor ist intern, also niemals `new` verwenden.
Stream pdf = await converter.ConvertAsync("contract.docx", ConversionTarget.Pdf, ct: ct);// sourceExtension enthält den führenden Punkt. password ist null, es sei denn, das Dokument ist geschützt.
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 ihn mit dem Formatkatalog und eine bloße Erweiterung wird nicht aufgelöst. Und trotz seines Namens gibt WordToHtmlAsync Task<Stream> zurück, 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 jede Quelle lässt sich in jedes Ziel konvertieren – das Plugin ordnet jede Formatfamilie der Quelle (Word, Excel, PowerPoint, PDF, CAD, Bild, E‑Mail, Diagramm, Projekt/Aufgabe, PSD, Web‑Dokument) ihrem eigenen festen Satz zulässiger Ziele zu. Kodieren Sie dieses Enum nicht fest in die Ziel‑Liste Ihrer UI: ?convert=open liefert das tatsächliche allowedTargets für die gerade hochgeladene Datei, und genau das sollte die Auswahl steuern.
Drop-in-Widget
Die ?convert=open|run|download‑Endpunkte des Widgets 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 – aber die JS‑Datei selbst wird trotzdem 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, die Converter gewährt – sie gewährt 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, in dem UseDoconut() tatsächlich eingebunden ist (normalerweise über MiddlewarePath koordiniert) |
resPath | string | /doconut-res | Akzeptiert zur Konfigurationskonsistenz 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 setzt sein eigenes Limit unabhängig durch und antwortet mit 413, wenn es überschritten wird |
licenseUrl | string | null | null | Wenn gesetzt, wird der Wasserzeichen‑Hinweis auf dem Ergebnis‑Bildschirm in einen Link zu dieser URL umgewandelt |
labels | object | {} | Überschreibt beliebige Teilmenge der englischen Standard‑Strings des Widgets (Drop‑Text, Schaltflächen, aria‑live‑Ankündigungen, Fehlermeldungen) |
Callbacks:
| Callback | Wird ausgelöst, wenn | Nutzdaten |
|---|---|---|
onReady() | Das Widget hat seinen Leerlauf‑/Drop‑Bildschirm gerendert | — |
onSourceLoaded({ token, pages, sourceExt, allowedTargets }) | ?convert=open succeeds | Quell‑Sitzungs‑Token, Seitenanzahl, Quell‑Erweiterung (ohne führenden Punkt), erlaubte Ziel‑Liste |
onConverted({ downloadToken, resultToken, resultPages, downloadName, watermarked, target }) | ?convert=run succeeds | 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 Server‑Fehler (oder eine clientseitige Meldung für die Vorprüfung der Upload‑Größe) |
Doconut.convert() gibt die Widget‑Instanz selbst zurück – bewahren Sie sie, um das Widget programmgesteuert zu steuern:
const conv = Doconut.convert('#doconut-convert', { basePath: '/doconut' });
conv.reset(); // Zurück zum idle/drop screen; löst onReady nicht erneut aus
conv.loadFile(file); // Startet den Ablauf mit einem File-Objekt; keine Aktion, sofern nicht gerade idle
conv.destroy(); // Entfernt Listener, leert das mount; die Instanz ist danach nicht mehr nutzbarEigenes Frontend erstellen
Das Widget ist lediglich ein Client für diesen HTTP‑Vertrag – bauen Sie ein eigenes Frontend direkt darauf für ein anderes Nutzererlebnis. Alle drei Routen liegen unter dem ASP.NET‑Zweig, in dem UseDoconut() eingebunden ist (normalerweise /doconut):
| Route | Zweck | Erfolgsantwort |
|---|---|---|
POST ?convert=open (multipart, field file) | Hochladen und Öffnen eines Quelldokuments zur Vorschau | 200 — { token, pages, sourceExt, allowedTargets } |
POST ?token=<token>&convert=run&target=<ext> | Konvertiere die zwischengespeicherte Quelle zu target | 200 — { downloadToken, resultToken, resultPages, downloadName, watermarked } |
GET ?convert=download&token=<downloadToken> | Streame 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, antwortet run mit 404 und die Datei muss erneut geöffnet werden. Das konvertierte Ergebnis verbleibt im selben Speicher – downloadToken erhält ein eigenes frisches 30‑Minuten‑Fenster, wenn die Konvertierung abgeschlossen ist – während resultToken ein gewöhnliches Viewer‑Sitzungs‑Token ist, dessen Lebensdauer dem Viewer‑Sitzungs‑Cache folgt, unabhängig vom Speicher.
sourceExt in der open‑Antwort hat keinen führenden Punkt (z. B. "docx") – die gegenteilige Konvention zum sourceExtension‑Parameter auf DocumentConverter.ConvertAsync, der einen erfordert.
Fehlermodi, gruppiert nach Route:
| Route | Status | Wann | Inhalt |
|---|---|---|---|
| any | 404 | Das Widget ist nicht aktiviert (AddConverterWidget() wurde nie aufgerufen) – geprüft, bevor einer der drei Routen ausgeführt 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 zu einem ConversionTarget geparst werden kann | { "error": "Invalid token." } / { "error": "Unknown target format." } |
run | 400 | target ist nicht im 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 ein seekbares MemoryStream zurück, das 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.
Fehlersuche
| Symptom | Prüfung |
|---|---|
Auflösen von DocumentConverter schlägt fehl | Registrierung von ConverterPlugin erfolgte innerhalb von AddDoconut() |
| Anwendung schlägt beim Starten fehl | Die geladene Lizenz gewährt Converter |
| Stream-Konvertierung sagt, das Format wird nicht unterstützt | 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 Branch überein, in dem UseDoconut() zugeordnet 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; Zwischenspeicher‑Tokens sind bewusst temporär |
Wasserzeichen
Mit registriertem ConverterPlugin befindet sich die Lizenz des Hosts in einem von drei Zuständen:
| Lizenzstatus | Startgate | Konvertierungsausgabe |
|---|---|---|
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 — das oben beschriebene Startgate 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 DocumentConverter C#‑Fassade 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 watermarked‑Feld 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?