Plugin di Conversione
Converti documenti in 24 formati di destinazione
Il plugin Converter trasforma Doconut in un servizio di conversione di documenti. Contribuisce al motore dietro la facciata pubblica DocumentConverter e — opzionale — un widget plug‑and‑play con il proprio contratto HTTP, così puoi convertire documenti da C#, dal widget o da un frontend che scrivi tu stesso.
Installa il pacchetto
Installa l'ultima versione stabile del plugin Converter:
dotnet add package Doconut.NET6.ConverterPer fissare il plugin alla versione corrente 26.7.0, passa la versione separatamente:
dotnet add package Doconut.NET6.Converter --version 26.7.0Conserva il pacchetto Converter alla stessa versione di Doconut.NET6. L'ID del pacchetto è
Doconut.NET6.Converter; .26.7.0 appare solo nel nome del file .nupkg scaricato.
Registra il plugin
Non esiste un metodo AddConverter() — il modello di plugin di Doconut è uniforme. Ogni plugin, incluso Converter, si registra allo stesso modo: chiama AddPlugin<TPlugin>() all'interno di AddDoconut(). ConverterPlugin è distribuito nel proprio pacchetto NuGet, Doconut.NET6.Converter, installato insieme al pacchetto base del visualizzatore.
builder.Services.AddDoconut(options =>
{
options.LicensePath = "Doconut.Viewer.lic";
options.AddPlugin<Doconut.Plugins.Converter.ConverterPlugin>();
});Questa chiamata genera un'eccezione all'avvio per una licenza mancante, un file legacy
TRIALo una licenza non temporanea che non concede la capacitàConverter— unInvalidOperationExceptionsollevato all'interno diAddDoconut(), prima che l'app gestisca le richieste. Le registrazioni temporanee Demo/NFR sono accettate; dopo la loro scadenza, la conversione rimane disponibile con output filigranato. Non esiste un livello gratuito silenzioso. Vedi Configurazione della licenza per come vengono caricate le licenze.
Converti da C#
Tutta conversione restituisce un MemoryStream ricercabile posizionato a 0, pronto per la lettura o la copia immediata. Risolvi DocumentConverter dal DI ovunque ne abbia bisogno — è senza stato per progettazione, quindi una singola istanza è sicura da riutilizzare tra le richieste.
// 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);Due dettagli facili da sbagliare: sourceExtension nella sovraccarico dello stream deve includere il punto iniziale (".xlsx", non "xlsx") — il convertitore lo confronta con il catalogo dei formati e un'estensione senza punto non verrà risolta. E nonostante il nome, WordToHtmlAsync restituisce Task<Stream>, non Task<string> — ottieni il documento HTML (immagini incorporate come Base64) come stream, allo stesso modo di ogni altro risultato di conversione.
Formati di destinazione
Pdf, Docx, Doc, Html, Xlsx, Pptx, Png, Jpeg, Csv, Tiff, Bmp, Gif, Svg, Xml,
Txt, Xls, Jp2, Rtf, Odt, Ods, Odp, Epub, Xps, WebpNon tutte le sorgenti si convertono in tutti i formati di destinazione — il plugin mappa ogni famiglia di formato della sorgente (Word, Excel, PowerPoint, PDF, CAD, Immagine, Email, Diagramma, Progetto/Attività, PSD, documento web) al proprio insieme fisso di destinazioni consentite. Non codificare rigidamente questo enum come elenco di destinazioni nella tua UI: ?convert=open restituisce gli effettivi allowedTargets per il file appena caricato, e questo è ciò che dovrebbe guidare il selettore.
Widget plug‑and‑play
Gli endpoint ?convert=open|run|download del widget sono opzionali e disabilitati di default — sicuri per impostazione predefinita. Abilitali lato server, insieme alla registrazione del plugin:
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>Senza AddConverterWidget(), i tre endpoint ?convert= rispondono 404 — ma il file JS stesso viene comunque servito (è una semplice risorsa statica incorporata; solo gli endpoint a cui si collega sono protetti). AddConverterWidget() richiede comunque che il plugin Converter sia registrato e che una licenza conceda Converter — non concede diritti di conversione da solo.
Personalizza il widget
Opzioni di inizializzazione passate a Doconut.convert(selector, options):
| Opzione | Tipo | Predefinito | Note |
|---|---|---|---|
basePath | string | /doconut | Percorso base per gli endpoint ?convert=; deve corrispondere al ramo ASP.NET dove UseDoconut() è effettivamente montato (normalmente coordinato tramite MiddlewarePath). |
resPath | string | /doconut-res | Accettato per coerenza di configurazione con altri widget Doconut; attualmente il widget converter non costruisce alcun URL da esso. |
maxUploadMb | number | 25 | Solo controllo preliminare lato client — rifiuta un file troppo grande prima del caricamento. Il server applica il proprio limite in modo indipendente e risponde 413 se superato. |
licenseUrl | string | null | null | Quando impostato, trasforma l'avviso di filigrana nella schermata del risultato in un collegamento a questo URL. |
labels | object | {} | Sovrascrive qualsiasi sottoinsieme delle stringhe predefinite in inglese del widget (testo di drop, pulsanti, annunci aria-live, messaggi di errore). |
Callback:
| Callback | Viene attivato quando | Dati |
|---|---|---|
onReady() | Il widget ha renderizzato la sua schermata inattiva/drop. | — |
onSourceLoaded({ token, pages, sourceExt, allowedTargets }) | ?convert=open ha avuto successo | token di sessione della sorgente, conteggio pagine, estensione della sorgente (senza punto iniziale), elenco delle destinazioni consentite |
onConverted({ downloadToken, resultToken, resultPages, downloadName, watermarked, target }) | ?convert=run ha avuto successo | stessi campi della risposta run, più il target richiesto |
onDownload({ downloadName, downloadToken }) | L'utente clicca sul collegamento Download | viene attivato insieme al download nativo del browser — non intercetta né sostituisce il download |
onError({ phase, message }) | Una richiesta open o run fallisce | phase è 'open' o 'run'; message è l'errore del server sanitizzato (o un messaggio lato client per il controllo preliminare della dimensione del caricamento) |
Doconut.convert() restituisce l'istanza del widget stessa — tienila a portata di mano per controllare il widget programmaticamente:
const conv = Doconut.convert('#doconut-convert', { basePath: '/doconut' });
conv.reset(); // back to the idle/drop screen; does not re-fire onReady
conv.loadFile(file); // starts the flow with a File object; no-op unless currently idle
conv.destroy(); // removes listeners, empties the mount; the instance is unusable after thisCostruisci il tuo frontend
Il widget è solo un client per questo contratto HTTP — costruisci il tuo frontend direttamente contro di esso per un'esperienza utente diversa. Tutte e tre le rotte si trovano sotto il ramo ASP.NET dove UseDoconut() è montato (normalmente /doconut):
| Rotta | Scopo | Risposta di successo |
|---|---|---|
POST ?convert=open (multipart, field file) | Carica e apre un documento sorgente per l'anteprima | 200 — { token, pages, sourceExt, allowedTargets } |
POST ?token=<token>&convert=run&target=<ext> | Converti la sorgente memorizzata in target | 200 — { downloadToken, resultToken, resultPages, downloadName, watermarked } |
GET ?convert=download&token=<downloadToken> | Trasmetti in streaming il file convertito | 200 — file bytes, Content-Disposition: attachment, Cache-Control: no-store |
I byte della sorgente caricata sono conservati lato server con un TTL di 30 minuti; una volta scaduto questo intervallo, run risponde 404 e il file deve essere riaperto. Il risultato convertito vive nella stessa cache — downloadToken ottiene una nuova finestra di 30 minuti al completamento della conversione — mentre resultToken è un normale token di sessione del visualizzatore il cui tempo di vita segue la cache della sessione del visualizzatore, indipendente dalla cache.
sourceExt nella risposta open non ha il punto iniziale (es. "docx") — è l'opposto della convenzione del parametro sourceExtension su DocumentConverter.ConvertAsync, che ne richiede uno.
Modalità di errore, raggruppate per rotta
| Rotta | Stato | Quando | Corpo |
|---|---|---|---|
| any | 404 | Il widget non è abilitato (AddConverterWidget() non è mai stato chiamato) — verificato prima che qualsiasi delle tre rotte venga gestita | solo lo stato |
| any | 405 | Verbo HTTP errato (open/run richiedono POST; download richiede GET) | solo lo stato |
open | 413 | Il file caricato supera MaxUploadMb | { "error": "File is too large." } |
open | 400 | Nessun corpo multipart, nessun file, o un'estensione sorgente che non può essere convertita | { "error": "..." } |
run | 400 | Token malformato (non è un GUID), o un target che non viene interpretato come ConversionTarget | { "error": "Invalid token." } / { "error": "Unknown target format." } |
run | 400 | target non è presente negli allowedTargets della sorgente | { "error": "That target format is not available for this file." } |
run | 404 | L'upload memorizzato è scaduto (TTL 30 minuti) o il token non è mai stato aperto | { "error": "Upload expired — please re-open the file." } |
open, run | 500 | Elaborazione fallita internamente | { "error": "<sanitized message>" } — sanitizzato allo stesso modo di tutti gli altri percorsi di errore Doconut; non rivela mai i nomi dei motori interni |
download | 400 | Token malformato (non è un GUID) | solo lo stato |
download | 404 | Token di download sconosciuto o scaduto | solo lo stato |
Proprietà delle risorse
Il converter restituisce un MemoryStream ricercabile posizionato a zero. Chi chiama possiede quello stream e dovrebbe eliminarlo dopo aver copiato o restituito il suo contenuto. Il servizio DocumentConverter stesso è senza stato e viene risolto dall'iniezione delle dipendenze; non costruire o eliminare manualmente il servizio.
Per il widget web, le cache di upload e download hanno TTL indipendenti di 30 minuti. Un resultToken del visualizzatore segue invece la durata della sessione del visualizzatore. Chiudere un risultato del visualizzatore non elimina una cache di download ancora valida, e il reset del widget del browser non estende nessuno dei due TTL.
Risoluzione dei problemi
| Sintomo | Verifica |
|---|---|
La risoluzione di DocumentConverter fallisce | La registrazione di ConverterPlugin è avvenuta all'interno di AddDoconut() |
| L'applicazione fallisce durante l'avvio | La licenza caricata concede Converter |
| La conversione dello stream indica che il formato non è supportato | sourceExtension include il punto iniziale |
| Il JavaScript del widget si carica ma le richieste restituiscono 404 | AddConverterWidget() non è stato chiamato |
| Le richieste del widget usano l'URL sbagliato | basePath corrisponde al ramo dove UseDoconut() è mappato |
| La destinazione è mancante | Usa allowedTargets restituito da convert=open; non tutte le sorgenti supportano ogni destinazione enum |
| Il download è scaduto | Ripeti convert=open/convert=run; i token di cache sono intenzionalmente temporanei |
Filigrana
Con ConverterPlugin registrato, la licenza dell'host è in uno dei tre stati:
| Stato della licenza | Gate di avvio | Output della conversione |
|---|---|---|
Licenza viewer a pagamento che concede Converter, entro il suo periodo di validità | Supera | Pulito — watermarked: false |
| Licenza di valutazione attiva (demo/NFR) | Supera | Converte con successo, contrassegnata con la filigrana di valutazione — watermarked: true |
Senza licenza, un file legacy TRIAL, o una licenza non temporanea che non concede Converter | L'app non avvia mai — il gate di avvio descritto sopra genera un'eccezione | — |
| Licenza Temporanea/Demo scaduta | La registrazione sopravvive alla scadenza | Converte con la filigrana di valutazione — watermarked: true |
Entrambi i percorsi di chiamata calcolano il flag dalla stessa regola: la facciata C# DocumentConverter lo deriva internamente dallo stato IsViewerLicensed e IsTemporary della licenza, e il gestore ?convert=run del widget esegue lo stesso controllo (IsViewerLicensed && !IsTrial && !IsTemporary) per compilare il campo watermarked restituito. Un'integrazione può essere costruita e testata end‑to‑end su una licenza di valutazione prima dell'acquisto — solo i byte di output cambiano.
Questa pagina è stata utile?