Konverteringsplugin
Konvertera dokument till 45 målformat
Konverteringspluginet gör Doconut till en dokumentkonverteringstjänst. Det bidrar med motorn bakom den offentliga DocumentConverter‑fasaden, och — på begäran — en färdig widget med eget HTTP‑kontrakt, så att du kan konvertera dokument från C#, från widgeten eller från ett frontend som du själv skriver.
Installera paketet
Installera den senaste stabila Converter‑pluginet:
dotnet add package Doconut.NETStandard.ConverterFör att låsa pluginet till den aktuella 26.8.0‑utgåvan, ange versionen separat:
dotnet add package Doconut.NETStandard.Converter --version 26.8.0Håll Converter‑paketet på samma version som Doconut.NETStandard. Paket‑ID:t är
Doconut.NETStandard.Converter; .26.8.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>() inom AddDoconut(). ConverterPlugin levereras i sitt eget NuGet‑paket, Doconut.NETStandard.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 en licens saknas, en äldre
TRIAL‑fil, eller en icke‑tillfällig licens som inte gerConverter‑kapaciteten — ettInvalidOperationExceptionsom höjs inifrånAddDoconut(), innan appen hanterar förfrågningar. Tillfälliga Demo/NFR‑registreringar accepteras; efter deras kalenderutgång är konvertering fortfarande tillgänglig med vattenstämpel på 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.
viewer.Converter.GetConverter() finns inte här. Konvertering nås inte längre via viewer‑instansen: injicera Doconut.DocumentConverter istället.
// 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 i ström‑överladdningen måste inkludera den inledande punkten (".xlsx", inte "xlsx") — konverteraren matchar den mot formatkatalogen och en ensam filändelse löser sig inte. 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 varje annat konverteringsresultat.
Målformat
ConversionTarget (namnrymd Doconut.Configs.Conversion) har 45 medlemmar:
Pdf, Docx, Doc, Html, Xlsx, Pptx, Png, Jpeg, Csv, Tiff, Bmp, Gif, Svg, Xml,
Txt, Xls, Jp2, Rtf, Odt, Ods, Odp, Epub, Xps, Webp, Msg, Eml, Emlx, Mhtml,
Xlsm, Xlsb, Ppt, Docm, Dot, Dotx, Dotm, Vsdx, Vssx, Vstx, Vsdm, Vssm, Vstm,
Vdx, Vsx, Vtx, IcoDetta enum täcker varje källfamilj. Det tidigare biblioteket hade en typ per familj *ConfigConverter — WordConfigConverter, ExcelConfigConverter och så vidare — var och en med sitt eget inbäddade EnTargetFormat‑enum, samt ett SourceFormatConverter‑enum för indata. Alla dessa är borta; se migrationsguide.
Inte varje källa konverteras till varje mål — pluginet mappar varje källformatsfamilj (Word, Excel, PowerPoint, PDF, CAD, Bild, E‑post, Diagram, Projekt/Uppgift, PSD, webb‑dokument) till sin egen fasta uppsättning tillåtna mål. Hardkoda inte detta enum som din UI:s mållista: ?convert=open returnerar de faktiska allowedTargets för den fil som just har laddats upp, och det är vad som bör styra en väljare.
Inbäddningswidget
Widgetens ?convert=open|run|download-endpunkter är valfria 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=-endpunkterna med 404 — men JS-filen levereras ändå (det är en enkel inbäddad statisk resurs; endast de endpunkter den kommunicerar med är begränsade). AddConverterWidget() kräver fortfarande att Converter‑pluginet är registrerat och en licens som beviljar Converter — den ger inte konverteringsrättigheter på egen hand.
Anpassa widgeten
Initieringsalternativ som skickas till Doconut.convert(selector, options):
| Alternativ | Typ | Standard | Anteckningar |
|---|---|---|---|
basePath | string | /doconut | Basväg för ?convert=-endpunkterna; 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 konfigurationskonsekvens med andra Doconut‑widgetar; konverteringswidgeten bygger för närvarande ingen URL från den |
maxUploadMb | number | 25 | Endast en förkontroll på klienten — 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 den är satt omvandlas vattenstämpelmeddelandet på resultatskärmen till en länk till denna URL |
labels | object | {} | Åsidosätter någon delmängd av widgetens engelska standardsträngar (släpptext, knappar, aria-live‑meddelanden, felmeddelanden) |
Callback-funktioner:
| Callback | Utlöses när | Data |
|---|---|---|
onReady() | Widgeten har renderat sin inaktiva/släppskärm | — |
onSourceLoaded({ token, pages, sourceExt, allowedTargets }) | ?convert=open lyckas | källsessionstoken, sidantal, källfilsexension (utan inledande punkt), lista över tillåtna mål |
onConverted({ downloadToken, resultToken, resultPages, downloadName, watermarked, target }) | ?convert=run lyckas | samma fält som svar från run, plus det begärda target |
onDownload({ downloadName, downloadToken }) | Användaren klickar på länken Download | utlöses tillsammans med webbläsarens inbyggda nedladdning — den avbryter eller ersätter den inte |
onError({ phase, message }) | En open‑ eller run‑begäran misslyckas | phase är 'open' eller 'run'; message är det sanerade serverfelet (eller ett klient‑sidomeddelande för förkontrollen av uppladdningsstorlek) |
Doconut.convert() returnerar själva widget‑instansen — behåll den för att styra widgeten programmässigt:
const conv = Doconut.convert('#doconut-convert', { basePath: '/doconut' });
conv.reset(); // tillbaka till den inaktiva/släppskärmen; utlöser 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 gränssnitt mot det direkt för en annan användarupplevelse. Alla tre rutter ligger under den ASP.NET‑gren där UseDoconut() är monterad (vanligtvis /doconut):
| Rutt | Syfte | Lyckad svar |
|---|---|---|
POST ?convert=open (multipart, field 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 — filbytes, 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 lever i samma lagring — downloadToken får sitt eget fräscha 30‑minutersfönster när konverteringen är klar — medan resultToken är en vanlig visningssession‑token vars livslängd följer visningssessionens 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.
Felmoder, grupperade efter rutt:
| Rutt | Status | När | Kropp |
|---|---|---|---|
| any | 404 | Widgeten är inte aktiverad (AddConverterWidget() har aldrig anropats) — kontrolleras innan någon av de tre rutterna dispatchas | endast status |
| any | 405 | Fel HTTP‑verb (open/run kräver POST; download kräver GET) | endast status |
open | 413 | Uppladdad fil överskrider MaxUploadMb | { "error": "File is too large." } |
open | 400 | Ingen multipart‑kropp, ingen fil, eller en källfilsexension som inte kan konverteras | { "error": "..." } |
run | 400 | Felaktig token (inte ett GUID), eller ett target som inte kan parsas till en 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 har aldrig öppnats | { "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 motor‑namn |
download | 400 | Felaktig token (inte ett GUID) | endast status |
download | 404 | Okänd eller utgången download‑token | endast status |
Resursägande
Konverteraren returnerar en sökbar MemoryStream som är placerad på noll. Anroparen äger den strömmen och bör avvisa den efter att ha kopierat eller returnerat dess innehåll. DocumentConverter‑tjänsten i sig är tillståndslös och hämtas via beroendeinjektion; bygg inte själv eller avvisa tjänsten manuellt.
För webbwidgeten har uppladdnings‑ och nedladdningslagren oberoende TTL på 30 minuter. En visnings‑resultToken följer i stället visningssessionens livstid. Att stänga ett visningsresultat tar inte bort ett fortfarande giltigt nedladdningslager, och att återställa webbläsarwidgeten förlänger inte någon av TTL:erna.
Felsökning
| Symptom | Kontroll |
|---|---|
Det gick inte att lösa DocumentConverter | ConverterPlugin‑registrering skedde inne i AddDoconut() |
| Applikationen misslyckas vid start | Den laddade licensen beviljar Converter |
| Strömkonverteringen säger att formatet inte stöds | sourceExtension innehåller den inledande punkten |
| Widgetens JavaScript laddas men förfrågningar returnerar 404 | AddConverterWidget() anropades inte |
| Widgetförfrågningar använder fel URL | basePath matchar den gren där UseDoconut() är mappad |
| Målet 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 tillfälliga |
Vattenmärkning
Med ConverterPlugin registrerad är värdens licens i ett av tre tillstånd:
| Licenstillstånd | Startgate | Konverteringsutdata |
|---|---|---|
Betald visningslicens som beviljar Converter, inom dess giltighetsperiod | Godkänns | Ren — watermarked: false |
| Aktiv utvärderingslicens (demo/NFR) | Godkänns | Konverterar framgångsrikt, märkt med utvärderingsvattenstämpel — watermarked: true |
Olicensierad, en äldre TRIAL‑fil, eller en icke‑tillfällig licens som inte beviljar Converter | Appen startar aldrig — startgaten ovan kastar ett fel | — |
| Utgången tillfällig/demo‑licens | Registreringen överlever utgången | Konverterar med utvärderingsvattenstämpel — watermarked: true |
Båda anropsvägarna beräknar flaggan utifrån samma regel: DocumentConverter C#‑fasaden härleder den internt från licensens IsViewerLicensed‑ och IsTemporary‑tillstånd, och widgetens ?convert=run‑hanterare 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 bytes i utdata förändras.
Var den här sidan hjälpsam?