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:

bash
dotnet add package Doconut.NET8.Converter

Um das Plugin an die aktuelle Version 26.7.0 zu binden, geben Sie die Version separat an:

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

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

csharp
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 die Converter‑Fähigkeit nicht gewährt – ein InvalidOperationException, ausgelöst von innen in AddDoconut(), 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.

csharp
// Inject DocumentConverter; sein Konstruktor ist intern, also niemals `new` verwenden.
Stream pdf = await converter.ConvertAsync("contract.docx", ConversionTarget.Pdf, ct: ct);
csharp
// 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);
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 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

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

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

OptionTypStandardHinweise
basePathstring/doconutBasis‑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)
resPathstring/doconut-resAkzeptiert zur Konfigurationskonsistenz mit anderen Doconut‑Widgets; das Converter‑Widget erzeugt derzeit keine URL daraus
maxUploadMbnumber25Nur 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
licenseUrlstring | nullnullWenn gesetzt, wird der Wasserzeichen‑Hinweis auf dem Ergebnis‑Bildschirm in einen Link zu dieser URL umgewandelt
labelsobject{}Überschreibt beliebige Teilmenge der englischen Standard‑Strings des Widgets (Drop‑Text, Schaltflächen, aria‑live‑Ankündigungen, Fehlermeldungen)

Callbacks:

CallbackWird ausgelöst, wennNutzdaten
onReady()Das Widget hat seinen Leerlauf‑/Drop‑Bildschirm gerendert—
onSourceLoaded({ token, pages, sourceExt, allowedTargets })?convert=open succeedsQuell‑Sitzungs‑Token, Seitenanzahl, Quell‑Erweiterung (ohne führenden Punkt), erlaubte Ziel‑Liste
onConverted({ downloadToken, resultToken, resultPages, downloadName, watermarked, target })?convert=run succeedsgleiche Felder wie die Run‑Antwort, plus das angeforderte target
onDownload({ downloadName, downloadToken })Der Benutzer klickt auf den Download‑Linkwird 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 fehlphase 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:

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

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

RouteZweckErfolgsantwort
POST ?convert=open (multipart, field file)Hochladen und Öffnen eines Quelldokuments zur Vorschau200 — { token, pages, sourceExt, allowedTargets }
POST ?token=<token>&convert=run&target=<ext>Konvertiere die zwischengespeicherte Quelle zu target200 — { downloadToken, resultToken, resultPages, downloadName, watermarked }
GET ?convert=download&token=<downloadToken>Streame die konvertierte Datei200 — 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:

RouteStatusWannInhalt
any404Das Widget ist nicht aktiviert (AddConverterWidget() wurde nie aufgerufen) – geprüft, bevor einer der drei Routen ausgeführt wirdnur Status
any405Falsches HTTP‑Verb (open/run erfordern POST; download erfordert GET)nur Status
open413Hochgeladene Datei überschreitet MaxUploadMb{ "error": "File is too large." }
open400Kein multipart‑Body, keine Datei oder eine Quell‑Erweiterung, die nicht konvertiert werden kann{ "error": "..." }
run400Fehlerhaftes Token (kein GUID) oder ein target, das nicht zu einem ConversionTarget geparst werden kann{ "error": "Invalid token." } / { "error": "Unknown target format." }
run400target ist nicht im allowedTargets der Quelle enthalten{ "error": "That target format is not available for this file." }
run404Der zwischengespeicherte Upload ist abgelaufen (30‑Minuten‑TTL) oder das Token wurde nie geöffnet{ "error": "Upload expired — please re-open the file." }
open, run500Verarbeitung intern fehlgeschlagen{ "error": "<sanitized message>" } — bereinigt auf dieselbe Weise wie jeder andere Doconut‑Fehlerpfad; gibt niemals interne Engine‑Namen preis
download400Fehlerhaftes Token (kein GUID)nur Status
download404Unbekanntes oder abgelaufenes Download‑Tokennur 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

SymptomPrüfung
Auflösen von DocumentConverter schlägt fehlRegistrierung von ConverterPlugin erfolgte innerhalb von AddDoconut()
Anwendung schlägt beim Starten fehlDie geladene Lizenz gewährt Converter
Stream-Konvertierung sagt, das Format wird nicht unterstütztsourceExtension enthält den führenden Punkt
Widget-JavaScript wird geladen, aber Anfragen geben 404 zurückAddConverterWidget() wurde nicht aufgerufen
Widget-Anfragen verwenden die falsche URLbasePath stimmt mit dem Branch überein, in dem UseDoconut() zugeordnet ist
Ziel fehltVerwenden Sie allowedTargets, das von convert=open zurückgegeben wird; 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:

LizenzstatusStartgateKonvertierungsausgabe
Bezahlte Viewer-Lizenz, die Converter gewährt, innerhalb ihres GültigkeitszeitraumsBestandenSauber — watermarked: false
Aktive Evaluations‑ (Demo/NFR‑) LizenzBestandenKonvertiert erfolgreich, versehen mit dem Evaluations‑Wasserzeichen — watermarked: true
Unlizenziert, eine veraltete TRIAL‑Datei oder eine nicht‑temporäre Lizenz, die Converter nicht gewährtApp startet nie — das oben beschriebene Startgate wirft eine Ausnahme—
Abgelaufene temporäre/Demo‑LizenzRegistrierung überlebt das AblaufdatumKonvertiert 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?