뷰어

주 문서 뷰어 클래스

Viewer (namespace Doconut)는 Razor 페이지, MVC 컨트롤러, Blazor 컴포넌트 또는 최소 API에서 문서를 여는 공개 진입점입니다. sealed이며 AddDoconut()에 의해 transient 서비스로 등록되고 생성자 주입을 통해 해결됩니다 — 절대 직접 인스턴스를 생성하지 마세요.

이전 .NET Standard 라이브러리는 메모리 캐시, HTTP 컨텍스트 접근자 및 하나 이상의 라이선스 경로를 받는 공개 생성자를 제공했습니다. 해당 생성자는 사라졌으며, 서비스 그래프가 이러한 종속성을 제공합니다.

Viewer는 요청당 상태를 보유하지 않으며 의도적으로 IDisposable을 구현하지 않습니다: 문서 세션은 세션 캐시에서 독립적으로 살아가기 때문에 서비스를 폐기해도 열려 있는 문서를 해제할 수 없습니다 (Core Concepts → How the Viewer Works 참조).

OpenDocumentAsync

문서를 열고 클라이언트 위젯이 이후 모든 요청에 사용하는 세션 토큰을 반환합니다. 모든 열기는 비동기이며 동기 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)문서가 디스크 파일이 아닐 때(업로드, 데이터베이스, 블롭). 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 — 찾은 라이선스가 거부될 때(메시지에 거부 사유가 포함됨) 또는 형식에 더 이상 부여되지 않은 플러그인 기능이 필요할 때 발생합니다. 거부 메시지 없이 캘린더 만료가 발생하면 예외를 발생시키는 대신 워터마크가 적용된 렌더링으로 낮아집니다.
  • FormatNotSupportedException — Document format '<extension>' is not supported.
  • InvalidDataException — 파일 내용이 손상되었거나 확장자와 일치하지 않을 때 발생합니다.

CloseDocument

text
void CloseDocument(string token)

캐시에서 세션을 제거하고(문서 엔진을 즉시 폐기), 보안 마커를 삭제하며 접근 권한을 취소합니다. 선택 사항이지만, 슬라이딩 만료가 동일한 정리 작업을 수행하므로 큰 문서의 경우 권장됩니다.

GetPageCount

text
int GetPageCount(string token)

열린 세션의 전체 페이지 수를 반환합니다. 토큰이 알 수 없거나 만료된 경우 예외가 발생합니다.

Capability flags

멤버의미
bool IsSearchEnabled현재 라이선스가 Search 기능을 허용합니다
bool IsAnnotationEnabled현재 라이선스가 Annotation 기능을 허용합니다

Razor 뷰에서 이 플래그를 사용해 서버가 실제로 제공할 때만 라이선스가 적용된 리본을 렌더링하세요 — 빠른 시작 참고.

DocOptions

열기마다 적용되는 형식에 독립적인 옵션 (namespace Doconut):

TypePropertyDefaultDescription
stringPassword""보호된 문서의 비밀번호(자동으로 형식 설정에 복사됩니다).
intImageResolution0Obsolete. 호환성을 위해만 유지됩니다 — 대신 형식 설정에서 ImageResolution을 지정하십시오.
stringWatermark""렌더링된 페이지에 표시되는 사용자 정의 워터마크 텍스트. 포맷 문자열: "^Text~Color~FontSize~FontName~Opacity~Angle", 예: "^Sample Copy~Red~24~Verdana~80~-45"
intTimeOut60세션 슬라이딩 만료 시간(분)
boolIsSecuredtrueNot currently enforced — 예약된 옵션입니다. 토큰 바인딩은 전역적으로 DoconutOptions.UnsafeMode에 의해 제어됩니다 (Core Concepts → Sessions & Security 참조).

클래스는 일반 단일 호스트 뷰잉 흐름 밖에서 의도적으로 제공되는 특수 속성도 노출합니다:

TypePropertyDefaultDescription
boolIsWebFarmfalse공유 스토리지 시나리오로 열기 작업을 표시합니다. 대소문자에 유의하세요 — 이전 라이브러리는 IsWebfarm이라고 표기했습니다.
stringWebFarmPath""해당 워크플로우에서 사용되는 공유 경로. 이전에 WebfarmPath라고 표기되었습니다. 일반 단일 호스트 뷰어에서는 비어 있으며, 분산 배포에서 설명한 게시 경로에서는 필요하지 않습니다.
boolEditModefalse별도로 배포되는 편집 워크플로우를 위한 예약 옵션이며, 표준 뷰어에서는 false로 두세요.

사용자 지정 워터마크

DocOptions.Watermark은 물결표(~)로 구분된 6개의 필드를 사용합니다. 선택적인 선행 ^는 모든 모서리 배치를 요청합니다:

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
    });
필드예시의미
선행 ^^선택적인 모든 모서리 레이아웃. 없을 경우 일반 워터마크 배치가 사용됩니다.
TextConfidential각 페이지에 표시되는 텍스트. 비어 있어서는 안 됩니다.
ColorRed그리기 레이어가 이해하는 색상 이름.
FontSize24글꼴 크기; 잘못된 숫자 입력은 렌더러 기본값으로 대체됩니다.
FontNameVerdana요청된 글꼴 패밀리. 배포 환경에 설치되어 있어야 합니다.
Opacity800~255 사이의 바이트 값. 정상적으로 파싱되어야 합니다.
Angle-45회전 각도(도); 잘못된 숫자 입력은 기본값으로 대체됩니다.

파서는 선택적인 ^ 뒤에 정확히 6개의 필드가 있어야 합니다. 정의가 잘못되면 SDK의 가시적인 Invalid Watermark 대체값으로 교체되며, 조용히 사라지지는 않습니다.

라이선스 결정

라이선스 상태사용자 지정 값 제공 여부렌더링 결과
유효한 유료 뷰어 라이선스아니오깨끗한 페이지
유효한 유료 뷰어 라이선스예맞춤 워터마크
활성 임시/데모 기본 뷰어아니오깨끗한 기본 뷰어 페이지
활성 임시/데모 기본 뷰어예깨끗한 기본 뷰어 경로가 적용될 때 맞춤 워터마크
누락, 거부, 만료, 잘못된 버전, 또는 잘못된 도메인 라이선스둘 다강제/평가 워터마크; 맞춤 값이 이를 대체하지 않음
평가 규칙에 따른 플러그인 렌더링둘 다평가 워터마크

같은 결정이 제공되는 페이지 이미지와 주석 내보내기에 적용됩니다. 애니메이션 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)AnnotationManager.GetAnnotationData()가 반환하는 인코딩된 페이지/Base64 봉투에서 주석을 로드
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)주석이 포함된 페이지별 PNG를 ZIP으로 압축

이 메서드들은 모두 세션 토큰을 필요로 합니다. 이전 라이브러리의 세션 없이 사용할 수 있던 GetAnnotationManager(pageWidth, pageHeight) 형태는 세션 외부에서 주석을 만들 때는 여전히 사용할 수 있지만, 로드할 때는 토큰이 필요합니다.

DICOM 메타데이터

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

이 메서드는 API 정렬을 위해 존재하지만, 이 패키지는 기술적인 DICOM 태그를 제공할 수 없습니다. 메타데이터 리더는 .NET 8 빌드만 포함하고 있기 때문입니다. DICOM 세션이든 비-DICOM 세션이든 null을 반환하며, DICOM 세션인 경우 플랫폼 제한을 설명하는 일회성 경고를 기록합니다. 페이지, 프레임 및 애니메이션 렌더링은 계속 지원됩니다.

리소스 헬퍼 — ReferenceCss / ReferenceScripts

UseDoconutResources()에서 제공하는 임베디드 리소스에 대한 <link>/<script> 태그를 올바른 의존 순서대로 출력합니다. 검색 및 주석과 같은 라이선스 기반 기능을 위한 번들은 라이선스가 해당 기능을 활성화할 때만 출력되어, 클라이언트 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 }))

이 헬퍼들은 브라우저 리소스를 제공하는 권장 방법입니다. docViewer.js, documentLinks.js, docViewer.UI.js를 wwwroot에 복사해 둔 애플리케이션은, 페이지가 출력된 태그에서 렌더링될 때 해당 복사본을 제거해야 합니다.

이 페이지가 도움이 되었나요?