Plugin di Conversione

Converti documenti in 45 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 pronto all'uso 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:

bash
dotnet add package Doconut.NETStandard.Converter

Per fissare il plugin alla versione corrente 26.8.0, passa la versione separatamente:

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

Mantieni il pacchetto Converter alla stessa versione di Doconut.NETStandard. L'ID del pacchetto è Doconut.NETStandard.Converter; .26.8.0 appare solo nel nome file scaricato .nupkg.

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 è fornito nel proprio pacchetto NuGet, Doconut.NETStandard.Converter, installato accanto al pacchetto del visualizzatore di base.

csharp
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 — un InvalidOperationException sollevato dall'interno di AddDoconut(), prima che l'app gestisca le richieste. Sono accettate registrazioni temporanee Demo/NFR; dopo la loro scadenza, la conversione rimane disponibile con output filigranato. Non esiste un livello gratuito silenzioso. Vedi Configurazione Licenza per come vengono caricate le licenze.

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 ne abbia bisogno — è senza stato per design, quindi una singola istanza è sicura da riutilizzare tra le richieste.

viewer.Converter.GetConverter() non esiste qui. La conversione non è più raggiunta tramite l'istanza del visualizzatore: inietta Doconut.DocumentConverter invece.

csharp
// Inietta DocumentConverter; il suo costruttore è interno, quindi non usarlo mai con `new`.
Stream pdf = await converter.ConvertAsync("contract.docx", ConversionTarget.Pdf, ct: ct);
csharp
// 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);
csharp
Stream html = await converter.WordToHtmlAsync("report.docx", ct);
csharp
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, lo stesso di ogni altro risultato di conversione.

Formati di destinazione

ConversionTarget (namespace Doconut.Configs.Conversion) ha 45 membri:

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

Questo enum copre ogni famiglia di origine. La libreria precedente aveva un tipo *ConfigConverter per famiglia — WordConfigConverter, ExcelConfigConverter, e così via — ciascuno con il proprio enum EnTargetFormat annidato, più un enum SourceFormatConverter per l'input. Tutti sono scomparsi; vedi la guida alla migrazione.

Non ogni origine si converte in ogni destinazione — il plugin mappa la famiglia di formato di ogni origine (Word, Excel, PowerPoint, PDF, CAD, Immagine, Email, Diagramma, Progetto/Attività, PSD, documento web) al proprio set fisso di destinazioni consentite. Non codificare rigidamente questo enum come lista di destinazioni della tua UI: ?convert=open restituisce il reale allowedTargets per qualsiasi file appena caricato, e questo è ciò che dovrebbe guidare un selettore.

Widget integrabile

Il widget ha endpoint ?convert=open|run|download opzionali e disabilitati di default — sicuri per impostazione predefinita. Abilitale lato server, insieme alla registrazione del plugin:

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>

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 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):

OpzioneTipoPredefinitoNote
basePathstring/doconutPercorso base per gli endpoint ?convert=; deve corrispondere al ramo ASP.NET dove UseDoconut() è effettivamente montato (normalmente coordinato tramite MiddlewarePath)
resPathstring/doconut-resAccettato per coerenza di configurazione con altri widget Doconut; il widget converter attualmente non costruisce alcun URL da esso
maxUploadMbnumber25Solo 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
licenseUrlstring | nullnullSe impostato, trasforma l'avviso di watermark nella schermata di risultato in un collegamento a questo URL
labelsobject{}Sovrascrive qualsiasi sottoinsieme delle stringhe predefinite in inglese del widget (testo di trascinamento, pulsanti, annunci aria-live, messaggi di errore)

Callback:

CallbackAttivata quandoPayload
onReady()Il widget ha renderizzato la sua schermata inattiva/di trascinamento—
onSourceLoaded({ token, pages, sourceExt, allowedTargets })?convert=open ha successotoken di sessione sorgente, conteggio pagine, estensione sorgente (senza punto iniziale), elenco dei target consentiti
onConverted({ downloadToken, resultToken, resultPages, downloadName, watermarked, target })?convert=run ha successostessi campi della risposta di esecuzione, più il target richiesto
onDownload({ downloadName, downloadToken })L'utente clicca sul collegamento Downloadsi attiva insieme al download nativo del browser — non lo intercetta né lo sostituisce
onError({ phase, message })Una richiesta di apertura o esecuzione falliscephase è 'open' o 'run'; message è l'errore del server sanitizzato (o un messaggio lato client per il pre-controllo della dimensione di upload)

Doconut.convert() restituisce l'istanza del widget stessa — tienila per controllare il widget programmaticamente:

javascript
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 questo

Costruisci 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):

RottaScopoRisposta di successo
POST ?convert=open (multipart, field file)Carica e apri un documento sorgente per l'anteprima200 — { token, pages, sourceExt, allowedTargets }
POST ?token=<token>&convert=run&target=<ext>Converti la sorgente archiviata in target200 — { downloadToken, resultToken, resultPages, downloadName, watermarked }
GET ?convert=download&token=<downloadToken>Trasmetti in streaming il file convertito200 — file bytes, Content-Disposition: attachment, Cache-Control: no-store

I byte della sorgente caricata sono 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 la propria finestra fresca di 30 minuti al completamento della conversione — mentre resultToken è un normale token di sessione del visualizzatore il cui ciclo di vita segue la cache di 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:

RottaStatoQuandoCorpo
any404Il widget non è abilitato (AddConverterWidget() non è mai stato chiamato) — verificato prima che una delle tre rotte venga inviatasolo stato
any405Verbo HTTP errato (open/run richiedono POST; download richiede GET)solo stato
open413Il file caricato supera MaxUploadMb{ "error": "File is too large." }
open400Nessun corpo multipart, nessun file, o un'estensione sorgente che non può essere convertita{ "error": "..." }
run400Token malformato (non un GUID), o un target che non si analizza in un ConversionTarget{ "error": "Invalid token." } / { "error": "Unknown target format." }
run400target non è presente nel allowedTargets della sorgente{ "error": "That target format is not available for this file." }
run404L'upload archiviato è scaduto (TTL di 30 minuti) o il token non è mai stato aperto{ "error": "Upload expired — please re-open the file." }
open, run500Elaborazione 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
download400Token malformato (non un GUID)solo stato
download404Token di download sconosciuto o scadutosolo 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 widget web, i depositi di caricamento 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 un deposito di download ancora valido, e il ripristino del widget del browser non estende nessuno dei due TTL.

Risoluzione dei problemi

SintomoVerifica
Risoluzione di DocumentConverter fallitaConverterPlugin registrazione avvenuta all'interno di AddDoconut()
L'applicazione fallisce durante l'avvioLa licenza caricata concede Converter
La conversione dello stream indica che il formato non è supportatosourceExtension include il punto iniziale
Il JavaScript del widget si carica ma le richieste restituiscono 404AddConverterWidget() non è stato chiamato
Le richieste del widget usano l'URL erratobasePath corrisponde al ramo dove UseDoconut() è mappato
Il target è mancanteUsa allowedTargets restituito da convert=open; non tutte le sorgenti supportano ogni target enum
Download scadutoRipeti convert=open/convert=run; i token di stash sono intenzionalmente temporanei

Filigranatura

Con ConverterPlugin registrato, la licenza dell'host è in uno dei tre stati:

Stato della licenzaGate di avvioOutput di conversione
Licenza visualizzatore a pagamento che concede Converter, entro il suo periodo di validitàPassaPulito — watermarked: false
Licenza di valutazione attiva (demo/NFR)PassaConverte con successo, contrassegnata con la filigrana di valutazione — watermarked: true
Senza licenza, un file legacy TRIAL, o una licenza non temporanea che non concede ConverterL'app non avvia mai — il gate di avvio descritto sopra genera un'eccezione—
Licenza temporanea/demo scadutaLa registrazione sopravvive alla scadenzaConverte 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 il controllo equivalente (IsViewerLicensed && !IsTrial && !IsTemporary) per compilare il campo watermarked che restituisce. 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?