Dönüştürücü Eklentisi
Belgeleri 24 hedef formata dönüştürün
Converter eklentisi Doconut'u bir belge-dönüştürme hizmetine dönüştürür. DocumentConverter genel arayüzünün arkasındaki motoru ve — isteğe bağlı — DocImage.axd tarafından sunulan bir drop-in widget'ı sağlar, böylece belgeleri C#'tan, widget'tan veya kendinizin yazdığı bir ön uçtan dönüştürebilirsiniz.
Paketi Yükleyin
Install-Package Doconut.NETFramework.ConverterDoconut.NETFramework ile aynı sürümde Converter paketini tutun.
Eklentiyi Kaydedin
Her eklenti aynı şekilde kaydedilir: AddPlugin<TPlugin>() içinde DoconutHost.Initialize.
Doconut.DoconutHost.Initialize(options =>
{
options.LicensePath = HostingEnvironment.MapPath("~/wwwroot/Doconut.Viewer.lic");
options.AddPlugin<Doconut.Plugins.Converter.ConverterPlugin>();
});Eğer aktif bir lisans
Converteryeteneğini vermiyorsa — lisans yok, eski birTRIALdosyası, ya da bu yeteneği içermeyen bir lisans —DoconutHost.Initialize,Application_Startüzerinden fırlatır. System.Web içinde bu, her isteğin boş bir500döndürdüğü anlamına gelir ve neden yalnızca Windows olay günlüğünde (kaynak ASP.NET) bulunur. Geçici Demo/NFR lisansları kabul edilir. Bakınız Lisans Kurulumu.
C#'tan Dönüştürme
Her dönüşüm, 0 konumunda konumlandırılmış bir seekable MemoryStream döndürür. DocumentConverter durum bilgisizdir: ihtiyacınız olan yerde DoconutHost.Services üzerinden çözün ve serbestçe yeniden kullanın.
// DocumentConverter'ı DoconutHost.Services'tan çözün; yapıcı içsel olduğu için, asla `new` etmeyin.
Stream pdf = await converter.ConvertAsync("contract.docx", ConversionTarget.Pdf, ct: ct);// sourceExtension baştaki noktayı içerir. password, belge korunmuyorsa null olur.
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);Yanlış yapılması kolay iki detay: stream overload'unda sourceExtension, baştaki noktayı (".xlsx", "xlsx" değil) içermelidir, aksi takdirde çözülmez. Ve adının aksine, WordToHtmlAsync Task<Stream> döndürür, Task<string> değil — HTML belge (Base64 olarak gömülü görüntüler) bir stream olarak gelir, diğer tüm sonuçlar gibi.
MVC 5 denetleyicisinde
Eylemi asenkron yapın ve dönüşümü await.
[HttpPost]
public async Task<ActionResult> ToPdf(HttpPostedFileBase file)
{
var converter = Doconut.DoconutHost.Services.GetRequiredService<DocumentConverter>();
Stream pdf = await converter.ConvertAsync(
file.InputStream, Path.GetExtension(file.FileName), ConversionTarget.Pdf,
password: null, ct: Response.ClientDisconnectedToken);
return File(pdf, "application/pdf", Path.GetFileNameWithoutExtension(file.FileName) + ".pdf");
}Web Forms'ta: dönüşümde asla bloklamayın
Bir Web Forms sayfası tek iş parçacıklı bir istek bağlamında çalışır. ConvertAsync, tamamlandığında o bağlamda devam eder, bu yüzden senkron olarak bekleyen bir sayfa — .Result, .Wait(), .GetAwaiter().GetResult() — dönüşümün bitmesi için gereken iş parçacığını tutar. İstek asla geri dönmez. Tarayıcı dönmeye devam eder, IIS hiçbir şey kaydetmez ve sitenin geri kalanı çalışmaya devam eder, bu da bir deadlock yerine yavaş bir dönüşüm gibi görünür.
Sayfayı Async="true" işaretleyin ve dönüşümü bir sayfa async görevi olarak çalıştırın:
<%@ Page Language="C#" Async="true" CodeBehind="Convert.aspx.cs" Inherits="MyApp.Convert" %>// Web Forms: @Page yönergesi Async="true" gerektirir ve dönüşüm bir sayfa async görevi olarak çalışır.
// Bunun üzerine bloklama yapmak (.Result, .Wait(), .GetAwaiter().GetResult()) isteği kilitler:
// asla geri dönmez ve hiçbir şey kaydedilmez.
protected void Page_Load(object sender, EventArgs e)
{
if (!IsPostBack) return;
RegisterAsyncTask(new PageAsyncTask(async ct =>
{
var converter = Doconut.DoconutHost.Services.GetRequiredService<DocumentConverter>();
using (var pdf = await converter.ConvertAsync(
Server.MapPath("~/App_Data/contract.docx"), ConversionTarget.Pdf, ct: ct))
using (var ms = new MemoryStream())
{
if (pdf.CanSeek) pdf.Position = 0;
await pdf.CopyToAsync(ms);
Response.ContentType = "application/pdf";
Response.AddHeader("Content-Disposition", "attachment; filename=contract.pdf");
Response.BinaryWrite(ms.ToArray());
// Context, HttpContext.Current değil: bir await'tan sonra ikincisi null olabilir.
Context.ApplicationInstance.CompleteRequest();
}
}));
}@Page yönergesinde Async="true" olmadan, RegisterAsyncTask sessizce yok sayılır. Bir await sonrası, sayfanın Context kullanın; HttpContext.Current orada null olabilir.
Hedef formatlar
Pdf, Docx, Doc, Html, Xlsx, Pptx, Png, Jpeg, Csv, Tiff, Bmp, Gif, Svg, Xml,
Txt, Xls, Jp2, Rtf, Odt, Ods, Odp, Epub, Xps, WebpHer kaynak her hedefe dönüştürülemez: her kaynağın format ailesi (Word, Excel, PowerPoint, PDF, CAD, Image, Email, Diagram, Project, PSD, web document) kendi izin verilen hedef setine sahiptir. Bu enum'ı UI'nizin hedef listesi olarak sabitlemeyin: ?convert=open, yüklenen dosya için allowedTargets döndürür ve bu, bir seçim kutusunu yönlendirmelidir.
Drop-in widget
Widget'ın ?convert=open|run|download uç noktaları DocImage.axd tarafından sunulur ve varsayılan olarak kapalıdır. Eklenti kaydı yanında bunları etkinleştirin:
Doconut.DoconutHost.Initialize(options =>
{
options.LicensePath = HostingEnvironment.MapPath("~/wwwroot/Doconut.Viewer.lic");
options.AddPlugin<Doconut.Plugins.Converter.ConverterPlugin>();
options.AddConverterWidget(widget =>
{
widget.MaxUploadMb = 25;
});
});
// System.Web, Doconut görmeden önce tüm yüklemeyi okur: maxRequestLength (KB) ve
// maxAllowedContentLength (bytes) Web.config içinde widget'in MaxUploadMb'sinin üzerinde.<div id="doconut-convert"></div>
<script src="/doconut-res/js/doconutConverter.js"></script>
<script>
Doconut.convert('#doconut-convert', { basePath: '/DocImage.axd', maxUploadMb: 25 });
</script>Widget yanlış davrandığında kontrol edilmesi gereken iki şey:
basePath: '/DocImage.axd'. Widget'ın varsayılanı,/doconut, ASP.NET Core uç noktasındır. Bu pakette, uç noktalarDocImage.axdişleyicisidirWeb.config'dan.- Betik ve uç noktalar bağımsızdır. Kaynak modülü, widget etkin olsun ya da olmasın
doconutConverter.jssunar.AddConverterWidget()olmadan, widget yüklenir, bırakma bölgesini çizer ve tamamen doğru görünür — ve ilk eylemi404yanıtını verir.
Yükleme sınırlamaları
ASP.NET, DocImage.axd çalışmadan önce tüm istek gövdesini okur. MaxUploadMb üzerindeki ancak sunucu limitlerinin altında bir yükleme, widget'ın kendi JSON 413 ("File is too large.") alır. Sunucu limitlerinin üzerindeki bir yükleme önce IIS tarafından reddedilir ve widget'ın okuyamadığı bir hata sayfası gösterilir. Hem sunucu limitlerini hem de widget'ın üst sınırını Web.config içinde tutun:
<system.web>
<httpRuntime maxRequestLength="30720" /> <!-- KILOBAYT: 30 MB -->
</system.web>
<system.webServer>
<security>
<requestFiltering>
<requestLimits maxAllowedContentLength="31457280" /> <!-- BAYT: 30 MB -->
</requestFiltering>
</security>
</system.webServer>Widget'ı özelleştir
Doconut.convert(selector, options)'a geçirilen seçenekler:
| Option | Type | Default | Notes |
|---|---|---|---|
basePath | string | /doconut | Uç nokta URL'si. Bu pakette '/DocImage.axd' ayarlayın |
resPath | string | /doconut-res | Diğer Doconut widget'larıyla tutarlılık için kabul edilir; dönüştürücü widget bu değerden herhangi bir URL oluşturmaz |
maxUploadMb | number | 25 | Yalnızca istemci tarafı ön kontrol; sunucu kendi üst sınırını uygular |
licenseUrl | string | null | null | Sonuç ekranındaki filigran uyarısını bir bağlantıya dönüştürür |
labels | object | {} | Widget'ın İngilizce metinlerinin herhangi bir alt kümesini geçersiz kılar |
Geri çağrılar:
| Callback | Fires when | Payload |
|---|---|---|
onReady() | Widget bırakma ekranını render ettiğinde | — |
onSourceLoaded({ token, pages, sourceExt, allowedTargets }) | ?convert=open başarılı olduğunda | Kaynak tokenı, sayfa sayısı, kaynak uzantısı (başında nokta olmadan), izin verilen hedefler |
onConverted({ downloadToken, resultToken, resultPages, downloadName, watermarked, target }) | ?convert=run başarılı olduğunda | Çalıştırma yanıtı ve istenen target |
onDownload({ downloadName, downloadToken }) | Kullanıcı İndir'e tıkladığında | Tarayıcının kendi indirmesiyle birlikte tetiklenir |
onError({ phase, message }) | Açma veya çalıştırma isteği başarısız olduğunda | phase, 'open' veya 'run' durumundadır; message, temizlenmiş sunucu hatasıdır |
Doconut.convert() widget örneğini döndürür: reset() bırakma ekranına döner, loadFile(file) bir File ile akışı başlatır ve destroy() onu kaldırır.
Kendi ön ucunuzu oluşturun
Widget, DocImage.axd üzerindeki bu HTTP sözleşmesi için bir istemcidir:
| Yol | Amaç | Başarılı yanıt |
|---|---|---|
POST /DocImage.axd?convert=open (multipart, field file) | Bir kaynak belgeyi yükleyin ve açın | 200 — { token, pages, sourceExt, allowedTargets } |
POST /DocImage.axd?token=<token>&convert=run&target=<ext> | Yüklenen kaynağı target'a dönüştür | 200 — { downloadToken, resultToken, resultPages, downloadName, watermarked } |
GET /DocImage.axd?convert=download&token=<downloadToken> | Dönüştürülen dosyayı akış olarak gönder | 200 — dosya, Content-Disposition: attachment |
Yüklenen kaynaklar 30 dakika saklanır; bu sürenin ardından run, 404 yanıtını verir ve dosya yeniden açılmalıdır. Dönüşüm tamamlandığında downloadToken kendi 30 dakikalık penceresini alır. resultToken, görüntüleyici oturumunun ömrünü izleyen sıradan bir görüntüleyici belirtecidir.
sourceExt, open yanıtında başında nokta ("docx") bulunmaz — bu, ConvertAsync'in sourceExtension parametresinin tersidir.
| Yol | Durum | Ne zaman | Gövde |
|---|---|---|---|
| herhangi | 404 | Widget etkinleştirilmemiş (AddConverterWidget() hiç çağrılmadı) | yalnızca durum |
| herhangi | 405 | Yanlış fiil (open/run POST gerektirir, download GET gerektirir) | yalnızca durum |
open | 413 | Yükleme, MaxUploadMb değerini aşıyor (ancak IIS sınırlarını aşmıyor) | { "error": "File is too large." } |
open | 400 | Multipart gövde yok, dosya yok veya dönüştürülemeyen bir tür | { "error": "..." } |
open | 403 | Dosya türü, lisansın vermediği bir yeteneğe ihtiyaç duyuyor | { "error": "..." } |
run | 400 | Bozuk bir belirteç, bilinmeyen target veya allowedTargets içinde olmayan bir hedef | { "error": "..." } |
run | 404 | Yükleme süresi doldu veya hiç açılmadı | { "error": "Upload expired — please re-open the file." } |
open, run | 500 | İşleme başarısız oldu | { "error": "<sanitized message>" } |
download | 400 / 404 | Bozuk, bilinmeyen veya süresi dolmuş bir indirme belirteci | yalnızca durum |
Kaynak sahipliği
Çağıran, dönüşümün döndürdüğü MemoryStream'i sahiplenir ve kopyaladıktan veya döndürdükten sonra serbest bırakmalıdır (MVC'nin File(stream, …) sizin için serbest bırakır). DocumentConverter'i kendiniz oluşturmayın veya serbest bırakmayın — yapıcı içtedir.
Filigran ekleme
| Lisans durumu | Başlangıç | Dönüşüm çıktısı |
|---|---|---|
Ücretli görüntüleyici lisansı, Converter sağlar | Başlar | Temiz — watermarked: false |
| Aktif Geçici/Demo lisansı | Başlar | Dönüştürür, değerlendirme filigranı ile — watermarked: true |
Lisans yok, eski bir TRIAL dosyası veya Converter içermeyen bir lisans | Application_Start hata verir; her istek boş bir 500 yanıt verir | — |
| Süresi dolmuş Geçici/Demo lisansı | Başlar | Dönüştürür, değerlendirme filigranı — watermarked: true |
Bir entegrasyon, satın almadan önce değerlendirme lisansı üzerinde uçtan uca oluşturulup test edilebilir — yalnızca çıktı baytları değişir.
Sorun giderme
| Semptom | Kontrol |
|---|---|
Eklenti eklendikten sonra her istek boş bir 500 yanıt verir | Lisans Converter sağlar — Windows olay günlüğü, kaynak ASP.NET |
DocumentConverter çözülürken hata verir | AddPlugin<ConverterPlugin>(), DoconutHost.Initialize içinde |
| Web Forms dönüşümü hiç dönmez | Sayfa ConvertAsync'de takılıyor — Async="true" ve RegisterAsyncTask kullanın |
| Akış dönüşümü formatın desteklenmediğini söylüyor | sourceExtension başında nokta içerir |
Widget yüklenir ancak istekleri 404 döndürür | AddConverterWidget() çağrılmadı, ya da basePath '/DocImage.axd' değil |
| Büyük bir yükleme, widget mesajı yerine bir IIS hata sayfası gösterir | maxRequestLength / maxAllowedContentLength, MaxUploadMb'nin altında |
| Bir hedef eksik | convert=open'den allowedTargets kullanın |
| İndirme süresi doldu | convert=open / convert=run'i tekrarlayın; belirteçler kasıtlı olarak geçicidir |
Bu sayfa yardımcı oldu mu?