Plugin Konverter
Ubah dokumen menjadi 24 format target
Plugin Konverter mengubah Doconut menjadi layanan konversi dokumen. Ia menyumbangkan 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 tulis sendiri.
Instal paket
Instal plugin Konverter stabil terbaru:
dotnet add package Doconut.NET6.ConverterUntuk mengunci plugin ke rilis 26.7.0 saat ini, berikan versi secara terpisah:
dotnet add package Doconut.NET6.Converter --version 26.7.0Pertahankan paket Konverter pada versi yang sama dengan Doconut.NET6. ID paketnya adalah
Doconut.NET6.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 Konverter, didaftarkan dengan cara yang sama: panggil AddPlugin<TPlugin>() di dalam AddDoconut(). ConverterPlugin dikirim dalam paket NuGet-nya sendiri, Doconut.NET6.Converter, yang dipasang bersamaan dengan paket penampil dasar.
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 kemampuanConverter— sebuahInvalidOperationExceptionyang diangkat dari dalamAddDoconut(), sebelum aplikasi melayani permintaan. Registrasi Demo/NFR sementara diterima; setelah kedaluwarsa kalendernya, konversi tetap tersedia dengan output berwatermark. Tidak ada tingkatan gratis yang diam-diam. Lihat Pengaturan Lisensi untuk cara memuat lisensi.
Konversi dari C#
Setiap konversi mengembalikan MemoryStream yang dapat dicari dan diposisikan pada 0, siap dibaca atau disalin segera. Dapatkan DocumentConverter dari DI di mana pun Anda membutuhkannya — ia bersifat tanpa status secara desain, sehingga satu instance aman untuk digunakan kembali di seluruh permintaan.
// Suntikkan DocumentConverter; konstruktornya bersifat internal, jadi jangan pernah `new` itu.
Stream pdf = await converter.ConvertAsync("contract.docx", ConversionTarget.Pdf, ct: ct);// sourceExtension mencakup titik di depannya. password bernilai null kecuali dokumen dilindungi.
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);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
Pdf, Docx, Doc, Html, Xlsx, Pptx, Png, Jpeg, Csv, Tiff, Bmp, Gif, Svg, Xml,
Txt, Xls, Jp2, Rtf, Odt, Ods, Odp, Epub, Xps, WebpTidak 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 diunggah, dan itulah yang seharusnya menggerakkan pemilih.
Widget yang dapat disisipkan
Endpoint ?convert=open|run|download widget bersifat opt-in dan dinonaktifkan secara default — aman secara bawaan. Aktifkan mereka di sisi server, bersama dengan pendaftaran 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>Tanpa AddConverterWidget(), tiga endpoint ?convert= menjawab 404 — tetapi file JS itu tetap disajikan terlepas dari itu (itu adalah sumber daya statis tertanam biasa; hanya endpoint yang diakses yang dibatasi). AddConverterWidget() masih memerlukan plugin Converter untuk didaftarkan dan lisensi yang memberikan Converter — lisensi tersebut tidak memberikan hak konversi secara mandiri.
Sesuaikan widget
Opsi inisialisasi yang diteruskan ke Doconut.convert(selector, options):
| Opsi | Tipe | Default | Catatan |
|---|---|---|---|
basePath | string | /doconut | Jalur dasar untuk endpoint ?convert=; harus cocok dengan cabang ASP.NET tempat UseDoconut() sebenarnya dipasang (biasanya dikoordinasikan melalui MiddlewarePath) |
resPath | string | /doconut-res | Diterima untuk konsistensi konfigurasi dengan widget Doconut lainnya; widget konverter saat ini tidak membangun URL apa pun darinya |
maxUploadMb | number | 25 | Hanya pemeriksaan pra‑unggah di sisi klien — menolak file yang terlalu besar sebelum diunggah. Server menegakkan batasnya sendiri secara independen dan menjawab 413 jika terlampaui |
licenseUrl | string | null | null | Jika diatur, mengubah pemberitahuan watermark pada layar hasil menjadi tautan ke URL ini |
labels | object | {} | Menimpa sebagian atau semua string default bahasa Inggris widget (teks drop, tombol, pengumuman aria‑live, pesan error) |
Callback:
| Callback | Terjadi ketika | Muatan |
|---|---|---|
onReady() | Widget telah merender layar idle/drop | — |
onSourceLoaded({ token, pages, sourceExt, allowedTargets }) | ?convert=open succeeds | token sesi sumber, jumlah halaman, ekstensi sumber (tanpa titik di depan), daftar target yang diizinkan |
onConverted({ downloadToken, resultToken, resultPages, downloadName, watermarked, target }) | ?convert=run succeeds | bidang yang sama seperti respons run, plus target yang diminta |
onDownload({ downloadName, downloadToken }) | Pengguna mengklik tautan Unduh | dipicu bersamaan dengan unduhan bawaan browser — tidak menyela atau menggantinya |
onError({ phase, message }) | Permintaan open atau run gagal | phase 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 — simpanlah untuk mengendalikan widget secara programatik:
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 saat ini idle
conv.destroy(); // menghapus listeners, mengosongkan mount; instance tidak dapat digunakan setelah iniBangun frontend Anda sendiri
Widget hanyalah klien untuk kontrak HTTP ini — bangun frontend Anda sendiri langsung di atasnya untuk UX yang berbeda. Semua tiga rute berada di bawah cabang ASP.NET tempat UseDoconut() dipasang (biasanya /doconut):
| Rute | Tujuan | Respons sukses |
|---|---|---|
POST ?convert=open (multipart, field file) | Unggah dan buka dokumen sumber untuk pratinjau | 200 — { token, pages, sourceExt, allowedTargets } |
POST ?token=<token>&convert=run&target=<ext> | Konversi sumber yang disimpan ke target | 200 — { downloadToken, resultToken, resultPages, downloadName, watermarked } |
GET ?convert=download&token=<downloadToken> | Streaming file yang telah dikonversi | 200 — byte file, 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 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 (mis. "docx") — konvensi yang berlawanan dengan parameter sourceExtension pada DocumentConverter.ConvertAsync, yang memerlukannya.
Mode kegagalan, dikelompokkan per rute:
| Rute | Status | Kapan | Badan |
|---|---|---|---|
| apa saja | 404 | Widget tidak diaktifkan (AddConverterWidget() tidak pernah dipanggil) — diperiksa sebelum salah satu dari tiga rute diproses | hanya status |
| apa saja | 405 | Verb HTTP salah (open/run memerlukan POST; download memerlukan GET) | hanya status |
open | 413 | File yang diunggah melebihi MaxUploadMb | { "error": "File is too large." } |
open | 400 | Tidak ada body multipart, tidak ada file, atau ekstensi sumber yang tidak dapat dikonversi | { "error": "..." } |
run | 400 | Token tidak terbentuk (bukan GUID), atau target yang tidak dapat diurai menjadi ConversionTarget | { "error": "Invalid token." } / { "error": "Unknown target format." } |
run | 400 | target tidak ada dalam allowedTargets sumber | { "error": "That target format is not available for this file." } |
run | 404 | Unggahan yang disimpan telah kedaluwarsa (TTL 30 menit) atau token tidak pernah dibuka | { "error": "Upload expired — please re-open the file." } |
open, run | 500 | Pemrosesan gagal secara internal | { "error": "<sanitized message>" } — disanitasi dengan cara yang sama seperti setiap jalur error Doconut lainnya; tidak pernah mengungkap nama mesin internal |
download | 400 | Token tidak terbentuk (bukan GUID) | hanya status |
download | 404 | Token unduhan tidak dikenal atau kedaluwarsa | hanya 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 sendiri bersifat stateless dan diambil melalui dependency injection; jangan membuat atau membuang layanan secara manual.
Untuk widget web, penyimpanan unggah dan unduh memiliki TTL masing-masing selama 30 menit. Sebuah resultToken viewer mengikuti masa hidup sesi viewer sebagai gantinya. Menutup hasil viewer tidak menghapus penyimpanan unduhan yang masih berlaku, dan mereset widget peramban tidak memperpanjang TTL keduanya.
Pemecahan Masalah
| Gejala | Pemeriksaan |
|---|---|
Menyelesaikan DocumentConverter gagal | Pendaftaran ConverterPlugin terjadi di dalam AddDoconut() |
| Aplikasi gagal saat memulai | Lisensi yang dimuat memberikan Converter |
| Konversi aliran mengatakan format tidak didukung | sourceExtension menyertakan titik di depan |
| JavaScript widget dimuat tetapi permintaan mengembalikan 404 | AddConverterWidget() tidak dipanggil |
| Permintaan widget menggunakan URL yang salah | basePath cocok dengan cabang tempat UseDoconut() dipetakan |
| Target tidak ada | Gunakan allowedTargets yang dikembalikan oleh convert=open; tidak setiap sumber mendukung setiap target enum |
| Unduhan kedaluwarsa | Ulangi convert=open/convert=run; token penyimpanan memang bersifat sementara |
Penandaan Air
Dengan ConverterPlugin terdaftar, lisensi host berada dalam salah satu dari tiga keadaan:
| Keadaan Lisensi | Gerbang Mulai | Output Konversi |
|---|---|---|
Lisensi viewer berbayar yang memberikan Converter, dalam periode berlaku | Lulus | Bersih — watermarked: false |
| Lisensi evaluasi aktif (demo/NFR) | Lulus | Berhasil mengonversi, dengan cap air evaluasi — watermarked: true |
Tanpa lisensi, file legacy TRIAL, atau lisensi non-temporer yang tidak memberikan Converter | Aplikasi tidak pernah mulai — gerbang mulai yang dijelaskan di atas melempar | — |
| Lisensi Sementara/Demo yang Kedaluwarsa | Pendaftaran tetap setelah kedaluwarsa | Mengonversi dengan cap air evaluasi — watermarked: true |
Kedua jalur pemanggilan menghitung flag berdasarkan aturan yang sama: facade C# DocumentConverter menurunkannya secara internal dari keadaan IsViewerLicensed dan IsTemporary pada lisensi, dan handler ?convert=run pada widget melakukan pemeriksaan setara (IsViewerLicensed && !IsTrial && !IsTemporary) untuk mengisi bidang watermarked yang dikembalikannya. Integrasi dapat dibangun dan diuji end-to-end pada lisensi evaluasi sebelum pembelian — hanya byte output yang berubah.
Apakah halaman ini membantu?