Plugin Konverter

Ubah dokumen menjadi 24 format target

Plugin Converter mengubah Doconut menjadi layanan konversi dokumen. Ia menyediakan mesin di balik fasad publik DocumentConverter, dan — opsional — widget siap pakai dengan kontrak HTTP-nya sendiri, sehingga Anda dapat mengonversi dokumen dari C#, dari widget, atau dari frontend yang Anda buat sendiri.

Instal paket

Instal plugin Converter terbaru yang stabil:

bash
dotnet add package Doconut.NET8.Converter

Untuk mengunci plugin ke rilis 26.7.0 saat ini, berikan versi secara terpisah:

bash
dotnet add package Doconut.NET8.Converter --version 26.7.0

Jaga paket Converter pada versi yang sama dengan Doconut.NET8. ID paketnya adalah Doconut.NET8.Converter; .26.7.0 hanya muncul dalam nama file .nupkg yang diunduh.

Daftarkan plugin

Tidak ada metode AddConverter() — model plugin Doconut seragam. Setiap plugin, termasuk Converter, didaftarkan dengan cara yang sama: panggil AddPlugin<TPlugin>() di dalam AddDoconut(). ConverterPlugin tersedia dalam paket NuGet terpisah, Doconut.NET8.Converter, yang dipasang bersamaan dengan paket penampil dasar.

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

Panggilan ini melempar pengecualian saat startup bila lisensi hilang, file TRIAL lama, atau lisensi non-temporer yang tidak memberikan kemampuan Converter — sebuah InvalidOperationException yang dihasilkan dari dalam AddDoconut(), sebelum aplikasi melayani permintaan. Registrasi Demo/NFR sementara diterima; setelah masa berlakunya berakhir, konversi tetap tersedia dengan output berwatermark. Tidak ada tingkatan gratis yang diam. Lihat Pengaturan Lisensi untuk cara memuat lisensi.

Konversi dari C#

Setiap konversi mengembalikan MemoryStream yang dapat dicari dengan posisi 0, siap dibaca atau disalin segera. Dapatkan DocumentConverter dari DI di mana pun Anda membutuhkannya — ia bersifat stateless secara desain, sehingga satu instance aman untuk digunakan kembali di seluruh permintaan.

csharp
// Inject DocumentConverter; its constructor is internal, so never `new` it.
Stream pdf = await converter.ConvertAsync("contract.docx", ConversionTarget.Pdf, ct: ct);
csharp
// 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);
csharp
Stream html = await converter.WordToHtmlAsync("report.docx", ct);
csharp
Stream docx = await converter.HtmlToWordAsync(html, ConversionTarget.Docx, ct);

Dua detail yang mudah keliru: sourceExtension pada overload stream harus menyertakan titik di depannya (".xlsx", bukan "xlsx") — konverter mencocokkannya dengan katalog format dan ekstensi tanpa titik tidak akan terpecahkan. Dan meskipun namanya, WordToHtmlAsync mengembalikan Task<Stream>, bukan Task<string> — Anda mendapatkan dokumen HTML (gambar tersemat sebagai Base64) sebagai stream, sama seperti hasil konversi lainnya.

Format target

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

Tidak setiap sumber dapat dikonversi ke setiap target — plugin memetakan setiap keluarga format sumber (Word, Excel, PowerPoint, PDF, CAD, Image, Email, Diagram, Project/Task, PSD, dokumen web) ke set target yang diizinkan secara tetap. Jangan menghardcode enum ini sebagai daftar target UI Anda: ?convert=open mengembalikan allowedTargets yang sebenarnya untuk file yang baru diunggah, dan itulah yang harus menjadi dasar pemilih.

Widget siap pakai

Endpoint ?convert=open|run|download pada widget bersifat opsional dan dinonaktifkan secara default — aman secara default. Aktifkan mereka di sisi server, bersamaan dengan pendaftaran 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>

Tanpa AddConverterWidget(), tiga endpoint ?convert= menjawab 404 — tetapi file JS tetap disajikan (itu adalah sumber daya statis yang disematkan; hanya endpoint yang diakses yang dibatasi). AddConverterWidget() tetap memerlukan plugin Converter terdaftar dan lisensi yang memberikan Converter — ia tidak memberikan hak konversi secara mandiri.

Sesuaikan widget

Opsi inisialisasi yang diteruskan ke Doconut.convert(selector, options):

OpsiTipeBawaanCatatan
basePathstring/doconutPath dasar untuk endpoint ?convert=; harus cocok dengan cabang ASP.NET tempat UseDoconut() dipasang (biasanya dikoordinasikan melalui MiddlewarePath)
resPathstring/doconut-resDiterima untuk konsistensi konfigurasi dengan widget Doconut lainnya; widget konverter saat ini tidak membangun URL apa pun darinya
maxUploadMbnumber25Hanya pemeriksaan pra-sisi klien — menolak file yang terlalu besar sebelum diunggah. Server menegakkan batasnya sendiri secara independen dan menjawab 413 jika terlampaui
licenseUrlstring | nullnullJika diatur, mengubah pemberitahuan watermark pada layar hasil menjadi tautan ke URL ini
labelsobject{}Menimpa sebagian atau seluruh string default bahasa Inggris widget (teks drop, tombol, pengumuman aria‑live, pesan error)

Panggilan balik:

PanggilanBalikTerjadi ketikaData
onReady()Widget telah merender layar idle/drop
onSourceLoaded({ token, pages, sourceExt, allowedTargets })?convert=open berhasiltoken sesi sumber, jumlah halaman, ekstensi sumber (tanpa titik di depan), daftar target yang diizinkan
onConverted({ downloadToken, resultToken, resultPages, downloadName, watermarked, target })?convert=run berhasilfield yang sama seperti respons run, plus target yang diminta
onDownload({ downloadName, downloadToken })Pengguna mengklik tautan Unduhdipicu bersamaan dengan unduhan native browser — tidak menyela atau menggantinya
onError({ phase, message })Permintaan open atau run gagalphase adalah 'open' atau 'run'; message adalah error server yang disanitasi (atau pesan sisi klien untuk pemeriksaan pra-ukuran unggahan)

Doconut.convert() mengembalikan instance widget itu sendiri — simpan untuk mengendalikan widget secara programatik:

javascript
const conv = Doconut.convert('#doconut-convert', { basePath: '/doconut' });
conv.reset();         // kembali ke layar idle/drop; tidak memicu onReady lagi
conv.loadFile(file);  // memulai alur dengan objek File; tidak melakukan apa‑apa kecuali sedang idle
conv.destroy();       // menghapus listener, mengosongkan mount; instance tidak dapat dipakai lagi setelah ini

Bangun frontend Anda sendiri

Widget hanyalah klien untuk kontrak HTTP ini — bangun frontend Anda sendiri langsung terhadapnya untuk UX yang berbeda. Ketiga rute berada di bawah cabang ASP.NET tempat UseDoconut() dipasang (biasanya /doconut):

RuteTujuanRespons sukses
POST ?convert=open (multipart, field file)Unggah dan buka dokumen sumber untuk pratinjau200{ token, pages, sourceExt, allowedTargets }
POST ?token=<token>&convert=run&target=<ext>Konversi sumber yang disimpan ke target200{ downloadToken, resultToken, resultPages, downloadName, watermarked }
GET ?convert=download&token=<downloadToken>Alirkan file yang telah dikonversi200 — file bytes, Content-Disposition: attachment, Cache-Control: no-store

Byte sumber yang diunggah disimpan di sisi server dengan TTL 30 menit; setelah jendela itu berakhir, run menjawab 404 dan file harus dibuka kembali. Hasil konversi berada di stash yang sama — downloadToken mendapatkan jendela 30 menit baru saat konversi selesai — sementara resultToken adalah token sesi penampil biasa yang masa berlakunya mengikuti cache sesi penampil, terlepas dari stash.

sourceExt dalam respons open tidak memiliki titik di depan (mis. "docx") — konvensi yang berlawanan dengan parameter sourceExtension pada DocumentConverter.ConvertAsync, yang memerlukannya.

Mode kegagalan, dikelompokkan per rute:

RuteStatusKapanBody
any404Widget tidak diaktifkan (AddConverterWidget() tidak pernah dipanggil) — diperiksa sebelum salah satu dari tiga rute diproseshanya status
any405Verba HTTP salah (open/run memerlukan POST; download memerlukan GET)hanya status
open413File yang diunggah melebihi MaxUploadMb{ "error": "File terlalu besar." }
open400Tidak ada body multipart, tidak ada file, atau ekstensi sumber yang tidak dapat dikonversi{ "error": "..." }
run400Token tidak valid (bukan GUID), atau target yang tidak dapat diparse menjadi ConversionTarget{ "error": "Token tidak valid." } / { "error": "Format target tidak dikenal." }
run400target tidak ada dalam allowedTargets sumber{ "error": "Format target tersebut tidak tersedia untuk file ini." }
run404Unggahan kedaluwarsa — silakan buka kembali file{ "error": "Unggahan kedaluwarsa — silakan buka kembali file." }
open, run500Pemrosesan gagal secara internal{ "error": "<sanitized message>" } — disanitasi dengan cara yang sama seperti setiap jalur error Doconut lainnya; tidak pernah mengungkap nama mesin internal
download400Token tidak valid (bukan GUID)hanya status
download404Token unduhan tidak dikenal atau kedaluwarsahanya status

Kepemilikan sumber daya

Konverter mengembalikan MemoryStream yang dapat dicari dengan posisi nol. Pemanggil memiliki stream tersebut dan harus membuangnya setelah menyalin atau mengembalikan isinya. Layanan DocumentConverter sendiri bersifat stateless dan diperoleh dari dependency injection; jangan membuat atau membuang layanan secara manual.

Untuk widget web, stash unggahan dan unduhan memiliki TTL 30 menit yang independen. resultToken penampil mengikuti masa hidup sesi penampil. Menutup hasil penampil tidak menghapus stash unduhan yang masih valid, dan mereset widget browser tidak memperpanjang TTL keduanya.

Pemecahan Masalah

GejalaPeriksa
Resolving DocumentConverter failsPendaftaran ConverterPlugin terjadi di dalam AddDoconut()
Application fails during startupLisensi yang dimuat memberikan Converter
Stream conversion says the format is unsupportedsourceExtension menyertakan titik di depan
Widget JavaScript loads but requests return 404AddConverterWidget() tidak dipanggil
Widget requests use the wrong URLbasePath cocok dengan cabang tempat UseDoconut() dipetakan
Target is missingGunakan allowedTargets yang dikembalikan oleh convert=open; tidak setiap sumber mendukung setiap target enum
Download expiredUlangi convert=open/convert=run; token stash memang bersifat sementara

Penandaan Watermark

Dengan ConverterPlugin terdaftar, lisensi host berada dalam salah satu dari tiga keadaan:

Status lisensiGerbang startupOutput konversi
Lisensi penampil berbayar yang memberikan Converter, dalam periode berlakuLulusBersih — watermarked: false
Lisensi evaluasi aktif (demo/NFR)LulusBerhasil mengonversi, dengan watermark evaluasi — watermarked: true
Tidak berlisensi, file TRIAL lama, atau lisensi non-temporer yang tidak memberikan ConverterAplikasi tidak pernah mulai — gerbang startup di atas melempar
Lisensi Sementara/Demo yang kedaluwarsaPendaftaran tetap setelah kedaluwarsaMengonversi dengan watermark evaluasi — watermarked: true

Kedua jalur panggilan menghitung flag dari aturan yang sama: fasad C# DocumentConverter menurunkannya secara internal dari status lisensi IsViewerLicensed dan IsTemporary, dan handler widget ?convert=run melakukan pemeriksaan setara (IsViewerLicensed && !IsTrial && !IsTemporary) untuk mengisi field watermarked yang dikembalikannya. Integrasi dapat dibangun dan diuji end‑to‑end dengan lisensi evaluasi sebelum pembelian — hanya byte output yang berubah.

Apakah halaman ini membantu?