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:

bash
dotnet add package Doconut.NET6.Converter

Um das Plugin auf die aktuelle Version 26.7.0 festzulegen, geben Sie die Version separat an:

bash
dotnet add package Doconut.NET6.Converter --version 26.7.0

Halten 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.

csharp
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 die Converter‑Fähigkeit nicht gewährt – eine InvalidOperationException, die aus AddDoconut() 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.

csharp
// Inject DocumentConverter; its constructor is internal, so never `new` it.
Stream pdf = await converter.ConvertAsync("contract.docx", ConversionTarget.Pdf, ct: ct);
csharp
// 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);
csharp
Stream html = await converter.WordToHtmlAsync("report.docx", ct);
csharp
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

text
Pdf, Docx, Doc, Html, Xlsx, Pptx, Png, Jpeg, Csv, Tiff, Bmp, Gif, Svg, Xml,
Txt, Xls, Jp2, Rtf, Odt, Ods, Odp, Epub, Xps, Webp

Nicht 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:

csharp
builder.Services.AddDoconut(options =>
{
    options.LicensePath = "Doconut.Viewer.lic";
    options.AddPlugin<Doconut.Plugins.Converter.ConverterPlugin>();
    options.AddConverterWidget(widget =>
    {
        widget.MaxUploadMb = 25;
    });
});
html
<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:

OptionTypStandardHinweis
basePathstring/doconutBasis‑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)
resPathstring/doconut-resWird aus Konsistenzgründen mit anderen Doconut‑Widgets akzeptiert; das Converter‑Widget baut derzeit keine URL daraus
maxUploadMbnumber25Nur 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
licenseUrlstring | nullnullWenn gesetzt, wird der Wasserzeichen‑Hinweis auf dem Ergebnisbildschirm zu einem Link zu dieser URL
labelsobject{}Überschreibt beliebige Teilmenge der englischen Standard‑Strings des Widgets (Platzhalter‑Text, Buttons, aria‑live‑Ankündigungen, Fehlermeldungen)

Callbacks:

CallbackWird ausgelöst, wennNutzdaten
onReady()Das Widget hat seinen Leerlauf‑/Drop‑Screen gerendert
onSourceLoaded({ token, pages, sourceExt, allowedTargets })?convert=open erfolgreichSitzungs‑Token, Seitenzahl, Quell‑Extension (ohne führenden Punkt), erlaubte Zielliste
onConverted({ downloadToken, resultToken, resultPages, downloadName, watermarked, target })?convert=run erfolgreichgleiche Felder wie die Run‑Antwort, plus das angeforderte target
onDownload({ downloadName, downloadToken })Der Benutzer klickt den Download‑Linkwird zusammen mit dem nativen Browser‑Download ausgelöst – es wird nicht abgefangen oder ersetzt
onError({ phase, message })Ein Open‑ oder Run‑Request schlägt fehlphase 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:

javascript
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 unbrauchbar

Eigenes 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):

RouteZweckErfolgs‑Antwort
POST ?convert=open (multipart, Feld file)Hochladen und Öffnen eines Quell‑Dokuments zur Vorschau200{ token, pages, sourceExt, allowedTargets }
POST ?token=<token>&convert=run&target=<ext>Konvertieren der zwischengespeicherten Quelle zu target200{ downloadToken, resultToken, resultPages, downloadName, watermarked }
GET ?convert=download&token=<downloadToken>Streamen der konvertierten Datei200 – 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:

RouteStatusWannBody
any404Das Widget ist nicht aktiviert (AddConverterWidget() wurde nie aufgerufen) – geprüft, bevor einer der drei Routen verarbeitet wirdnur Status
any405Falsches HTTP‑Verb (open/run benötigen POST; download benötigt GET)nur Status
open413Hochgeladene Datei überschreitet MaxUploadMb{ "error": "File is too large." }
open400Kein multipart‑Body, keine Datei oder eine Quell‑Extension, die nicht konvertierbar ist{ "error": "..." }
run400Fehlformatiger Token (kein GUID) oder ein target, das nicht in ConversionTarget geparst werden kann{ "error": "Invalid token." } / { "error": "Unknown target format." }
run400target ist nicht in den allowedTargets der Quelle enthalten{ "error": "That target format is not available for this file." }
run404Der zwischengespeicherte Upload ist abgelaufen (30‑Minuten‑TTL) oder der Token wurde nie geöffnet{ "error": "Upload expired — please re-open the file." }
open, run500Interner Verarbeitungsfehler{ "error": "<sanitized message>" } – auf dieselbe Weise bereinigt wie jeder andere Doconut‑Fehlerpfad; interne Engine‑Namen werden nie geleakt
download400Fehlformatierter Token (kein GUID)nur Status
download404Unbekannter oder abgelaufener Download‑Tokennur 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

SymptomPrüfung
Auflösen von DocumentConverter schlägt fehlConverterPlugin‑Registrierung erfolgte innerhalb von AddDoconut()
Anwendung schlägt beim Starten fehlDie geladene Lizenz gewährt Converter
Stream‑Konvertierung meldet nicht unterstütztes FormatsourceExtension enthält den führenden Punkt
Widget‑JavaScript lädt, aber Anfragen erhalten 404AddConverterWidget() wurde nicht aufgerufen
Widget‑Anfragen verwenden falsche URLbasePath stimmt mit dem Zweig überein, an dem UseDoconut() gemappt ist
Ziel fehltVerwenden Sie allowedTargets, die von convert=open zurückgegeben werden; nicht jede Quelle unterstützt jedes Enum‑Ziel
Download abgelaufenWiederholen 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‑ZustandStart‑GateKonvertierungs‑Ausgabe
Bezahlte Viewer‑Lizenz, die Converter gewährt, innerhalb der GültigkeitsdauerBestehtSauber – watermarked: false
Aktive Evaluations‑ (Demo/NFR)‑LizenzBestehtKonvertiert erfolgreich, versehen mit dem Evaluations‑Wasserzeichen – watermarked: true
Unlizenzierte, veraltete TRIAL‑Datei oder nicht‑temporäre Lizenz, die Converter nicht gewährtAnwendung startet nie – das oben beschriebene Start‑Gate wirft
Abgelaufene temporäre/Demo‑LizenzRegistrierung überlebt das AblaufdatumKonvertiert 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?