Plugin Konverter

Ubah dokumen menjadi 45 format target

Plugin Konverter mengubah Doconut menjadi layanan konversi dokumen. Ia menyediakan mesin di balik antarmuka publik DocumentConverter, dan — opsional — widget yang dapat langsung dipasang 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 Konverter stabil terbaru:

bash
dotnet add package Doconut.NETStandard.Converter

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

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

Pertahankan paket Konverter pada versi yang sama dengan Doconut.NETStandard. ID paketnya adalah Doconut.NETStandard.Converter; .26.8.0 hanya muncul dalam nama file .nupkg yang diunduh.

Daftarkan plugin

Tidak ada metode AddConverter() — model plugin Doconut seragam. Setiap plugin, termasuk Konverter, didaftarkan dengan cara yang sama: panggil AddPlugin<TPlugin>() di dalam AddDoconut(). ConverterPlugin dikirim dalam paket NuGet-nya sendiri, Doconut.NETStandard.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 kesalahan saat startup karena lisensi yang hilang, file legacy TRIAL, atau lisensi non‑temporer yang tidak memberikan kemampuan Converter — sebuah InvalidOperationException yang diangkat dari dalam AddDoconut(), sebelum aplikasi melayani permintaan. Registrasi Demo/NFR sementara diterima; setelah masa berlakunya berakhir, konversi tetap tersedia dengan output berwatermark. Tidak ada tingkat 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 tidak memiliki status secara desain, sehingga satu instance aman untuk digunakan kembali di seluruh permintaan.

viewer.Converter.GetConverter() tidak ada di sini. Konversi tidak lagi diakses melalui instance penampil: injeksikan Doconut.DocumentConverter sebagai gantinya.

csharp
// Suntik DocumentConverter; konstruktornya internal, jadi jangan pernah `new` itu.
Stream pdf = await converter.ConvertAsync("contract.docx", ConversionTarget.Pdf, ct: ct);
csharp
// sourceExtension mencakup titik di depannya. password bernilai null kecuali dokumen dilindungi.
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 depan (".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 setiap hasil konversi lainnya.

Format target

ConversionTarget (namespace Doconut.Configs.Conversion) memiliki 45 anggota:

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

Enum ini mencakup setiap keluarga sumber. Perpustakaan sebelumnya memiliki tipe *ConfigConverter per keluarga — WordConfigConverter, ExcelConfigConverter, dan seterusnya — masing‑masing dengan enum EnTargetFormat bersarang, plus enum SourceFormatConverter untuk input. Semua itu sudah tidak ada; lihat panduan migrasi.

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 apa pun yang baru saja diunggah, dan itulah yang harus menjadi dasar pemilih.

Widget Sisip

Titik akhir ?convert=open|run|download widget bersifat opt‑in dan dinonaktifkan secara bawaan — 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 titik akhir ?convert= menjawab 404 — tetapi berkas JS itu tetap disajikan (ini adalah sumber daya statis tertanam biasa; hanya titik akhir yang diakses yang dibatasi). AddConverterWidget() masih memerlukan plugin Converter terdaftar dan lisensi yang memberikan Converter — lisensi tersebut tidak memberikan hak konversi secara mandiri.

Sesuaikan widget

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

OpsiTipeBawaanCatatan
basePathstring/doconutJalur dasar untuk titik akhir ?convert=; harus cocok dengan cabang ASP.NET tempat UseDoconut() sebenarnya 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 berkas yang terlalu besar sebelum diunggah. Server menegakkan batasnya 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:

Panggilan balikTerjadi ketikaMuatan
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 berhasilbidang 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 ulang onReady
conv.loadFile(file);  // memulai alur dengan objek File; no-op kecuali sedang idle
conv.destroy();       // menghapus listener, mengosongkan mount; instance tidak dapat digunakan setelah ini

Bangun antarmuka depan Anda sendiri

Widget hanyalah klien untuk kontrak HTTP ini — bangun antarmuka depan Anda sendiri langsung di atasnya untuk pengalaman pengguna 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>Mengonversi sumber yang disimpan ke target200 — { downloadToken, resultToken, resultPages, downloadName, watermarked }
GET ?convert=download&token=<downloadToken>Streaming berkas yang dikonversi200 — byte berkas, 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 berkas harus dibuka kembali. Hasil konversi berada di stash yang sama — downloadToken mendapatkan jendela 30 menit baru ketika konversi selesai — sementara resultToken adalah token sesi viewer biasa yang masa berlakunya mengikuti cache sesi viewer, terlepas dari stash.

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

Mode kegagalan, dikelompokkan per rute:

RuteStatusKapanIsi
apa saja404Widget tidak diaktifkan (AddConverterWidget() tidak pernah dipanggil) — diperiksa sebelum salah satu dari tiga rute diproseshanya status
apa saja405Verb HTTP salah (open/run memerlukan POST; download memerlukan GET)hanya status
open413Berkas yang diunggah melebihi MaxUploadMb{ "error": "File is too large." }
open400Tidak ada body multipart, tidak ada berkas, atau ekstensi sumber yang tidak dapat dikonversi{ "error": "..." }
run400Token tidak terbentuk (bukan GUID), atau target yang tidak dapat diurai menjadi ConversionTarget{ "error": "Invalid token." } / { "error": "Unknown target format." }
run400target tidak ada dalam allowedTargets sumber{ "error": "That target format is not available for this file." }
run404Unggahan yang disimpan telah kedaluwarsa (TTL 30 menit) atau token tidak pernah dibuka{ "error": "Upload expired — please re-open the 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 terbentuk (bukan GUID)hanya status
download404Token unduhan tidak dikenal atau kedaluwarsahanya status

Kepemilikan Sumber Daya

Konverter mengembalikan sebuah MemoryStream yang dapat dicari yang diposisikan pada nol. Pemanggil memiliki aliran tersebut dan harus membuangnya setelah menyalin atau mengembalikan isinya. Layanan DocumentConverter itu sendiri tidak memiliki status dan diambil dari dependency injection; jangan membuat atau membuang layanan secara manual.

Untuk widget web, penyimpanan unggah dan unduh memiliki TTL terpisah masing-masing 30 menit. Sebuah resultToken penampil mengikuti masa hidup sesi penampil sebagai gantinya. Menutup hasil penampil tidak menghapus penyimpanan unduhan yang masih berlaku, dan mereset widget peramban tidak memperpanjang TTL keduanya.

Pemecahan Masalah

GejalaPemeriksaan
Gagal menyelesaikan DocumentConverterRegistrasi ConverterPlugin terjadi di dalam AddDoconut()
Aplikasi gagal saat memulaiLisensi yang dimuat memberikan Converter
Konversi aliran menyatakan format tidak didukungsourceExtension menyertakan titik di depan
JavaScript widget dimuat tetapi permintaan mengembalikan 404AddConverterWidget() tidak dipanggil
Permintaan widget menggunakan URL yang salahbasePath cocok dengan cabang tempat UseDoconut() dipetakan
Target tidak adaGunakan allowedTargets yang dikembalikan oleh convert=open; tidak setiap sumber mendukung setiap target enum
Unduhan kedaluwarsaUlangi convert=open/convert=run; token penyimpanan memang bersifat sementara

Penandaan Air

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

Keadaan LisensiGerbang StartupOutput Konversi
Lisensi penampil berbayar yang memberikan Converter, dalam periode berlakuLulusBersih — watermarked: false
Lisensi evaluasi aktif (demo/NFR)LulusBerhasil mengonversi, dengan cap air evaluasi — watermarked: true
Tanpa lisensi, file legacy TRIAL, atau lisensi non-temporer yang tidak memberikan ConverterAplikasi tidak pernah mulai — gerbang startup yang dijelaskan di atas melempar—
Lisensi Sementara/Demo yang kedaluwarsaRegistrasi bertahan setelah kedaluwarsaMengonversi dengan cap air evaluasi — watermarked: true

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

Apakah halaman ini membantu?