نمایشگر

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

Viewer (namespace Doconut) نقطهٔ ورودی عمومی برای باز کردن اسناد از صفحات Razor، کنترلرهای MVC، کامپوننت‌های Blazor یا APIهای حداقل است. این کلاس sealed است، به‌عنوان سرویس transient توسط AddDoconut() ثبت می‌شود و از طریق تزریق سازنده حل می‌شود — هرگز به‌صورت مستقیم آن را ساخت نکنید.

Viewer هیچ وضعیت درخواست‑به‑درخواست نگه نمی‌دارد و عمداً does not پیاده‌سازی IDisposable را انجام می‌دهد: جلسات سند به‌صورت مستقل در کش جلسه زندگی می‌کنند، بنابراین تخلیه سرویس هرگز نمی‌تواند سند باز را از بین ببرد (به Core Concepts → How the Viewer Works مراجعه کنید).

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

گزینه‌های مستقل از فرمت برای هر باز (namespace Doconut):

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

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

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

Custom watermark

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
    });
FieldExampleMeaning
Leading ^^چیدمان همه‌گوشه‌ای اختیاری. بدون آن، مکان‌گذاری عادی واترمارک استفاده می‌شود.
TextConfidentialمتنی که بر هر صفحه رندر می‌شود. نباید خالی باشد.
ColorRedرنگ نام‌گذاری‌شده‌ای که لایه رسم آن را می‌داند.
FontSize24اندازه فونت؛ ورودی عددی نامعتبر به پیش‌فرض رندرر باز می‌گردد.
FontNameVerdanaخانواده فونت درخواست‌شده. اطمینان حاصل کنید که در محیط استقرار نصب شده باشد.
Opacity80مقدار بایت از 0 تا 255. باید به‌درستی تجزیه شود.
Angle-45زاویه چرخش بر حسب درجه؛ ورودی عددی نامعتبر به پیش‌فرض باز می‌گردد.

پارسر دقیقاً شش فیلد پس از ^ اختیاری انتظار دارد. تعریف نامعتبر با fallback قابل مشاهده Invalid Watermark SDK جایگزین می‌شود به‌جای این‌که به‌صورت ساکت ناپدید شود.

License decision

وضعیت لایسنسمقدار سفارشی ارائه‌شدهنتیجه رندر شده
مجوز معتبر پرداخت‌شده برای نمایشگرخیرصفحه تمیز
مجوز معتبر پرداخت‌شده برای نمایشگربلهواترمارک سفارشی
نمایشگر پایه موقت/دموی فعالخیرصفحه تمیز نمایشگر پایه
نمایشگر پایه موقت/دموی فعالبلهواترمارک سفارشی وقتی مسیر تمیز نمایشگر پایه اعمال می‌شود
مجوز گمشده، رد شده، منقضی‌شده، نسخه نادرست یا دامنه نامعتبرهر کدامواترمارک اعمال/ارزیابی؛ مقدار سفارشی آن را بازنویسی نمی‌کند
رندرینگ افزونه تحت قوانین ارزیابیهر کدامواترمارک ارزیابی

همین تصمیم برای تصاویر صفحه سرو شده و خروجی‌های حاشیه‌نویسی اعمال می‌شود. خروجی GIF متحرک فریم به فریم مهر می‌شود. بنابراین واترمارک سفارشی یک ویژگی برنامه‌دار تحت لایسنس است، نه روشی برای جایگزینی یا حذف واترمارک ارزیابی.

Annotations API

بارگذاری و خروجی حاشیه‌نویسی سمت سرور. راهنمای کامل در Guides → Annotations موجود است؛ سطح کارکرد به این صورت است:

MemberPurpose
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 metadata

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

این متد برای هم‌سویی API وجود دارد، اما نمایشگر DICOM .NET 6 نمی‌تواند برچسب‌های فنی را فراهم کند. برای جلسات DICOM و غیر‑DICOM null برمی‌گرداند؛ در یک جلسه DICOM همچنین یک هشدار یک‌باریه می‌نویسد که محدودیت پلتفرم را توضیح می‌دهد. رندرینگ صفحه، فریم و انیمیشن همچنان پشتیبانی می‌شود.

Resource helpers — 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 (search‑gated)، IncludeAnnotationCss (annotation‑gated).

پرچم‌های ScriptConfig: IncludeJQuery (required by all others)، IncludeBootstrap، IncludeViewerScripts (core: docViewer.js + splitter + links)، IncludeSearchScripts و IncludeSearchBar (search‑gated)، IncludeAnnotationScripts و IncludeAnnotationBar (annotation‑gated).

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 }))

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