نمایشگر

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

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 باید پسوند صحیح را داشته باشد — این پسوند تشخیص فرمت را هدایت می‌کند
csharp
// باز کردن ساده
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 — محتوای فایل خراب است یا با پسوند آن مطابقت ندارد.

بستن سند

text
void CloseDocument(string token)

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

دریافت تعداد صفحات

text
int GetPageCount(string token)

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

پرچم‌های قابلیت

عضومعنی
bool IsSearchEnabledمجوز فعلی Search را اعطا می‌کند
bool IsAnnotationEnabledمجوز فعلی Annotation را اعطا می‌کند

از این‌ها در یک نمای Razor استفاده کنید تا Ribbon دارای مجوز فقط زمانی رندر شود که سرور واقعاً آن را سرویس‌دهی کند — به شروع سریع مراجعه کنید.

گزینه‌های DocOptions

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

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

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

نوعویژگیپیش‌فرضتوضیح
boolIsWebFarmfalseعملیات باز کردن را به‌عنوان سناریوی ذخیره‌سازی مشترک علامت‌گذاری می‌کند. به حروف توجه کنید — کتابخانهٔ قبلی این را IsWebfarm نوشت.
stringWebFarmPath""مسیر مشترکی که توسط آن جریان کاری استفاده می‌شود. قبلاً به صورت WebfarmPath نوشته می‌شد. در نمایندهٔ تک‑هاست معمولی خالی است و در مسیر انتشار توصیف‌شده در استقرارهای توزیع‌شده نیازی نیست.
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 جایگزین می‌شود به‌جای این‌که به‌صورت ساکت ناپدید شود.

تصمیم‌گیری لایسنس

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

همان تصمیم برای تصاویر صفحات سرو‌شده و خروجی‌های حاشیه‌نویسی اعمال می‌شود. خروجی 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

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

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

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

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

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

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

این کمکی‌ها روش پشتیبانی‌شده برای تحویل منابع مرورگر هستند. برنامه‌هایی که
docViewer.js، documentLinks.js و docViewer.UI.js را به wwwroot کپی کرده‌اند، باید
این نسخه‌های کپی‌شده را پس از رندر شدن صفحه از برچسب‌های تولید‌شده حذف کنند.

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