Plugin pro převod
Převádějte dokumenty do 24 cílových formátů
Plugin Converter promění Doconut na službu pro převod dokumentů. Poskytuje jádro za veřejnou fasádou DocumentConverter a — volitelně — vložitelný widget s vlastním HTTP kontraktem, takže můžete převádět dokumenty z C#, z widgetu nebo z frontendu, který si napíšete sami.
Instalace balíčku
Nainstalujte nejnovější stabilní plugin Converter:
dotnet add package Doconut.NET6.ConverterPro připnutí pluginu k aktuálnímu vydání 26.7.0 předávejte verzi zvlášť:
dotnet add package Doconut.NET6.Converter --version 26.7.0Udržujte balíček Converter ve stejné verzi jako Doconut.NET6. ID balíčku je
Doconut.NET6.Converter; .26.7.0 se objevuje jen v název staženého souboru .nupkg.
Registrace pluginu
Neexistuje metoda AddConverter() — model pluginů Doconut je jednotný. Každý plugin, včetně Converter, se registruje stejným způsobem: zavolejte AddPlugin<TPlugin>() uvnitř AddDoconut(). ConverterPlugin je součástí vlastního NuGet balíčku Doconut.NET6.Converter, nainstalovaného vedle základního balíčku vieweru.
builder.Services.AddDoconut(options =>
{
options.LicensePath = "Doconut.Viewer.lic";
options.AddPlugin<Doconut.Plugins.Converter.ConverterPlugin>();
});// Vložte DocumentConverter; jeho konstruktor je interní, takže jej nikdy neinstanciujte pomocí `new`.
Stream pdf = await converter.ConvertAsync("contract.docx", ConversionTarget.Pdf, ct: ct);// sourceExtension zahrnuje úvodní tečku. password je null, pokud není dokument chráněn.
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);Dva detaily, které se snadno přehlédnou: sourceExtension u přetížení se streamem musí obsahovat úvodní tečku (".xlsx", ne "xlsx" ) — konvertor ji porovnává s katalogem formátů a samotná přípona by se nevyhodnotila. A navzdory názvu WordToHtmlAsync vrací Task<Stream>, ne Task<string> — získáte HTML dokument (obrázky vložené jako Base64) jako stream, stejně jako výsledek každého jiného převodu.
Cílové formáty
Pdf, Docx, Doc, Html, Xlsx, Pptx, Png, Jpeg, Csv, Tiff, Bmp, Gif, Svg, Xml,
Txt, Xls, Jp2, Rtf, Odt, Ods, Odp, Epub, Xps, WebpNe každý zdroj se dá převést na každý cíl — plugin mapuje rodinu formátu zdroje (Word, Excel, PowerPoint, PDF, CAD, Image, Email, Diagram, Project/Task, PSD, webový dokument) na vlastní pevně danou sadu povolených cílů. Není vhodné tuto výčtovou hodnotu zakódovat přímo v UI: ?convert=open vrací skutečné allowedTargets pro právě nahraný soubor a to by mělo napájet výběrový seznam.
Vložitelný widget
Endpointy widgetu ?convert=open|run|download jsou volitelné a jsou ve výchozím nastavení zakázané — bezpečné z pohledu výchozí konfigurace. Povolit je můžete na serveru při registraci pluginu:
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>Bez AddConverterWidget() vrací tři endpointy ?convert= chybu 404 — ale samotný JS soubor je i tak servírován (je to prostý vložený statický zdroj; pouze endpointy, ke kterým se odkazuje, jsou uzamčeny). AddConverterWidget() stále vyžaduje, aby byl plugin Converter zaregistrován a licence přidělující Converter — sama o sobě nepřiděluje práva k převodu.
Přizpůsobení widgetu
Inicializační možnosti předávané do Doconut.convert(selector, options):
| Možnost | Typ | Výchozí | Poznámky |
|---|---|---|---|
basePath | string | /doconut | Základní cesta pro endpointy ?convert=; musí odpovídat větvi ASP.NET, kde je UseDoconut() skutečně namontováno (obvykle koordinováno přes MiddlewarePath) |
resPath | string | /doconut-res | Přijato pro konzistenci konfigurace s ostatními Doconut widgety; widget převodníku momentálně nevyužívá tuto cestu k vytváření URL |
maxUploadMb | number | 25 | Pouze klientská předkontrola — odmítne příliš velký soubor před nahráním. Server uplatňuje vlastní limit nezávisle a vrací 413, pokud je překročen |
licenseUrl | string | null | null | Když je nastaveno, přemění upozornění na vodoznak na výsledné obrazovce na odkaz na tuto URL |
labels | object | {} | Přepíše libovolnou podmnožinu výchozích anglických řetězců widgetu (texty drop‑oblasti, tlačítka, aria‑live oznámení, chybové zprávy) |
Callbacky:
| Callback | Spouští se při | Náklad |
|---|---|---|
onReady() | Widget vykreslil svůj nečinný/drop‑obrazovku | — |
onSourceLoaded({ token, pages, sourceExt, allowedTargets }) | ?convert=open uspěje | token relace zdroje, počet stránek, přípona zdroje (bez úvodní tečky), seznam povolených cílů |
onConverted({ downloadToken, resultToken, resultPages, downloadName, watermarked, target }) | ?convert=run uspěje | stejné pole jako odpověď run, plus požadovaný target |
onDownload({ downloadName, downloadToken }) | Uživatel klikne na odkaz Stáhnout | spustí se spolu s nativním stažením prohlížeče — neinterceptuje ani nenahrazuje jej |
onError({ phase, message }) | Požadavek open nebo run selže | phase je 'open' nebo 'run'; message je sanitizovaná chybová zpráva serveru (nebo klientská zpráva při předkontrole velikosti) |
Doconut.convert() vrací samotnou instanci widgetu — uchovejte ji, pokud chcete widget ovládat programově:
const conv = Doconut.convert('#doconut-convert', { basePath: '/doconut' });
conv.reset(); // zpět na nečinnou/drop obrazovku; nevyvolá znovu onReady
conv.loadFile(file); // spustí tok s objektem File; neudělá nic, pokud není v idle stavu
conv.destroy(); // odstraní posluchače, vyprázdní mount; instance po tomto není použitelnáVytvořte si vlastní frontend
Widget je jen klient pro tento HTTP kontrakt — postavte si vlastní frontend přímo proti němu pro odlišné UX. Všechny tři trasy leží pod větví ASP.NET, kde je UseDoconut() namontováno (obvykle /doconut):
| Trasa | Účel | Úspěšná odpověď |
|---|---|---|
POST ?convert=open (multipart, pole file) | Nahrát a otevřít zdrojový dokument pro náhled | 200 — { token, pages, sourceExt, allowedTargets } |
POST ?token=<token>&convert=run&target=<ext> | Převést uložený zdroj na target | 200 — { downloadToken, resultToken, resultPages, downloadName, watermarked } |
GET ?convert=download&token=<downloadToken> | Streamovat převedený soubor | 200 — bajty souboru, Content-Disposition: attachment, Cache-Control: no-store |
Nahrané bajty zdroje jsou uloženy na serveru s TTL 30 minut; po uplynutí tohoto okna vrátí run chybu 404 a soubor je nutné znovu otevřít. Výsledek převodu žije ve stejném úložišti — downloadToken získá vlastní čerstvé 30‑minutové okno po dokončení převodu — zatímco resultToken je běžný token relace vieweru, jehož životnost následuje cache relace vieweru, nezávisle na úložišti.
sourceExt v odpovědi open nemá úvodní tečku (např. "docx" ) — opačný konvence oproti parametru sourceExtension u DocumentConverter.ConvertAsync, který tečku vyžaduje.
Režimy selhání, rozdělené podle trasy
| Trasa | Stav | Kdy | Tělo |
|---|---|---|---|
| libovolná | 404 | Widget není povolen (AddConverterWidget() nebylo nikdy zavoláno) — kontrola proběhne před jakýmkoli dispatchem třech tras | jen status |
| libovolná | 405 | Špatný HTTP verb (open/run vyžadují POST; download vyžaduje GET) | jen status |
open | 413 | Nahraný soubor překračuje MaxUploadMb | { "error": "File is too large." } |
open | 400 | Chybí multipart tělo, soubor, nebo přípona zdroje, kterou nelze převést | { "error": "..." } |
run | 400 | Špatně formátovaný token (ne GUID) nebo target, který se nedá převést na ConversionTarget | { "error": "Invalid token." } / { "error": "Unknown target format." } |
run | 400 | target není v allowedTargets zdroje | { "error": "That target format is not available for this file." } |
run | 404 | Uložené nahrání vypršelo (TTL 30 min) nebo token nikdy nebyl otevřen | { "error": "Upload expired — please re-open the file." } |
open, run | 500 | Interní selhání zpracování | { "error": "<sanitized message>" } — sanitizováno stejným způsobem jako každá jiná cesta chyb Doconut; interní názvy enginu se nepropagují |
download | 400 | Špatně formátovaný token (ne GUID) | jen status |
download | 404 | Neznámý nebo vypršený download token | jen status |
Vlastnictví zdrojů
Konvertor vrací seekovatelný MemoryStream nastavený na nulu. Volající vlastní tento stream a měl by jej po zkopírování nebo vrácení obsahu uvolnit. Služba DocumentConverter je stateless a získává se z dependency injection; nesnažte se ji ručně konstruovat ani uvolňovat.
U webového widgetu mají úložiště nahrávek a stažení nezávislé TTL 30 minut. Token resultToken vieweru následuje životnost relace vieweru. Uzavření výsledku vieweru nesmaže stále platné úložiště stažení a resetování widgetu v prohlížeči neprodlouží žádné TTL.
Odstraňování potíží
| Příznak | Kontrola |
|---|---|
Selhání získání DocumentConverter | Registrace ConverterPlugin proběhla uvnitř AddDoconut() |
| Aplikace selže během startu | Načtená licence přiděluje Converter |
| Převod streamu hlásí nepodporovaný formát | sourceExtension obsahuje úvodní tečku |
| JavaScript widgetu se načte, ale požadavky vrací 404 | AddConverterWidget() nebylo zavoláno |
| Požadavky widgetu používají špatnou URL | basePath odpovídá větvi, kde je UseDoconut() namapováno |
| Chybí cíl | Použijte allowedTargets vrácené convert=open; ne každý zdroj podporuje každý enum cíl |
| Stáhnutí vypršelo | Opakujte convert=open/convert=run; tokeny úložiště jsou úmyslně dočasné |
Vodoznakování
S registrovaným ConverterPlugin je licence hosta v jednom ze tří stavů:
| Stav licence | Brána při startu | Výstup převodu |
|---|---|---|
Placená licence vieweru, která přiděluje Converter, v platnosti | Projde | Čistý — watermarked: false |
| Aktivní evaluační (demo/NFR) licence | Projde | Úspěšně převádí, opatřeno evaluačním vodoznakem — watermarked: true |
Nelicencováno, legacy soubor TRIAL, nebo ne‑dočasná licence, která nepřiděluje Converter | Aplikace se nikdy nespustí — brána popsaná výše vyhodí výjimku | — |
| Vypršená dočasná/demo licence | Registrace přežije vypršení | Převádí s evaluačním vodoznakem — watermarked: true |
Oba cesty výpočtu flagu používají stejný pravidlo: C# fasáda DocumentConverter odvozuje ho interně ze stavu licence IsViewerLicensed a IsTemporary, a handler widgetu ?convert=run provádí ekvivalentní kontrolu (IsViewerLicensed && !IsTrial && !IsTemporary) pro naplnění pole watermarked ve své odpovědi. Integraci lze postavit a testovat end‑to‑end na evaluační licenci před zakoupením — mění se jen výstupní bajty.
Byla tato stránka užitečná?