Konverteringsplugin
Konvertera dokument till 24 målformat
Converter‑pluginet förvandlar Doconut till en dokumentkonverteringstjänst. Det bidrar med motorn bakom den offentliga DocumentConverter‑fasaden, och — på begäran — en drop‑in‑widget med eget HTTP‑kontrakt, så att du kan konvertera dokument från C#, från widgeten, eller från ett frontend du själv skriver.
Installera paketet
Installera den senaste stabila Converter‑pluginen:
dotnet add package Doconut.NET6.ConverterFör att låsa pluginet till den aktuella versionen 26.7.0, ange versionen separat:
dotnet add package Doconut.NET6.Converter --version 26.7.0Håll Converter‑paketet på samma version som Doconut.NET6. Paket‑ID:t är
Doconut.NET6.Converter; .26.7.0 visas endast i den nedladdade .nupkg‑filnamnet.
Registrera pluginet
Det finns ingen AddConverter()‑metod — Doconut:s plugin‑modell är enhetlig. Varje plugin, inklusive Converter, registreras på samma sätt: anropa AddPlugin<TPlugin>() inuti AddDoconut(). ConverterPlugin levereras i sitt eget NuGet‑paket, Doconut.NET6.Converter, installerat tillsammans med bas‑viewer‑paketet.
builder.Services.AddDoconut(options =>
{
options.LicensePath = "Doconut.Viewer.lic";
options.AddPlugin<Doconut.Plugins.Converter.ConverterPlugin>();
});Detta anrop kastar ett undantag vid start om licensen saknas, en gammal
TRIAL‑fil, eller en icke‑tillfällig licens som inte gerConverter‑kapacitet — ettInvalidOperationExceptionsom höjs inifrånAddDoconut(), innan appen börjar svara på förfrågningar. Tillfälliga Demo/NFR‑registreringar accepteras; efter deras kalenderutgång är konvertering fortfarande tillgänglig med vattenstämpel i resultatet. Det finns ingen tyst gratisnivå. Se Licensinställning för hur licenser laddas.
Konvertera från C#
Varje konvertering returnerar en sökbar MemoryStream placerad på 0, redo att läsas eller kopieras omedelbart. Hämta DocumentConverter från DI där du än behöver den — den är stateless av design, så en enda instans är säker att återanvända över förfrågningar.
// 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);Två detaljer som är lätta att missförstå: sourceExtension på ström‑overloaden måste inkludera den inledande punkten (".xlsx", inte "xlsx" ) — konverteraren matchar mot formatkatalogen och en ensam förlängning utan punkt löser inte upp. Och trots namnet returnerar WordToHtmlAsync Task<Stream>, inte Task<string> — du får HTML‑dokumentet (bilder inbäddade som Base64) som en ström, precis som alla andra konverteringsresultat.
Målformat
Pdf, Docx, Doc, Html, Xlsx, Pptx, Png, Jpeg, Csv, Tiff, Bmp, Gif, Svg, Xml,
Txt, Xls, Jp2, Rtf, Odt, Ods, Odp, Epub, Xps, WebpInte varje källa kan konverteras till varje mål — pluginet mappar varje källas formatfamilj (Word, Excel, PowerPoint, PDF, CAD, Image, Email, Diagram, Project/Task, PSD, webbdokument) till sin egen fasta uppsättning tillåtna mål. Hardkoda inte denna enum som UI‑listans mål: ?convert=open returnerar de faktiska allowedTargets för den fil som just laddats upp, och det är vad som bör driva en väljare.
Drop‑in‑widget
Widgetens ?convert=open|run|download‑ändpunkter är på begäran och inaktiverade från början — säkra som standard. Aktivera dem på serversidan, tillsammans med plugin‑registreringen:
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>Utan AddConverterWidget() svarar de tre ?convert=‑ändpunkterna med 404 — men JS‑filen själv levereras ändå (det är en ren inbäddad statisk resurs; endast de ändpunkter den pratar med är låsta). AddConverterWidget() kräver fortfarande att Converter‑pluginet är registrerat och en licens som ger Converter — den ger inte konverteringsrättigheter på egen hand.
Anpassa widgeten
Init‑alternativ som skickas till Doconut.convert(selector, options):
| Alternativ | Typ | Standard | Anteckningar |
|---|---|---|---|
basePath | string | /doconut | Bas‑sökväg för ?convert=‑ändpunkterna; den måste matcha den ASP.NET‑gren där UseDoconut() faktiskt är monterad (vanligtvis koordinerad via MiddlewarePath) |
resPath | string | /doconut-res | Accepterad för konfigurationskonsistens med andra Doconut‑widgetar; konverteringswidgeten bygger för närvarande ingen URL från detta |
maxUploadMb | number | 25 | Endast en klient‑sidig förkontroll — avvisar en för stor fil innan uppladdning. Servern upprätthåller sin egen gräns oberoende och svarar med 413 om den överskrids |
licenseUrl | string | null | null | När satt, gör vattenstämpel‑meddelandet på resultatskärmen till en länk till denna URL |
labels | object | {} | Åsidosätter valfri delmängd av widgetens engelska standardsträngar (drop‑text, knappar, aria‑live‑meddelanden, felmeddelanden) |
Callbacks:
| Callback | Utlöses när | Payload |
|---|---|---|
onReady() | Widgeten har renderat sin idle/drop‑skärm | — |
onSourceLoaded({ token, pages, sourceExt, allowedTargets }) | ?convert=open lyckas | sessions‑token, sidantal, källförlängning (utan inledande punkt), lista över tillåtna mål |
onConverted({ downloadToken, resultToken, resultPages, downloadName, watermarked, target }) | ?convert=run lyckas | samma fält som i run‑svaret, plus det target som begärdes |
onDownload({ downloadName, downloadToken }) | Användaren klickar på Nedladdnings‑länken | avfyras tillsammans med webbläsarens inbyggda nedladdning — den avbryter eller ersätter den inte |
onError({ phase, message }) | En open‑ eller run‑förfrågan misslyckas | phase är 'open' eller 'run'; message är det sanerade server‑felet (eller ett klient‑sidigt meddelande för förkontrollen av uppladdningsstorlek) |
Doconut.convert() returnerar själva widget‑instansen — behåll den för att programatiskt styra widgeten:
const conv = Doconut.convert('#doconut-convert', { basePath: '/doconut' });
conv.reset(); // tillbaka till idle/drop‑skärmen; avfyrar inte onReady igen
conv.loadFile(file); // startar flödet med ett File‑objekt; ingen effekt om den inte är idle
conv.destroy(); // tar bort lyssnare, tömmer mount‑punkten; instansen är oanvändbar efter dettaBygg ditt eget frontend
Widgeten är bara en klient för detta HTTP‑kontrakt — bygg ditt eget frontend direkt mot det för en annan UX. Alla tre rutter ligger under den ASP.NET‑gren där UseDoconut() är monterad (vanligtvis /doconut):
| Rutt | Syfte | Framgångssvar |
|---|---|---|
POST ?convert=open (multipart, fält file) | Ladda upp och öppna ett källdokument för förhandsgranskning | 200 — { token, pages, sourceExt, allowedTargets } |
POST ?token=<token>&convert=run&target=<ext> | Konvertera den lagrade källan till target | 200 — { downloadToken, resultToken, resultPages, downloadName, watermarked } |
GET ?convert=download&token=<downloadToken> | Strömma den konverterade filen | 200 — fil‑bytes, Content-Disposition: attachment, Cache-Control: no-store |
Uppladdade källbytes lagras på servern med en TTL på 30 minuter; när detta fönster löper ut svarar run med 404 och filen måste öppnas på nytt. Det konverterade resultatet ligger i samma lagring — downloadToken får sin egen fräscha 30‑minutersperiod när konverteringen är klar — medan resultToken är en vanlig viewer‑sessions‑token vars livslängd följer viewer‑sessionens cache, oberoende av lagringen.
sourceExt i open‑svaret har ingen inledande punkt (t.ex. "docx" ) — motsatt konvention jämfört med parametern sourceExtension på DocumentConverter.ConvertAsync, som kräver en punkt.
Fel‑lägen, grupperade per rutt:
| Rutt | Status | När | Body |
|---|---|---|---|
| any | 404 | Widgeten är inte aktiverad (AddConverterWidget() anropades aldrig) — kontrolleras innan någon av de tre rutterna dispatchas | enbart status |
| any | 405 | Fel HTTP‑verb (open/run kräver POST; download kräver GET) | enbart status |
open | 413 | Uppladdad fil överskrider MaxUploadMb | { "error": "File is too large." } |
open | 400 | Ingen multipart‑kropp, ingen fil, eller en källförlängning som inte kan konverteras | { "error": "..." } |
run | 400 | Felaktig token (inte ett GUID), eller ett target som inte kan parsas till ett ConversionTarget | { "error": "Invalid token." } / { "error": "Unknown target format." } |
run | 400 | target finns inte i källans allowedTargets | { "error": "That target format is not available for this file." } |
run | 404 | Den lagrade uppladdningen har gått ut (30‑minuters TTL) eller token någonsin öppnades inte | { "error": "Upload expired — please re-open the file." } |
open, run | 500 | Intern bearbetning misslyckades | { "error": "<sanitized message>" } — sanerat på samma sätt som alla andra Doconut‑felvägar; läcker aldrig interna motornamn |
download | 400 | Felaktig token (inte ett GUID) | enbart status |
download | 404 | Okänd eller utgången download‑token | enbart status |
Resurshantering
Konverteraren returnerar en sökbar MemoryStream placerad på noll. Anroparen äger den strömmen och bör disponera den efter kopiering eller återlämnande av dess innehåll. DocumentConverter‑tjänsten själv är stateless och hämtas via dependency injection; bygg inte själv eller disponera tjänsten manuellt.
För webb‑widgeten har uppladdnings‑ och nedladdnings‑lagren oberoende 30‑minuters TTL. En viewer‑resultToken följer viewer‑sessionens livstid istället. Att stänga ett viewer‑resultat tar inte bort ett fortfarande giltigt nedladdnings‑lagring, och att återställa webbläsar‑widgeten förlänger inte någon av TTL‑erna.
Felsökning
| Symptom | Kontroll |
|---|---|
DocumentConverter kan inte lösas | ConverterPlugin‑registrering skedde inuti AddDoconut() |
| Applikationen misslyckas vid start | Den laddade licensen ger Converter |
| Ström‑konvertering säger att formatet inte stöds | sourceExtension inkluderar den inledande punkten |
| Widget‑JavaScript laddas men förfrågningar returnerar 404 | AddConverterWidget() anropades inte |
| Widget‑förfrågningar använder fel URL | basePath matchar den gren där UseDoconut() är mappad |
| Mål saknas | Använd allowedTargets som returneras av convert=open; inte varje källa stödjer varje enum‑mål |
| Nedladdning har gått ut | Upprepa convert=open/convert=run; lagringstoken är avsiktligt temporär |
Vattenstämpling
Med ConverterPlugin registrerad är värdens licens i ett av tre tillstånd:
| Licenstillstånd | Start‑gate | Konverteringsutdata |
|---|---|---|
Betald viewer‑licens som ger Converter, inom giltighetsperioden | Passar | Ren — watermarked: false |
| Aktiv utvärderings‑ (demo/NFR) licens | Passar | Konverterar framgångsrikt, märkt med utvärderings‑vattenstämpel — watermarked: true |
Olicensierad, en gammal TRIAL‑fil, eller en icke‑tillfällig licens som inte ger Converter | Appen startar aldrig — start‑gate ovan kastar | — |
| Utgången tillfällig/Demo‑licens | Registreringen överlever utgången | Konverterar med utvärderings‑vattenstämpel — watermarked: true |
Båda anropsvägarna beräknar flaggan med samma regel: DocumentConverter‑C#‑fasaden härleder den internt från licensens IsViewerLicensed och IsTemporary‑status, och widgetens ?convert=run‑handler gör motsvarande kontroll (IsViewerLicensed && !IsTrial && !IsTemporary) för att fylla i fältet watermarked som den returnerar. En integration kan byggas och testas end‑to‑end på en utvärderingslicens innan köp — endast byteströmmen förändras.
Var den här sidan till hjälp?