Konverter-Plugin
Dokumente in 24 Zielformate konvertieren
Das Konverter-Plugin verwandelt Doconut in einen Dokumentkonvertierungsdienst. 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 Konverter-Plugin:
dotnet add package Doconut.NET8.ConverterUm das Plugin auf die aktuelle Version 26.7.0 zu fixieren, 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 lautet 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 Converter, wird auf dieselbe Weise registriert: Rufen Sie AddPlugin<TPlugin>() innerhalb von AddDoconut() auf. ConverterPlugin wird in seinem eigenen NuGet‑Paket Doconut.NET8.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 Start 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 deren Ablauf bleibt die Konvertierung mit einem Wasserzeichen verfügbar. Es gibt keine stille kostenlose Stufe. Siehe Lizenzsetup für Informationen, wie Lizenzen geladen werden.
Konvertieren aus C#
Jede Konvertierung liefert einen durchsuchbaren 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 ihn mit dem Formatkatalog und ein bloßer Dateiname wird nicht aufgelöst. Und trotz des Namens gibt WordToHtmlAsync ein 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 Quell‑Formatfamilie (Word, Excel, PowerPoint, PDF, CAD, Image, Email, Diagram, Project/Task, PSD, web document) einem eigenen festen Satz zulässiger Ziele zu. Kodieren Sie dieses Enum nicht fest in Ihrer UI‑Ziel‑Liste: ?convert=open liefert die tatsächlichen allowedTargets für die gerade hochgeladene Datei, und diese sollten Sie für die Auswahl verwenden.
Drop-in-Widget
Die Endpunkte des Widgets ?convert=open|run|download sind optional und standardmäßig deaktiviert – sicherheitsmäßig voreingestellt. 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() beantworten die drei ?convert=‑Endpunkte 404 – die JS‑Datei selbst wird jedoch weiterhin ausgeliefert (es handelt sich um 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 sich aus Konvertierungsrechte.
Widget anpassen
Initiale Optionen, 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 gemountet ist (normalerweise über MiddlewarePath koordiniert) |
resPath | string | /doconut-res | Akzeptiert zur Konfigurations‑Konsistenz mit anderen Doconut‑Widgets; das Konverter‑Widget baut derzeit keine URL daraus auf |
maxUploadMb | number | 25 | Nur clientseitige Vorprüfung – verwirft zu große Dateien bereits vor dem Upload. Der Server erzwingt eigenständig ein Limit und antwortet mit 413, wenn es überschritten wird |
licenseUrl | string | null | null | Wenn gesetzt, wird der Wasserzeichen‑Hinweis auf dem Ergebnis‑Screen zu einem Link zu dieser URL |
labels | object | {} | Überschreibt beliebige Teilmenge der englischen Standard‑Strings des Widgets (Drop‑Text, Buttons, aria‑live‑Ankündigungen, Fehlermeldungen) |
Rückrufe:
| Rückruf | Wird ausgelöst wenn | Nutzdaten |
|---|---|---|
onReady() | Das Widget hat seinen Leerlauf-/Drop‑Bildschirm gerendert | — |
onSourceLoaded({ token, pages, sourceExt, allowedTargets }) | ?convert=open erfolgreich | Token der Quell‑Sitzung, Seitenzahl, Quell‑Erweiterung (ohne führenden Punkt), Liste zulässiger Ziele |
onConverted({ downloadToken, resultToken, resultPages, downloadName, watermarked, target }) | ?convert=run erfolgreich | dieselben Felder wie die Run‑Antwort, plus das angeforderte target |
onDownload({ downloadName, downloadToken }) | Der Benutzer klickt auf den Download‑Link | wird zusammen mit dem nativen Browser‑Download ausgelöst – es wird nicht abgefangen oder ersetzt |
onError({ phase, message }) | Eine open‑ oder run‑Anfrage 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 – 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; No‑Op, 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 – bauen Sie Ihr eigenes Frontend direkt darauf für ein anderes UX. Alle drei Routen liegen unter dem ASP.NET‑Zweig, in dem UseDoconut() gemountet ist (normalerweise /doconut):
| Route | Zweck | Erfolgsantwort |
|---|---|---|
POST ?convert=open (multipart, field file) | Laden Sie ein Quelldokument hoch und öffnen Sie es zur Vorschau | 200 — { token, pages, sourceExt, allowedTargets } |
POST ?token=<token>&convert=run&target=<ext> | Konvertieren Sie die zwischengespeicherte Quelle zu target | 200 — { downloadToken, resultToken, resultPages, downloadName, watermarked } |
GET ?convert=download&token=<downloadToken> | Streamen Sie die konvertierte Datei | 200 — file bytes, Content-Disposition: attachment, Cache-Control: no-store |
Hochgeladene Quell‑Bytes werden serverseitig mit einem 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 Stash – downloadToken erhält ein frisches 30‑Minuten‑Fenster, sobald die Konvertierung abgeschlossen ist – während resultToken ein gewöhnliches Viewer‑Sitzungs‑Token ist, dessen Lebensdauer der Viewer‑Session‑Cache bestimmt, unabhängig vom Stash.
sourceExt in der open‑Antwort enthält keinen führenden Punkt (z. B. "docx" ) – das ist das Gegenstück zur sourceExtension‑Parameter‑Konvention bei DocumentConverter.ConvertAsync, die einen Punkt erfordert.
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‑Erweiterung, die nicht konvertierbar ist | { "error": "..." } |
run | 400 | Fehlerhaftes Token (kein GUID) oder ein target, das nicht in einen ConversionTarget umgewandelt 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 | Interne Verarbeitung fehlgeschlagen | { "error": "<sanitized message>" } — bereinigt wie bei allen anderen Doconut‑Fehlerpfaden; leckt keine internen Engine‑Namen |
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 des Inhalts freigeben. Der DocumentConverter‑Dienst selbst ist zustandslos und wird über Dependency Injection aufgelöst; bauen Sie den Service nicht manuell auf und geben Sie ihn nicht frei.
Für das Web‑Widget haben die Upload‑ und Download‑Stashes unabhängige TTLs von 30 Minuten. Ein Viewer‑resultToken folgt der Lebensdauer der Viewer‑Session. Das Schließen eines Viewer‑Ergebnisses löscht einen noch gültigen Download‑Stash nicht, 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 Start fehl | Die geladene Lizenz gewährt Converter |
| Stream‑Konvertierung meldet, 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() gemountet 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; Stash‑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 | Besteht | Sauber — watermarked: false |
| Aktive Evaluations‑ (Demo/NFR)‑Lizenz | Besteht | 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 Ablaufen | 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) aus, um das zurückgegebene Feld watermarked zu füllen. Eine Integration kann end‑to‑end auf einer Evaluations‑Lizenz aufgebaut und getestet werden, bevor ein Kauf erfolgt – nur die Ausgabebytes ändern sich.
War diese Seite hilfreich?