Plugin pro převod

Převádějte dokumenty do 45 cílových formátů

Plugin Converter promění Doconut na službu pro převod dokumentů. Přispívá k enginu za veřejnou DocumentConverter fasádou a — po opt-in — poskytuje 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 vytvoříte.

Instalace balíčku

Nainstalujte nejnovější stabilní plugin Converter:

bash
dotnet add package Doconut.NETStandard.Converter

Pro připnutí pluginu k aktuálnímu vydání 26.8.0 předávejte verzi samostatně:

bash
dotnet add package Doconut.NETStandard.Converter --version 26.8.0

Udržujte balíček Converter ve stejné verzi jako Doconut.NETStandard. ID balíčku je Doconut.NETStandard.Converter; .26.8.0 se objevuje pouze v názvu 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.NETStandard.Converter, nainstalovaného vedle základního balíčku vieweru.

csharp
builder.Services.AddDoconut(options =>
{
    options.LicensePath = "Doconut.Viewer.lic";
    options.AddPlugin<Doconut.Plugins.Converter.ConverterPlugin>();
});

Toto volání vyvolá výjimku při spuštění při chybějící licenci, starém souboru TRIAL nebo ne‑dočasné licenci, která nepřiděluje schopnost Converter — InvalidOperationException vyvolaná uvnitř AddDoconut(), předtím než aplikace začne obsluhovat požadavky. Dočasné registrace Demo/NFR jsou akceptovány; po jejich kalendářním vypršení zůstává převod dostupný s vodoznakem ve výstupu. Tichý bezplatný tarif neexistuje. Viz Nastavení licence pro způsob načítání licencí.

Převod z C#

Každý převod vrací hledatelný MemoryStream nastavený na 0, připravený okamžitě číst nebo kopírovat. Získejte DocumentConverter z DI kdekoliv jej potřebujete — je navržen jako bezstavový, takže jedna instance je bezpečná pro opakované použití napříč požadavky.

viewer.Converter.GetConverter() zde neexistuje. Převod již není dosažitelný prostřednictvím instance vieweru: místo toho injektujte Doconut.DocumentConverter.

csharp
// Vložte DocumentConverter; jeho konstruktor je interní, takže jej nikdy ne`new`.
Stream pdf = await converter.ConvertAsync("contract.docx", ConversionTarget.Pdf, ct: ct);
csharp
// 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);
csharp
Stream html = await converter.WordToHtmlAsync("report.docx", ct);
csharp
Stream docx = await converter.HtmlToWordAsync(html, ConversionTarget.Docx, ct);

Dvě detaily, které se snadno špatně pochopí: sourceExtension u přetížení streamu musí obsahovat úvodní tečku (".xlsx", ne "xlsx") — převodník ji porovnává s katalogem formátů a samotná přípona se nevyřeší. 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 každý jiný výsledek převodu.

Cílové formáty

ConversionTarget (namespace Doconut.Configs.Conversion) má 45 členů:

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, Msg, Eml, Emlx, Mhtml,
Xlsm, Xlsb, Ppt, Docm, Dot, Dotx, Dotm, Vsdx, Vssx, Vstx, Vsdm, Vssm, Vstm,
Vdx, Vsx, Vtx, Ico

Toto enum pokrývá každou zdrojovou rodinu. Předchozí knihovna měla pro každou rodinu *ConfigConverter typ — WordConfigConverter, ExcelConfigConverter, a tak dále — každý s vlastním vnořeným enumem EnTargetFormat, plus enum SourceFormatConverter pro vstup. Všechny jsou odstraněny; viz průvodce migrací.

Ne každý zdroj se převádí na každý cíl — plugin mapuje každou formátovou rodinu zdroje (Word, Excel, PowerPoint, PDF, CAD, Image, Email, Diagram, Project/Task, PSD, webový dokument) na vlastní pevnou sadu povolených cílů. Není vhodné hardcodovat toto enum jako seznam cílů ve vašem UI: ?convert=open vrací skutečný allowedTargets pro jakýkoli právě nahraný soubor, a to by mělo řídit výběr.

Vkládací widget

Widgetové ?convert=open|run|download endpointy jsou volitelné a ve výchozím nastavení jsou zakázané — zabezpečené z defaultu. Povolit je na serveru, spolu s registrací pluginu:

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>

Bez AddConverterWidget(), tři ?convert= endpointy odpovídají 404 — ale samotný soubor JS je stále poskytován (je to prostý vložený statický zdroj; pouze endpointy, ke kterým se připojuje, jsou omezené). AddConverterWidget() stále vyžaduje, aby byl registrován plugin Converter a licence, která poskytuje Converter — neposkytuje konverzní práva sama o sobě.

Přizpůsobení widgetu

Inicializační možnosti předávané Doconut.convert(selector, options):

MožnostTypVýchozíPoznámky
basePathstring/doconutZákladní cesta pro endpointy ?convert=; musí odpovídat větvi ASP.NET, kde je UseDoconut() skutečně nasazen (obvykle koordinováno přes MiddlewarePath)
resPathstring/doconut-resPřijato pro konzistenci konfigurace s ostatními widgety Doconut; widget převodníku momentálně negeneruje žádnou URL z tohoto údaje
maxUploadMbnumber25Pouze klientská předkontrola — odmítne příliš velký soubor před nahráním. Server vynutí svůj vlastní limit nezávisle a odpoví 413, pokud je překročen
licenseUrlstring | nullnullKdyž je nastaveno, změní vodotiskovou poznámku na obrazovce výsledku na odkaz na tuto URL
labelsobject{}Přepíše libovolnou podmnožinu výchozích anglických řetězců widgetu (text pro přetažení, tlačítka, oznámení aria‑live, chybové zprávy)

Callbacky:

CallbackKdy se spustíNáklad
onReady()Widget vykreslil svou nečinnou/přetahovací obrazovku—
onSourceLoaded({ token, pages, sourceExt, allowedTargets })Když ?convert=open uspějetoken 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 })Když ?convert=run uspějestejné pole jako v odpovědi spuštění, plus požadovaný target
onDownload({ downloadName, downloadToken })Uživatel klikne na odkaz Stáhnoutspustí se současně s nativním stahováním prohlížeče — nezasahuje ani nenahrazuje jej
onError({ phase, message })Požadavek na otevření nebo spuštění selžephase je 'open' nebo 'run'; message je sanitizovaná chyba serveru (nebo zpráva na straně klienta pro předkontrolu velikosti nahrávaného souboru)

Doconut.convert() vrací samotnou instanci widgetu — uchovejte ji pro programové ovládání widgetu:

javascript
const conv = Doconut.convert('#doconut-convert', { basePath: '/doconut' });
conv.reset();         // zpět na obrazovku nečinnosti/odhození; nespustí onReady znovu
conv.loadFile(file);  // spustí tok s objektem File; žádná operace, pokud není aktuálně nečinný
conv.destroy();       // odstraní posluchače, vyprázdní mount; instance je po tomto nepoužitelná

Vytvořte si vlastní frontend

Widget je jen klient pro tuto HTTP smlouvu — vytvořte si vlastní frontend přímo proti ní pro odlišnou uživatelskou zkušenost. Všechny tři cesty jsou pod větví ASP.NET, kde je nasazen UseDoconut() (obvykle /doconut):

CestaÚčelÚspěšná odpověď
POST ?convert=open (multipart, pole file)Nahrát a otevřít zdrojový dokument pro náhled200 — { token, pages, sourceExt, allowedTargets }
POST ?token=<token>&convert=run&target=<ext>Převést uložený zdroj na target200 — { downloadToken, resultToken, resultPages, downloadName, watermarked }
GET ?convert=download&token=<downloadToken>Streamovat převedený soubor200 — bajty souboru, Content-Disposition: attachment, Cache-Control: no-store

Nahrané bajty zdroje jsou uloženy na serveru s TTL 30 minut; po uplynutí tohoto intervalu run odpoví 404 a soubor musí být znovu otevřen. Převodní výsledek žije ve stejném úložišti — downloadToken získá vlastní čerstvé 30‑minutové okno po dokončení konverze — zatímco resultToken je běžný token relace prohlížeče, jehož životnost následuje cache relace prohlížeče, nezávisle na úložišti.

sourceExt v odpovědi open nemá úvodní tečku (např. "docx") — opačná konvence oproti parametru sourceExtension na DocumentConverter.ConvertAsync, který tečku vyžaduje.

Režimy selhání, seskupené podle cesty:

CestaStavKdyTělo
libovolná404Widget není povolen (AddConverterWidget() nebyl nikdy zavolán) — kontrolováno před odesláním jakékoli ze tří cestpouze stav
libovolná405Špatná HTTP metoda (open/run vyžadují POST; download vyžaduje GET)pouze stav
open413Nahraný soubor překračuje MaxUploadMb{ "error": "File is too large." }
open400Žádné multipart tělo, žádný soubor nebo přípona zdroje, kterou nelze převést{ "error": "..." }
run400Poškozený token (není GUID) nebo target, který se nedá parsovat na ConversionTarget{ "error": "Invalid token." } / { "error": "Unknown target format." }
run400target není v allowedTargets zdroje{ "error": "That target format is not available for this file." }
run404Uložené nahrání vypršelo (TTL 30 min) nebo token nikdy nebyl otevřen{ "error": "Upload expired — please re-open the file." }
open, run500Zpracování selhalo interně{ "error": "<sanitized message>" } — sanitizováno stejným způsobem jako každá jiná chybová cesta Doconut; nikdy neprozrazuje interní názvy enginu
download400Poškozený token (není GUID)pouze stav
download404Neznámý nebo vypršený token pro staženípouze stav

Vlastnictví zdroje

Převodník vrací seekovatelný MemoryStream umístěný na nule. Volající vlastní tento stream a měl by jej po zkopírování nebo vrácení jeho obsahu uvolnit. Služba DocumentConverter je sama o sobě bezstavová a je získávána z dependency injection; nesmí se služba vytvářet ani ručně uvolňovat.

Pro webový widget mají úložiště nahrávání a stahování nezávislé TTL 30 minut. Prohlížeč resultToken se řídí životností relace prohlížeče místo toho. Uzavření výsledku prohlížeče nesmaže stále platné úložiště stahování a resetování widgetu v prohlížeči neprodlouží žádné z TTL.

Odstraňování potíží

SymptomKontrola
Selhání při řešení DocumentConverterConverterPlugin registrace proběhla uvnitř AddDoconut()
Aplikace selže během spouštěníNačtená licence uděluje Converter
Převod streamu uvádí, že formát není podporovánsourceExtension obsahuje úvodní tečku
JavaScript widgetu se načte, ale požadavky vrací 404AddConverterWidget() nebyl zavolán
Požadavky widgetu používají špatnou URLbasePath odpovídá větvi, kde je UseDoconut() namapován
Cíl chybíPoužijte allowedTargets vrácený convert=open; ne každý zdroj podporuje každý cílový enum
Stahování vypršeloOpakujte convert=open/convert=run; tokeny úložiště jsou úmyslně dočasné

Vodoznakování

S registrovaným ConverterPlugin je licence hostitele v jednom ze tří stavů:

Stav licenceSpouštěcí bránaVýstup převodu
Placená licence vieweru udělující Converter, v rámci její platnostiProcházíČistý — watermarked: false
Aktivní evaluační (demo/NFR) licenceProcházíÚspěšně převádí, opatřeno evaluačním vodoznakem — watermarked: true
Bez licence, starý soubor TRIAL, nebo ne dočasná licence, která neuděluje ConverterAplikace se nikdy nespustí — výše popsaná spouštěcí brána vyhodí výjimku—
Vypršená dočasná/demo licenceRegistrace přežije vypršeníPřevádí s evaluačním vodoznakem — watermarked: true

Obě volací cesty vypočítávají příznak ze stejného pravidla: rozhraní DocumentConverter v C# jej interně odvozuje z IsViewerLicensed a stavu IsTemporary licence, a obslužná rutina widgetu ?convert=run provádí ekvivalentní kontrolu (IsViewerLicensed && !IsTrial && !IsTemporary) pro vyplnění pole watermarked, které vrací. Integraci lze postavit a otestovat kompletně na evaluační licenci před nákupem — mění se jen výstupní bajty.

Byla tato stránka užitečná?