نمایشگر

کلاس اصلی نمایشگر سند

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 باید پسوند صحیح را حمل کند — این پسوند تشخیص قالب را هدایت می‌کند
csharp
// 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 — یک لایسنس پیدا‌شده رد می‌شود (پیام دلیل رد را حمل می‌کند)، یا قالب به قابلیت افزونه‌ای نیاز دارد که دیگر اعطا نشده است. انقضای تقویم بدون پیام رد به رندرینگ با واترمارک تبدیل می‌شود به‌جای پرتاب استثنا.
  • FormatNotSupportedExceptionDocument format '<extension>' is not supported.
  • InvalidDataException — محتوای فایل خراب است یا با پسوند آن مطابقت ندارد.

CloseDocument

text
void CloseDocument(string token)

جلسه را از کش حذف می‌کند (موتور سند را بلافاصله تخلیه می‌کند)، نشانگر امنیتی را پاک می‌سازد و دسترسی اعطایی را لغو می‌کند. به‌صورت اختیاری — انقضای لغزان همان پاک‌سازی را انجام می‌دهد — اما برای اسناد بزرگ توصیه می‌شود.

GetPageCount

text
int GetPageCount(string token)

تعداد کل صفحات جلسهٔ باز. اگر توکن ناشناخته یا منقضی باشد، استثنا پرتاب می‌کند.

DocOptions

گزینه‌های مستقل از قالب برای هر باز‑کردن (فضای‌نام Doconut):

نوعویژگیپیش‌فرضتوضیح
stringPassword""رمز عبور برای اسناد محافظت‌شده (به‌صورت خودکار در پیکربندی قالب کپی می‌شود).
intImageResolution0منسوخ. فقط برای سازگاری نگه داشته شده — به‌جای آن ImageResolution را در پیکربندی قالب تنظیم کنید.
stringWatermark""متن واترمارک سفارشی که بر صفحات رندر شده کشیده می‌شود. رشته قالب: "^Text~Color~FontSize~FontName~Opacity~Angle"، مثال: "^Sample Copy~Red~24~Verdana~80~-45".
intTimeOut60انقضای لغزان جلسه بر حسب دقیقه.
boolIsSecuredtrueدر حال حاضر اعمال نمی‌شود — رزرو شده. بایندینگ توکن به‌صورت سراسری توسط DoconutOptions.UnsafeMode کنترل می‌شود (به مفاهیم اصلی → جلسات و امنیت مراجعه کنید).

کلاس همچنین ویژگی‌های تخصصی‌ای را افشا می‌کند که عمداً خارج از جریان مشاهدهٔ تک‑هاست معمولی قرار دارند:

نوعویژگیپیش‌فرضتوضیح
boolIsWebFarmfalseعملیات باز‑کردن را به‌عنوان سناریوی وب‑فارم علامت‌گذاری می‌کند. فقط با معماری ذخیره‌سازی/جلسهٔ مشترک مربوطه استفاده شود.
stringWebFarmPath""مسیر مشترکی که توسط جریان کاری وب‑فارم تخصصی استفاده می‌شود. در نمایشگر تک‑هاست معمولی خالی است.
boolEditModefalseبرای جریان کاری ویرایشگر توزیع‌شده جداگانه رزرو شده؛ برای نمایشگر استاندارد false بماند.

واترمارک سفارشی

DocOptions.Watermark از شش فیلد جداشده با تیلدا استفاده می‌کند. یک ^ پیش‌اختیاری درخواست چیدمان تمام‑گوشه‌ها را می‌دهد:

text
^Text~Color~FontSize~FontName~Opacity~Angle
csharp
string 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

text
Task<DicomMetadata?> GetDicomMetadataAsync(string token, CancellationToken ct = default)

متادیتای برچسب DICOM را برای جلساتی که از افزونه DICOM باز شده‌اند برمی‌گرداند؛ برای اسناد غیر‑DICOM null برمی‌گرداند.

کمک‌کننده‌های منبع — ReferenceCss / ReferenceScripts

برچسب‌های <link>/<script> را برای منابع توکار ارائه‌شده توسط UseDoconutResources()، به ترتیب وابستگی صحیح، تولید می‌کند. بسته‌ها برای ویژگی‌های تحت لایسنس مانند جستجو و حاشیه‌نویسی فقط زمانی که لایسنس آن‌ها را فعال کند، صادر می‌شوند تا UI مشتری با رفتار سرور هم‌خوانی داشته باشد.

text
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 (حاشیه‌نویسی‑محدود).

html
@inject Doconut.Viewer Viewer

@Html.Raw(Viewer.ReferenceCss(new CssConfig { IncludeBootstrapCss = true, IncludeViewerCss = true }))
@Html.Raw(Viewer.ReferenceScripts(new ScriptConfig { IncludeJQuery = true, IncludeViewerScripts = true }))

آیا این صفحه مفید بود؟