نمایشگر
کلاس اصلی نمایشگر سند
Viewer (فضاینام Doconut) نقطهٔ ورودی عمومی برای باز کردن اسناد از صفحات Razor، کنترلرهای MVC، کامپوننتهای Blazor یا APIهای حداقلی است. این کلاس بسته است و بهعنوان سرویس موقت توسط AddDoconut() ثبت میشود و از طریق تزریق سازنده حل میشود — هرگز بهصورت مستقیم آن را ساخت نکنید.
Viewer هیچ وضعیت درخواست‑به‑درخواستایی را نگه نمیدارد و بهصورت عمدی پیادهسازی IDisposable نمیکند: جلسات سند بهصورت مستقل در کش جلسه زندگی میکنند، بنابراین تخلیهٔ سرویس هرگز نمیتواند سند باز را از بین ببرد (به مفاهیم اصلی → نحوه کار Viewer مراجعه کنید).
OpenDocumentAsync
یک سند را باز میکند و توکن جلسهای را برمیگرداند که ویجت مشتری برای تمام درخواستهای بعدی از آن استفاده میکند.
| بارگذاری | زمان استفاده |
|---|---|
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 باید پسوند صحیح را حمل کند — این پسوند تشخیص قالب را هدایت میکند |
// Simple open
string token = await viewer.OpenDocumentAsync(path);
// With per-format config and options
token = await viewer.OpenDocumentAsync(
path,
new PdfConfig { AllowSearch = true, AllowCopy = true },
new DocOptions { TimeOut = 30 });
// From an upload
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)تعداد کل صفحات جلسهٔ باز. اگر توکن ناشناخته یا منقضی باشد، استثنا پرتاب میکند.
DocOptions
گزینههای مستقل از قالب برای هر باز‑کردن (فضاینام 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 | عملیات باز‑کردن را بهعنوان سناریوی وب‑فارم علامتگذاری میکند. فقط با معماری ذخیرهسازی/جلسهٔ مشترک مربوطه استفاده شود. |
string | 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 جایگزین میشود بهجای ناپدید شدن ساکن.
تصمیمگیری لایسنس
| وضعیت لایسنس | مقدار سفارشی ارائهشده | نتیجه رندر شده |
|---|---|---|
| لایسنس معتبر پولی Viewer | خیر | صفحهٔ پاک |
| لایسنس معتبر پولی Viewer | بله | واترمارک سفارشی |
| Viewer پایه موقت/دموی فعال | خیر | صفحهٔ پایه‑نمایشگر پاک |
| Viewer پایه موقت/دموی فعال | بله | واترمارک سفارشی وقتی مسیر پایه‑نمایشگر پاک اعمال میشود |
| لایسنس گمشده، رد شده، منقضی، نسخه نادرست یا دامنه نامعتبر | هر کدام | واترمارک اعمال/ارزیابی؛ مقدار سفارشی آن را نادیده میگیرد |
| رندرینگ افزونه تحت قوانین ارزیابی | هر کدام | واترمارک ارزیابی |
همین تصمیم برای تصاویر صفحهٔ سروشده و خروجیهای حاشیهنویسی اعمال میشود. خروجی GIF متحرک فریم به فریم مهر میشود. بنابراین واترمارک سفارشی یک ویژگی برنامهمحور تحت لایسنس است، نه روشی برای جایگزینی یا حذف واترمارک ارزیابی.
API حاشیهنویسی
بارگذاری و خروجیگیری حاشیهنویسی در سمت سرور. راهنمای کامل در Guides → Annotations موجود است؛ سطحی که در اینجا ارائه میشود عبارت است از:
| عضو | هدف |
|---|---|
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های صفحه به صفحه با حاشیهنویسی سوزاندهشده |
متادیتای DICOM
Task<DicomMetadata?> GetDicomMetadataAsync(string token, CancellationToken ct = default)متادیتای برچسب DICOM را برای جلساتی که از افزونه DICOM باز شدهاند برمیگرداند؛ برای اسناد غیر‑DICOM null برمیگرداند.
کمککنندههای منبع — ReferenceCss / ReferenceScripts
برچسبهای <link>/<script> را برای منابع توکار ارائهشده توسط UseDoconutResources()، به ترتیب وابستگی صحیح، تولید میکند. بستهها برای ویژگیهای تحت لایسنس مانند جستجو و حاشیهنویسی فقط زمانی که لایسنس آنها را فعال کند، صادر میشوند تا UI مشتری با رفتار سرور همخوانی داشته باشد.
string ReferenceCss(CssConfig? config = null) // null → Bootstrap + viewer + search + annotation
string ReferenceScripts(ScriptConfig? config = null)پرچمهای CssConfig: IncludeBootstrapCss، IncludeViewerCss، IncludeSearchCss (جستجو‑محدود)، IncludeAnnotationCss (حاشیهنویسی‑محدود).
پرچمهای ScriptConfig: IncludeJQuery (برای همه دیگرها ضروری)، IncludeBootstrap، IncludeViewerScripts (هسته: docViewer.js + splitter + links)، 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 }))آیا این صفحه مفید بود؟