نمایشگر
کلاس اصلی نمایشگر سند
Viewer (namespace Doconut) نقطهٔ ورودی عمومی برای باز کردن اسناد از صفحات Razor، کنترلرهای MVC، کامپوننتهای Blazor یا APIهای مینیمال است. این کلاس sealed است، توسط AddDoconut() بهعنوان سرویس transient ثبت میشود و از طریق تزریق سازنده حل میشود — هرگز بهصورت مستقیم آن را سازند نکنید.
کتابخانهٔ قبلی .NET Standard یک سازندهٔ عمومی ارائه میداد که حافظهٔ کش، دسترسیگر HTTP context و یک یا چند مسیر مجوز را میپذیرفت. آن سازنده حذف شده است؛ گراف سرویس این وابستگیها را فراهم میکند.
Viewer هیچ وضعیت درخواست‑محور نگه نمیدارد و عمداً انجام نمیدهد پیادهسازی IDisposable را: نشستهای سند بهصورت مستقل در کش نشست زندگی میکنند، بنابراین تخلیهٔ سرویس هرگز نمیتواند سند باز را از بین ببرد (به مفاهیم اصلی → نحوهٔ کار Viewer مراجعه کنید).
OpenDocumentAsync
یک سند را باز میکند و توکن نشست را که ویجت کلاینت برای تمام درخواستهای بعدی استفاده میکند، برمیگرداند. هر باز کردن به صورت ناهمزمان است — هیچ OpenDocument همزمانی وجود ندارد.
| Overload | Use when |
|---|---|
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— محتوای فایل خراب است یا با پسوند آن مطابقت ندارد.
CloseDocument
void CloseDocument(string token)نشست را از کش حذف میکند (موتور سند را بلافاصله تخلیه میکند)، علامت امنیتی را حذف میکند و دسترسی اعطا شده را باطل میسازد. این کار اختیاری است — انقضای لغزان همان پاکسازی را انجام میدهد — اما برای اسناد بزرگ توصیه میشود.
GetPageCount
int GetPageCount(string token)کل صفحات نشست باز. اگر توکن ناشناخته یا منقضی باشد، استثنا پرتاب میکند.
GetWorksheetNames
IReadOnlyList<string> GetWorksheetNames(string token)نامهای شیتهای یک صفحهگسترده باز را به ترتیب کتابکار برمیگرداند، یا در صورتی که سند باز یک صفحهگسترده نباشد، لیست خالی برمیگرداند.
فقط شیتهای رندر شده فهرست میشوند: شیتهای مخفی و خالی حذف میشوند، و وقتی ExcelConfig.SheetNames رندر را محدود میکند، فقط همان شیتها ظاهر میشوند. یک شیت همیشه یک صفحه نیست — شیت بسیار بزرگ در چند صفحه رندر میشود. اگر توکن ناشناخته یا منقضی باشد، استثنا پرتاب میکند.
Added in 26.9.0.
پرچمهای قابلیت
| عضو | معنی |
|---|---|
bool IsSearchEnabled | مجوز فعلی Search را اعطا میکند |
bool IsAnnotationEnabled | مجوز فعلی Annotation را اعطا میکند |
از اینها در یک نمای Razor استفاده کنید تا نوار Ribbon دارای مجوز فقط زمانی رندر شود که سرور واقعاً آن را سرو کند — ببینید شروع سریع.
گزینههای سند
گزینههای مستقل از قالب برای هر باز کردن (فضای نام 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 | مقدار بایتی از 0 تا 255. باید بهدرستی تجزیه شود. |
| زاویه | -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 کپی کردهاند، باید این نسخههای کپیشده را پس از رندر صفحه از برچسبهای تولیدشده حذف کنند.
آیا این صفحه مفید بود؟