نمایشگر
کلاس اصلی نمایشگر سند
Viewer (namespace Doconut) نقطهٔ ورودی عمومی برای باز کردن اسناد از صفحات Razor، کنترلکنندههای MVC، کامپوننتهای Blazor یا APIهای کمینه است. این کلاس قفلشده است، توسط AddDoconut() به عنوان سرویس موقت ثبت میشود و از طریق تزریق سازنده حل میشود — هرگز بهصورت مستقیم آن را نمونهسازی نکنید.
کتابخانهٔ قبلی .NET Standard یک سازندهٔ عمومی ارائه میداد که حافظهٔ کش، دسترسیکنندهٔ زمینهٔ HTTP و یک یا چند مسیر مجوز را میگرفت. آن سازنده حذف شده است؛ گراف سرویس این وابستگیها را فراهم میکند.
Viewer هیچ وضعیت درخواست‑محور نگه نمیدارد و عمداً اجرا نمیکند IDisposable: نشستهای سند بهصورت مستقل در کش نشست زندگی میکنند، بنابراین تخلیهٔ سرویس هرگز نمیتواند سند باز را از بین ببرد (به مفاهیم اصلی → نحوهٔ کار Viewer مراجعه کنید).
باز کردن سند به صورت ناهمزمان
یک سند را باز میکند و توکن نشست را که ویجت مشتری برای تمام درخواستهای بعدی استفاده میکند، برمیگرداند. هر باز کردن بهصورت ناهمزمان است — معادل همزمانی برای OpenDocument وجود ندارد.
| بارگذاری | زمان استفاده |
|---|---|
Task<string> OpenDocumentAsync(string filePath, DocOptions? options = null, CancellationToken ct = default) | باز کردن از دیسک با تشخیص خودکار فرمت و پیکربندی پیشفرض فرمت |
Task<string> OpenDocumentAsync(string filePath, BaseConfig? config, DocOptions? options = null, CancellationToken ct = default) | نیاز به گزینههای رندر برای هر فرمت دارید (PdfConfig، WordConfig، …) |
Task<string> OpenDocumentAsync(Stream stream, FileInfo fileInfo, BaseConfig? config = null, DocOptions? options = null, CancellationToken ct = default) | سند یک فایل روی دیسک نیست (بارگذاری، پایگاهداده، blob). fileInfo باید پسوند صحیح را داشته باشد — این پسوند تشخیص فرمت را هدایت میکند |
// باز کردن ساده
string token = await viewer.OpenDocumentAsync(path);
// با پیکربندی و گزینههای هر فرمت
token = await viewer.OpenDocumentAsync(
path,
new PdfConfig { AllowSearch = true, AllowCopy = true },
new DocOptions { TimeOut = 30 });
// از یک بارگذاری
await using var ms = new MemoryStream();
await file.CopyToAsync(ms);
ms.Position = 0;
token = await viewer.OpenDocumentAsync(ms, new FileInfo(file.FileName));استثناهای قابلدسترس:
LicenseException— یک مجوز یافتشده رد میشود (پیام شامل دلیل رد است)، یا فرمت به قابلیت افزونهای نیاز دارد که دیگر اعطا نشده است. انقضای تقویم بدون پیام رد، به رندر با واترمارک تبدیل میشود بهجای پرتاب استثنا.FormatNotSupportedException—Document format '<extension>' is not supported.InvalidDataException— محتوای فایل خراب است یا با پسوند آن مطابقت ندارد.
بستن سند
void CloseDocument(string token)نشست را از کش حذف میکند (موتور سند را بلافاصله تخلیه میکند)، نشان امنیتی را حذف مینماید و دسترسی اعطا شده را لغو میکند. این کار اختیاری است — انقضای لغزشی همان پاکسازی را انجام میدهد — اما برای اسناد بزرگ توصیه میشود.
دریافت تعداد صفحات
int GetPageCount(string token)کل صفحات نشست باز را برمیگرداند. اگر توکن ناشناخته یا منقضی باشد، استثنا پرتاب میکند.
پرچمهای قابلیت
| عضو | معنی |
|---|---|
bool IsSearchEnabled | مجوز فعلی Search را اعطا میکند |
bool IsAnnotationEnabled | مجوز فعلی Annotation را اعطا میکند |
از اینها در یک نمای Razor استفاده کنید تا Ribbon دارای مجوز فقط زمانی رندر شود که سرور واقعاً آن را سرویسدهی کند — به شروع سریع مراجعه کنید.
گزینههای DocOptions
گزینههای مستقل از فرمت برای هر باز کردن (namespace Doconut):
| نوع | ویژگی | پیشفرض | توضیح |
|---|---|---|---|
string | Password | "" | رمز عبور برای اسناد محافظتشده (بهصورت خودکار به پیکربندی فرمت کپی میشود). |
int | ImageResolution | 0 | منسوخ. فقط برای سازگاری نگه داشته شده — بهجای آن ImageResolution را در پیکربندی فرمت تنظیم کنید. |
string | Watermark | "" | متن واترمارک سفارشی که بر روی صفحات رندر شده کشیده میشود. رشته قالب: "^Text~Color~FontSize~FontName~Opacity~Angle"، به عنوان مثال "^Sample Copy~Red~24~Verdana~80~-45". |
int | TimeOut | 60 | انقضای لغزشی نشست بر حسب دقیقه. |
bool | IsSecured | true | در حال حاضر اعمال نمیشود — رزرو شده. بایندینگ توکن بهصورت سراسری توسط DoconutOptions.UnsafeMode کنترل میشود (به مفاهیم اصلی → نشستها و امنیت مراجعه کنید). |
کلاس همچنین ویژگیهای تخصصی را که عمداً خارج از جریان مشاهدهٔ تک‑هاست معمولی هستند، ارائه میدهد:
| نوع | ویژگی | پیشفرض | توضیح |
|---|---|---|---|
bool | IsWebFarm | false | عملیات باز کردن را بهعنوان سناریوی ذخیرهسازی مشترک علامتگذاری میکند. به حروف توجه کنید — کتابخانهٔ قبلی این را IsWebfarm نوشت. |
string | WebFarmPath | "" | مسیر مشترکی که توسط آن جریان کاری استفاده میشود. قبلاً به صورت WebfarmPath نوشته میشد. در نمایندهٔ تک‑هاست معمولی خالی است و در مسیر انتشار توصیفشده در استقرارهای توزیعشده نیازی نیست. |
bool | EditMode | false | برای یک جریان کاری ویرایش توزیعشده جداگانه رزرو شده است؛ false را برای نمایندهٔ استاندارد بگذارید. |
واترمارک سفارشی
DocOptions.Watermark از شش فیلد جدا شده با تیلده استفاده میکند. یک ^ پیشاختیاری درخواست چیدمان تمامگوشهها را میکند:
^Text~Color~FontSize~FontName~Opacity~Anglestring token = await viewer.OpenDocumentAsync(
path,
new PdfConfig(),
new DocOptions
{
Watermark = "^Confidential~Red~24~Verdana~80~-45",
TimeOut = 30
});| فیلد | مثال | معنی |
|---|---|---|
پیشرو ^ | ^ | چیدمان تمامگوشههای اختیاری. بدون آن، قرارگیری معمولی واترمارک استفاده میشود. |
| متن | Confidential | متنی که در هر صفحه رندر میشود. نباید خالی باشد. |
| رنگ | Red | رنگ نامگذاری شدهای که لایه رسم میفهمد. |
| اندازهقلم | 24 | اندازه قلم؛ ورودی عددی نامعتبر به پیشفرض رندرر باز میگردد. |
| نامقلم | Verdana | خانواده قلم درخواستشده. اطمینان حاصل کنید که در محیط استقرار نصب شده باشد. |
| شفافیت | 80 | مقدار بایتی از ۰ تا ۲۵۵. باید بهدرستی تجزیه شود. |
| زاویه | -45 | زاویه چرخش بر حسب درجه؛ ورودی عددی نامعتبر به پیشفرض باز میگردد. |
پارسِر دقیقاً شش فیلد پس از ^ اختیاری انتظار دارد. یک تعریف نامعتبر با بازگشت پیشفرض قابل مشاهده Invalid Watermark SDK جایگزین میشود بهجای اینکه بهصورت ساکت ناپدید شود.
تصمیمگیری لایسنس
| وضعیت لایسنس | مقدار سفارشی ارائهشده | نتیجه رندر شده |
|---|---|---|
| لایسنس مشاهدهگر پرداختشده معتبر | خیر | صفحه تمیز |
| لایسنس مشاهدهگر پرداختشده معتبر | بله | واترمارک سفارشی |
| مشاهدهگر پایه موقت/دموی فعال | خیر | صفحه پایهمشاهدهگر تمیز |
| مشاهدهگر پایه موقت/دموی فعال | بله | واترمارک سفارشی وقتی مسیر پایهمشاهدهگر تمیز اعمال میشود |
| لایسنس گمشده، ردشده، منقضیشده، نسخهنادرست یا دامنهنامعتبر | هر کدام | واترمارک اعمال/ارزیابی؛ مقدار سفارشی آن را بازنویسی نمیکند |
| رندر افزونه تحت قوانین ارزیابی | هر کدام | واترمارک ارزیابی |
همان تصمیم برای تصاویر صفحات سروشده و خروجیهای حاشیهنویسی اعمال میشود. خروجی GIF انیمیشنی بهصورت فریم به فریم مهر میشود. بنابراین واترمارک سفارشی یک ویژگی برنامه تحت لایسنس است، نه روشی برای جایگزینی یا سرکوب واترمارک ارزیابی.
API حاشیهنویسی
بارگذاری و صادرات حاشیهنویسی در سمت سرور. راهنمای کامل در راهنماها → حاشیهنویسی موجود است؛ سطح کار به این صورت است:
| عضو | هدف |
|---|---|
AnnotationManager GetAnnotationManager(string token) | مدیر مرتبط با ابعاد صفحه جلسه باز |
AnnotationManager GetAnnotationManager(string token, int pageWidth, int pageHeight) | مدیر با ابعاد صفحه صریح |
AnnotationManager GetAnnotationManager(int pageWidth, int pageHeight) | مدیر مستقل از جلسه |
void LoadAnnotationData(string token, AnnotationManager manager) | بارگذاری حاشیهنویسیهای ساختهشده در C# به جلسه |
void LoadAnnotationData(string token, string annotationData) | بارگذاری حاشیهنویسیها از صفحه/پاکت Base64 رمزگذاریشده که توسط AnnotationManager.GetAnnotationData() برگردانده میشود |
void LoadAnnotationXML(string token, XmlDocument annotationXml) | بارگذاری حاشیهنویسیها از XML |
XmlDocument GetAnnotationXML(string token) | صادرات حاشیهنویسیهای جلسه بهصورت XML |
Task<byte[]> ExportAnnotationsToPdfAsync(string token, int zoom = 100, CancellationToken ct = default) | PDF با حاشیهنویسیهای تعبیهشده |
Task<int> ExportAnnotationsToPngAsync(…) | فایلهای PNG با حاشیهنویسیهای تعبیهشده |
Task<byte[]> ExportAnnotationsToPngZipAsync(string token, int zoom = 100, CancellationToken ct = default) | ZIP از PNGهای صفحه به صفحه با حاشیهنویسیهای تعبیهشده |
هر یک از اینها توکن جلسه را میگیرد. شکل GetAnnotationManager(pageWidth, pageHeight) بدون جلسه کتابخانه قبلی برای ساخت حاشیهنویسیها خارج از جلسه باقی میماند، اما بارگذاری آنها همچنان به توکن نیاز دارد.
فراداده DICOM
Task<DicomMetadata?> GetDicomMetadataAsync(string token, CancellationToken ct = default)این متد برای همراستایی API وجود دارد، اما این بسته نمیتواند برچسبهای فنی DICOM را فراهم کند: خواننده فراداده فقط یک نسخه .NET 8 را ارائه میدهد. برای جلسات DICOM و غیر‑DICOM مقدار null برمیگرداند؛ در یک جلسه DICOM همچنین یک هشدار یکبار مصرف مینویسد که محدودیت پلتفرم را توضیح میدهد. رندر صفحه، فریم و انیمیشن همچنان پشتیبانی میشود.
کمکیهای منبع — ReferenceCss / ReferenceScripts
برچسبهای <link>/<script> را برای منابع جاسازیشدهای که توسط UseDoconutResources() سرو میشوند، در ترتیب وابستگی صحیح تولید کنید. بستهها برای ویژگیهای تحتمجوز مانند جستجو و حاشیهنویسی فقط زمانی که مجوز آنها را فعال میکند تولید میشوند، بهطوری که رابط کاربری مشتری با رفتار سرور سازگار باشد.
string ReferenceCss(CssConfig? config = null) // null → Bootstrap + نمایشگر + جستجو + حاشیهنویسی
string ReferenceScripts(ScriptConfig? config = null)پرچمهای CssConfig: IncludeBootstrapCss، IncludeViewerCss، IncludeSearchCss (محدود به جستجو)، IncludeAnnotationCss (محدود به حاشیهنویسی).
پرچمهای ScriptConfig: IncludeJQuery (نیازمند توسط همهٔ دیگران)، IncludeBootstrap، IncludeViewerScripts (هسته: docViewer.js + تقسیمکننده + پیوندها)، IncludeSearchScripts و IncludeSearchBar (محدود به جستجو)، IncludeAnnotationScripts و IncludeAnnotationBar (محدود به حاشیهنویسی).
@inject Doconut.Viewer Viewer
@Html.Raw(Viewer.ReferenceCss(new CssConfig { IncludeBootstrapCss = true, IncludeViewerCss = true }))
@Html.Raw(Viewer.ReferenceScripts(new ScriptConfig { IncludeJQuery = true, IncludeViewerScripts = true }))این کمکیها روش پشتیبانیشده برای تحویل منابع مرورگر هستند. برنامههایی که
docViewer.js، documentLinks.js و docViewer.UI.js را به wwwroot کپی کردهاند، باید
این نسخههای کپیشده را پس از رندر شدن صفحه از برچسبهای تولیدشده حذف کنند.
آیا این صفحه مفید بود؟