نمایشگر

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

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

کتابخانهٔ قبلی .NET Standard یک سازندهٔ عمومی ارائه می‌داد که حافظهٔ کش، دسترسی‌گر HTTP context و یک یا چند مسیر مجوز را می‌پذیرفت. آن سازنده حذف شده است؛ گراف سرویس این وابستگی‌ها را فراهم می‌کند.

Viewer هیچ وضعیت درخواست‑محور نگه نمی‌دارد و عمداً انجام نمی‌دهد پیاده‌سازی IDisposable را: نشست‌های سند به‌صورت مستقل در کش نشست زندگی می‌کنند، بنابراین تخلیهٔ سرویس هرگز نمی‌تواند سند باز را از بین ببرد (به مفاهیم اصلی → نحوهٔ کار Viewer مراجعه کنید).

OpenDocumentAsync

یک سند را باز می‌کند و توکن نشست را که ویجت کلاینت برای تمام درخواست‌های بعدی استفاده می‌کند، برمی‌گرداند. هر باز کردن به صورت ناهمزمان است — هیچ OpenDocument همزمانی وجود ندارد.

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

CloseDocument

text
void CloseDocument(string token)

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

GetPageCount

text
int GetPageCount(string token)

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

GetWorksheetNames

text
IReadOnlyList<string> GetWorksheetNames(string token)

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

فقط شیت‌های رندر شده فهرست می‌شوند: شیت‌های مخفی و خالی حذف می‌شوند، و وقتی ExcelConfig.SheetNames رندر را محدود می‌کند، فقط همان شیت‌ها ظاهر می‌شوند. یک شیت همیشه یک صفحه نیست — شیت بسیار بزرگ در چند صفحه رندر می‌شود. اگر توکن ناشناخته یا منقضی باشد، استثنا پرتاب می‌کند.

Added in 26.9.0.

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

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

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

گزینه‌های سند

گزینه‌های مستقل از قالب برای هر باز کردن (فضای نام 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مقدار بایتی از 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

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 کپی کرده‌اند، باید این نسخه‌های کپی‌شده را پس از رندر صفحه از برچسب‌های تولیدشده حذف کنند.

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