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 — opzionalmente — 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'ultimo plugin Converter stabile:
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.0Mantieni il pacchetto Converter alla stessa versione di Doconut.NET6. L'ID del pacchetto è
Doconut.NET6.Converter; .26.7.0 appare solo nel nome file scaricato .nupkg.
Registra il plugin
Non esiste alcun 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 è fornito nel suo pacchetto NuGet, Doconut.NET6.Converter, installato accanto al pacchetto del visualizzatore di base.
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
TRIAL, o una licenza non temporanea che non concede la capacitàConverter— unInvalidOperationExceptionsollevato dall'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 le licenze vengono caricate.
Converti da C#
Ogni conversione restituisce un MemoryStream ricercabile posizionato a 0, pronto per la lettura o la copia immediata. Risolvi DocumentConverter dal DI ovunque ti serva — è senza stato per design, quindi una singola istanza è sicura da riutilizzare tra le richieste.
// Inietta DocumentConverter; il suo costruttore è interno, quindi non usarlo mai `new`.
Stream pdf = await converter.ConvertAsync("contract.docx", ConversionTarget.Pdf, ct: ct);// sourceExtension include il punto iniziale. password è null a meno che il documento non sia protetto.
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 sul 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, come tutti gli altri risultati 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 target — il plugin mappa ogni famiglia di formati della sorgente (Word, Excel, PowerPoint, PDF, CAD, Immagine, Email, Diagramma, Progetto/Attività, PSD, documento web) al proprio insieme fisso di target consentiti. Non codificare in modo rigido questo enum come elenco dei target della tua UI: ?convert=open restituisce il reale allowedTargets per qualsiasi file appena caricato, ed è questo che dovrebbe guidare il selettore.
Widget integrabile
Gli endpoint ?convert=open|run|download del widget sono opzionali e disabilitati per impostazione predefinita — sicuri di default. 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 viene comunque servito (è una semplice risorsa statica incorporata; solo gli endpoint a cui si collega sono protetti). AddConverterWidget() richiede ancora che il plugin Converter sia registrato e una licenza che conceda Converter — non concede i 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; il widget converter attualmente non genera alcun URL da esso |
maxUploadMb | number | 25 | Solo pre‑controllo lato client — rifiuta un file troppo grande prima del caricamento. Il server applica il proprio limite in modo indipendente e risponde 413 se viene superato |
licenseUrl | string | null | null | Se impostato, trasforma l'avviso di watermark nella schermata di 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 | Attivato quando | Dati |
|---|---|---|
onReady() | Il widget ha renderizzato la sua schermata idle/drop | — |
onSourceLoaded({ token, pages, sourceExt, allowedTargets }) | ?convert=open ha avuto successo | token di sessione sorgente, conteggio pagine, estensione sorgente (senza punto iniziale), elenco dei target consentiti |
onConverted({ downloadToken, resultToken, resultPages, downloadName, watermarked, target }) | ?convert=run ha avuto successo | stessi campi della risposta di run, più il target richiesto |
onDownload({ downloadName, downloadToken }) | L'utente clicca sul collegamento Download | si attiva insieme al download nativo del browser — non lo intercetta né lo sostituisce |
onError({ phase, message }) | Una richiesta di apertura o esecuzione fallisce | phase è 'open' o 'run'; message è l'errore del server sanitizzato (o un messaggio client‑side per il pre‑controllo della dimensione di upload) |
Doconut.convert() restituisce l'istanza del widget stessa — conservala per controllare il widget programmaticamente:
const conv = Doconut.convert('#doconut-convert', { basePath: '/doconut' });
conv.reset(); // torna alla schermata idle/drop; non riattiva onReady
conv.loadFile(file); // avvia il flusso con un oggetto File; no-op a meno che non sia attualmente idle
conv.destroy(); // rimuove i listener, svuota il mount; l'istanza non è più utilizzabile dopo questoCrea il tuo frontend
Il widget è solo un client per questo contratto HTTP — costruisci il tuo frontend direttamente su 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 apri un documento sorgente per l'anteprima | 200 — { token, pages, sourceExt, allowedTargets } |
POST ?token=<token>&convert=run&target=<ext> | Converti la sorgente archiviata 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 vengono archiviati 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 nello stesso archivio — downloadToken ottiene una sua nuova finestra di 30 minuti al completamento della conversione — mentre resultToken è un normale token di sessione del visualizzatore il cui ciclo di vita segue la cache della sessione del visualizzatore, indipendente dall'archivio.
sourceExt nella risposta open non ha punto iniziale (es. "docx") — la convenzione opposta rispetto al parametro sourceExtension su DocumentConverter.ConvertAsync, che ne richiede uno.
Modalità di errore, raggruppate per rotta:
| Rotta | Stato | Quando | Corpo |
|---|---|---|---|
| qualsiasi | 404 | Il widget non è abilitato (AddConverterWidget() non è mai stato chiamato) — verificato prima che una delle tre rotte venga invocata | solo stato |
| qualsiasi | 405 | Verbo HTTP errato (open/run richiedono POST; download richiede GET) | solo stato |
open | 413 | Il file caricato supera MaxUploadMb | { "error": "File is too large." } |
open | 400 | Nessun corpo multipart, nessun file, o un'estensione sorgente non convertibile | { "error": "..." } |
run | 400 | Token malformato (non è un GUID), o un target che non si analizza in un ConversionTarget | { "error": "Invalid token." } / { "error": "Unknown target format." } |
run | 400 | target non è presente nel allowedTargets della sorgente | { "error": "That target format is not available for this file." } |
run | 404 | L'upload archiviato è scaduto (TTL di 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 ogni altro percorso di errore Doconut; non trapela mai i nomi dei motori interni |
download | 400 | Token malformato (non è un GUID) | solo stato |
download | 404 | Token di download sconosciuto o scaduto | solo stato |
Proprietà della risorsa
Il convertitore restituisce un MemoryStream ricercabile posizionato a zero. Il chiamante possiede quel flusso e dovrebbe eliminarlo dopo averlo copiato o restituito il suo contenuto. Il servizio DocumentConverter è senza stato e viene risolto tramite l'iniezione delle dipendenze; non costruire o eliminare manualmente il servizio.
Per il componente web, le cache di caricamento e scaricamento 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 scaricamento ancora valida, e il ripristino del componente del browser non estende nessuno dei due TTL.
Risoluzione dei problemi
| Sintomo | Controllo |
|---|---|
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 del flusso indica che il formato non è supportato | sourceExtension include il punto iniziale |
| Il JavaScript del componente si carica ma le richieste restituiscono 404 | AddConverterWidget() non è stato chiamato |
| Le richieste del componente usano l'URL sbagliato | basePath corrisponde al ramo dove UseDoconut() è mappato |
| L'obiettivo è mancante | Usa allowedTargets restituito da convert=open; non tutte le sorgenti supportano ogni enum destinazione |
| Scaricamento scaduto | Ripeti convert=open/convert=run; i token della cache sono intenzionalmente temporanei |
Filigranatura
Con ConverterPlugin registrato, la licenza dell'host è in uno dei tre stati:
| Stato della licenza | Porta di avvio | Output della conversione |
|---|---|---|
Licenza visualizzatore a pagamento che concede Converter, entro il suo periodo di validità | Passa | Pulito — watermarked: false |
| Licenza di valutazione attiva (demo/NFR) | Passa | 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 — la porta di avvio descritta sopra lancia 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 l'indicatore dalla stessa regola: la facciata C# DocumentConverter lo deriva internamente dallo stato IsViewerLicensed e IsTemporary della licenza, e il gestore ?convert=run del componente esegue il controllo equivalente (IsViewerLicensed && !IsTrial && !IsTemporary) per riempire il campo watermarked che restituisce. Un'integrazione può essere costruita e testata da inizio a fine su una licenza di valutazione prima dell'acquisto — solo i byte di output cambiano.
Questa pagina è stata utile?