Skip to content

Releases: groupdocs-viewer/GroupDocs.Viewer-for-.NET-UI

Release 26.3.0

04 Mar 18:06

Choose a tag to compare

This release introduces Docker image support, new extensibility APIs, distributed caching, Azure AD authentication, startup validation, and numerous bug fixes and improvements across the library.

🛠️ Changes

Docker Image Support

A pre-built Docker image is now published to Docker Hub and GitHub Container Registry, enabling zero-setup deployment:

docker run -p 8080:8080 -v ./documents:/app/Files groupdocs/viewer-ui:latest

All settings are configurable via environment variables (VIEWER_TYPE, VIEWER_STORAGE_PATH, VIEWER_CACHE_PATH, etc.). Includes health check endpoint at /health and docker-compose example.

New Extensibility APIs

  • AddCustomScript(path) — Inject custom JavaScript into the viewer UI page
  • ReadFileStreamAsync on IFileStorage — Stream-based file reading to avoid loading entire files into memory
  • RemoveAsync on IFileCache — Cache invalidation API for all cache providers (Local, InMemory, Distributed)
  • Comprehensive XML documentation and README examples for IPageFormatter, IFileTypeResolver, ISearchTermResolver, IFileNameResolver, and IErrorMessageProvider

Distributed Cache Provider

New GroupDocs.Viewer.UI.Api.Distributed.Cache package wrapping IDistributedCache, enabling Redis, SQL Server, or NCache as cache backends:

builder.Services.AddControllers()
    .AddGroupDocsViewerSelfHostApi()
    .AddDistributedCache();

Azure AD Authentication

Azure Blob Storage now supports TokenCredential (e.g., DefaultAzureCredential) and connection string authentication in addition to account name/key:

.AddAzureBlobStorage(options =>
{
    options.AccountName = "myaccount";
    options.ContainerName = "documents";
    options.TokenCredential = new DefaultAzureCredential();
})

Startup Validation

Two new IHostedService validators warn at startup about common misconfigurations:

  • ConfigurationValidator — Detects RenderingMode/ViewerType mismatch
  • ServiceRegistrationValidator — Warns when IFileStorage is not registered

Browser-Side Response Caching

New ResponseCacheDurationSeconds config property adds Cache-Control headers to GET endpoints (/get-page, /get-thumb, /get-pdf, /get-resource).

Configuration Improvements

  • appsettings.json binding now works for SelfHost API config properties (LicensePath, ViewerType)
  • Configurable SizeLimit for InMemoryCache to cap memory usage
  • Root endpoint (/) support for the viewer UI

Async and Cancellation Improvements

  • CancellationToken propagated through IViewer, IFileStorage, and IFileCache interfaces
  • Thread.Sleep replaced with await Task.Delay in async paths

Version Scheme

Switched to company versioning scheme (YY.M.0). This release is 26.3.0 (March 2026).

🐛 Bug Fixes

  • Fix PngViewer using JpgViewOptions for ViewInfo
  • Fix thumb URL using PageExtension instead of ThumbExtension
  • Fix duplicate FontsToExclude assignment
  • Fix broken URL in Cloud API sample
  • Fix MemoryStream not disposed in ReadFileFromRequest
  • Fix duplicate UserSecretsId between samples
  • Fix missing System.Drawing.EnableUnixSupport in SelfHost samples
  • Fix indexer setter using Insert instead of assignment in Pages and Thumbs
  • Fix JpgPage and PngPage SetContent encoding bug
  • Fix network roundtrip on every operation when using Azure Blob Storage
  • Add BucketName validation to AwsS3FileStorage constructor

🔧 Infrastructure

  • Update GitHub Actions to v4
  • Target Dockerfiles and samples to .NET 8.0
  • Update .NET SDK prerequisite to 8.0
  • Remove stage publishing workflow
  • Fix typos in README files

📦 Packages

Thirteen NuGet packages available including the new GroupDocs.Viewer.UI.Api.Distributed.Cache.


Thank you for using GroupDocs.Viewer.UI! If you encounter any issues or have suggestions, please don't hesitate to provide feedback here on GitHub or at our Free Support Forum.

8.1.5

19 Feb 14:01

Choose a tag to compare

This release adds custom branding (white-labeling) support, fixes print preview issues in image mode, and improves handling of cancelled requests.

🛠️ Changes

Custom branding (white-labeling) support

Added new options to MapGroupDocsViewerUI for replacing or hiding the default logo images and injecting custom stylesheets, enabling full white-labeling of the viewer UI.

New methods on Options:

  • SetLogoImage(path) — Replaces the default brand icon (logo-image.svg, rendered at 26x23px) with a custom image file. SVG format is recommended.
  • SetLogoText(path) — Replaces the default brand text (logo-text.svg, rendered at 131x15px) with a custom image file.
  • HideLogoImage() — Hides the brand icon by serving an empty SVG. Use when displaying only the text logo or hiding all logos.
  • HideLogoText() — Hides the brand text by serving an empty SVG. Use when displaying only the icon logo or hiding all logos.

Hide methods take precedence over Set methods if both are called for the same element.

Example — full custom branding:

endpoints.MapGroupDocsViewerUI(options =>
{
    options.UITitle = "Acme Corp Document Viewer";
    options.SetLogoImage("./Logos/logo-image.svg");
    options.SetLogoText("./Logos/logo-text.svg");
    options.AddCustomStylesheet("./Styles/custom-branding.css");
});

Example — icon only, no text:

endpoints.MapGroupDocsViewerUI(options =>
{
    options.SetLogoImage("./Logos/logo-image.svg");
    options.HideLogoText();
});

Brand colors can be overridden via CSS variables in a custom stylesheet (e.g. --c-bg-brand, --c-text-brand). The init-screen logo and "Powered by" links can be hidden via CSS (!important required to override Angular's scoped styles).

A new sample app GroupDocs.Viewer.UI.Sample.CustomBranding demonstrates the complete setup:

custom-logo custom-loader

Fixed print preview issue

Print popup not reopening — After closing the print loader popup, clicking the Print button again did not open the popup. The popup now opens reliably on subsequent clicks.

When a user closes the print loader popup while pages are still being loaded, the UI cancels the in-flight create-pages HTTP request and resets the print state so the print button can be used again.

Graceful handling of cancelled requests

When the UI cancels an in-flight request (e.g. closing the print popup mid-load), Kestrel throws a BadHttpRequestException ("Unexpected end of request content") because the client closed the connection while the request body was still being read. Previously this was logged as an unhandled exception at fail level.

A HandleClientDisconnectAttribute exception filter has been added to ViewerController that intercepts client-disconnection exceptions (OperationCanceledException and BadHttpRequestException) during model binding and action execution, logs them at Information level, and returns HTTP 499 (Client Closed Request).


📦 Packages

All GroupDocs.Viewer.UI packages are available on NuGet:


Thank you for using GroupDocs.Viewer.UI! If you encounter any issues or have suggestions, please don't hesitate to provide feedback here on GitHub or at our Free Support Forum.

8.1.4

13 Feb 08:32

Choose a tag to compare

This release fixes print preview issues in image mode related to the print loader popup.

🛠️ Changes

Fixed print preview issues

Resolved two issues with the print loader popup (the dialog that shows page loading progress when printing):

  1. Popup stuck on loading — When PreloadPages was set to 1, the popup could get stuck at “Loading 2 of N pages” if the user clicked the Print button immediately after a page refresh. The popup now progresses and completes or cancels correctly.

  2. Print popup not reopening — After closing the print loader popup, clicking the Print button again did not open the popup. The popup now opens reliably on subsequent clicks.

Note: These issues were observed in 8.1.3 and may have affected earlier versions.


📦 Packages

All GroupDocs.Viewer.UI packages are available on NuGet:


Thank you for using GroupDocs.Viewer.UI! If you encounter any issues or have suggestions, please don't hesitate to provide feedback here on GitHub or at our Free Support Forum.

8.1.3

11 Feb 18:22

Choose a tag to compare

This release adds extended zoom levels and a help button with keyboard shortcuts, updates GroupDocs.Viewer to version 25.12, fixes print preview and URL generation issues for Azure App Service hosting, and corrects translations.

🛠️ Changes

1️⃣ Extended Zoom Levels

Added support for additional zoom levels in the UI:

  • ZoomLevel.Percent60 (60%)
  • ZoomLevel.Percent70 (70%)
  • ZoomLevel.Percent75 (75%)
  • ZoomLevel.Percent80 (80%)
  • ZoomLevel.Percent90 (90%)
  • ZoomLevel.Percent125 (125%)
  • ZoomLevel.Percent150 (150%)

The complete list of available zoom levels now includes: 25%, 50%, 60%, 70%, 75%, 80%, 90%, 100%, 125%, 150%, 200%, 300%, plus FitWidth and FitHeight.

By default, zoom is not set and is calculated automatically to fit the page and avoid scrolling.

default-zoom-in-8 1 2-and-8 1 3

2️⃣ Added EnableHelp Config Option

The Help button is located on the left side of the language selector in the header. When clicked, it opens a popup modal displaying all available keyboard shortcuts (hotkeys).

To hide this button, set EnableHelp to false:

builder.Services
   .AddGroupDocsViewerUI(config =>
    {
        config.EnableHelp = false;
    });
keyboard-shortcuts-help-popup

3️⃣ GroupDocs.Viewer Updated from 25.9 to 25.12

See release notes for details:

4️⃣ Fixed Print Preview Window

Fixed issues with print preview window when preload pages >= number of pages in a file being loaded, or preload pages = 1, or when the network is slow.

5️⃣ Fixed URL Generation for Azure App Service

Fixed issue with inconsistent URL generation for pages and resources. The backend now generates relative URLs by default, which resolve correctly regardless of the hosting domain. This fixes issues with Azure App Service and custom domain setups where absolute URLs could become inconsistent.

Configuration options:

Option Default Description
ApiPath "/viewer-api" The API endpoint path. Only used when UseAbsoluteUrls is true.
ApiDomain (inferred from request) The base domain including protocol (e.g., "https://api.example.com"). Only used when UseAbsoluteUrls is true. If not set, inferred from the current HTTP context.
UseAbsoluteUrls false When false, generates relative URLs (e.g., /get-page?file=doc.docx&page=1). When true, generates absolute URLs using ApiDomain and ApiPath (e.g., https://api.example.com/viewer-api/get-page?file=doc.docx&page=1).

For most deployments, the default configuration (relative URLs) works without any changes. Set UseAbsoluteUrls to true only for cross-domain scenarios, CDN integration, or when the API is hosted on a different domain:

app
    .UseRouting()
    .UseEndpoints(endpoints =>
    {
        endpoints.MapGroupDocsViewerApi(options =>
        {
            options.ApiDomain = "https://api.example.com";
            options.ApiPath = "/viewer-api";
            options.UseAbsoluteUrls = true;
        });
    });

A sample project demonstrating how to use GroupDocs.Viewer.UI with Azure App Service and custom domains is available at samples/GroupDocs.Viewer.UI.Sample.AzureCustomDomain.

6️⃣ Fixed German Translation

Fixed incorrect German translation for the "Present" button. Changed "Gegenwärtig" to "Präsentieren" (see #77).

Also, all the translations were revisited and updated to be more accurate and consistent.


📦 Packages

All GroupDocs.Viewer.UI packages are available on NuGet:


Thank you for using GroupDocs.Viewer.UI! If you encounter any issues or have suggestions, please don't hesitate to provide feedback here on GitHub or at our Free Support Forum.

8.1.2

17 Nov 14:49

Choose a tag to compare

Release notes

This release fixes printing in image mode, adds new option to control UI behavior when scrolling pages, improves performance when rendering to images and makes UI more portable by using own fonts instead of loading fonts from web.

🛠️ Changes

1️⃣ Fixed Printing in Image Mode

Several issues related to printing in image mode were reported on our Free Support Forum in this topic and have been fixed in this release.

Issue 1: Broken print functionality — open a file, select different pages, and click Print — nothing happens.
Issue 2: Page numbers in the print dialog no longer updated as before.

Both issues are now resolved.
The following image shows the printing process:

print-png-or-jpeg

2️⃣ Added Option to Disable Page Scroll Animation

By default, there is a scroll animation when changing pages, as shown below:

scroll-animation-enabled

To disable the animation and instantly navigate to a page, set EnableScrollAnimation to false:

builder.Services
   .AddGroupDocsViewerUI(config =>
   {
       config.EnableScrollAnimation = false;
   });

When the animation is disabled, page navigation behaves as follows:

scroll-animation-disabled

3️⃣ Turned Off Thumbnail Creation in Image Mode

Thumbnails are only required when rendering to HTML with embedded or external resources.
When rendering to JPG or PNG, the actual page image is now used as a thumbnail to improve performance.

4️⃣ Use Only Local Fonts

The previous version used web fonts instead of local ones, which led to one of the issues reported in #75.

web-fonts-issue

This issue has been fixed by using only local fonts.


Thank you for using GroupDocs.Viewer.UI! If you encounter any issues or have suggestions, please don't hesitate to provide feedback here on GitHub or at our Free Support Forum.

8.1.1

21 Sep 19:31
64a2b16

Choose a tag to compare

Release notes

The latest release of GroupDocs.Viewer.UI includes seven main changes listed below.


🛠️ Changes

1️⃣ Updated Angular UI

The Client App has been updated to the latest version, ensuring a consistent experience between this package and the Free Online Viewer.

With the migration from Angular 16 to Angular 19, the client app now offers faster loading and rendering times.


2️⃣ Disabled Hot Reload in Samples

Most sample applications use a local folder for caching. In these cases, hot reload may mistakenly detect cache changes and refresh the application unexpectedly. To prevent this, hot reload has been disabled in the launch settings.


3️⃣ Added README to NuGet Packages

README files are now included in each NuGet package and will be displayed on their respective NuGet.org pages.


4️⃣ Updated GroupDocs.Viewer

Upgraded GroupDocs.Viewer for .NET to version 25.8.
See the release highlights here: GroupDocs.Viewer for .NET 25.8 – August 2025 Release Highlights.


5️⃣ Fixed custom.css Reference

Fixed the custom.css reference to ensure proper behavior when no custom styles are specified.


6️⃣ Updated Config Class

Added more details to the Config.cs class, which provides options for configuring UI behavior.


7️⃣ Fixed Wrong Page Number Issue

Fixed the issue GroupDocs Viewer 8.0.7 – Wrong page number displayed initially during server delays to return pages, which was reported in the Free Support Forum.


Thank you for using GroupDocs.Viewer.UI! If you encounter any issues or have suggestions, please don't hesitate to provide feedback here on GitHub or at our Free Support Forum.

8.0.7

23 May 12:21
bb44c34

Choose a tag to compare

Release notes

The latest release of GroupDocs.Viewer.UI includes two main changes listed below.


🛠️ Changes

1️⃣ Add Support for PathBase to Self-Hosted API

This issue was reported by one of our users in the Free Support Forum.
The PathBase value was being ignored during the stage when the API endpoint was generated.

For example, when running the app at a specific path—set during app composition in Program.cs:

var builder = WebApplication.CreateBuilder(args);

builder.Services
    .AddControllers()
    .AddGroupDocsViewerSelfHostApi();

var app = builder.Build();

app.UsePathBase("/TenantA");

app
    .UseRouting()
    .UseEndpoints(endpoints =>
    {
        endpoints.MapGroupDocsViewerApi();
    });

app.Run();

The API endpoint was not properly generated because the PathBase value (in this example, /TenantA) was ignored.
This issue has been fixed, and now PathBase is correctly taken into account when specified.


2️⃣ Add README to NuGet Packages

README files are now included in each NuGet package, and will appear on the package's page on NuGet.org.


Thank you for using GroupDocs.Viewer.UI! If you encounter any issues or have suggestions, please don't hesitate to provide feedback here on GitHub or at our Free Support Forum.

8.0.6

05 May 16:36
a625016

Choose a tag to compare

Release notes

The latest release of GroupDocs.Viewer.UI includes six main changes listed below.


🛠️ Changes

1️⃣ Page Number Jumps When Scrolling

This issue occurred in versions of the GroupDocs.Viewer.UI package prior to v8.0.6. When PreloadPages was set to a value greater than zero but less than the total number of pages in a document, the page number indicator would automatically jump to the next page as soon as the next set of pages was loaded during scrolling.

✅ This behavior has been fixed in this release.


2️⃣ Fit Width and Fit Height Strings Now Translated

The strings Fit Width and Fit Height in the zoom selector are now localized according to the selected language.

translate-fit-width-and-fit-height

3️⃣ Use Page Image for Thumbnail in Image Mode

When rendering in image mode (e.g., to PNG or JPG), thumbnails are no longer rendered separately. Instead, the actual page image is used as the thumbnail.

✅ This change improves API performance and reduces resource consumption by eliminating redundant thumbnail rendering.


4️⃣ Updated to GroupDocs.Viewer for .NET 25.4

This version integrates GroupDocs.Viewer for .NET 25.4.
For a full list of improvements and fixes, see the official release notes.


5️⃣ Added Missing Service Registration for GroupDocs.Viewer.UI.Cloud.Api

Resolved a runtime exception caused by a missing service registration when using the GroupDocs.Viewer.UI.Cloud.Api package.

✅ Required services are now properly registered during startup.


6️⃣ Added README Files to GroupDocs.Viewer.UI.* Projects

Added README files with basic descriptions for each project in the solution to improve navigation and clarity for contributors.


Thank you for using GroupDocs.Viewer.UI! If you encounter any issues or have suggestions, please don't hesitate to provide feedback.

8.0.5

23 Apr 15:09

Choose a tag to compare

Release notes

The latest release of GroupDocs.Viewer.UI includes three bug-fixes.


🛠️ Fixes

1️⃣ Print Button Does Not Work

Due to incorrect internal state handling, the Print button was not working in some cases.
This issue can be reproduced with package version 8.0.4 when rendering to image.

2️⃣ Presentation Shows Two Pages on One Slide

This issue occurred in package version 8.0.4 due to a failed attempt to use the Shadow DOM API to enhance presentation rendering in some cases.
It has been resolved in this version.

3️⃣ App Ignores ApiPath and ApiDomain Values

The following values, when set in Program.cs, were ignored by the internal code that generates links to the pages displayed in the UI:

endpoints.MapGroupDocsViewerApi(options =>
{
    options.ApiPath = "/document-viewer-api";
    options.ApiDomain = "https://localhost:5001";
});

This issue has been fixed.
Additionally, the samples GroupDocs.Viewer.UI.SelfHost.Api.App.Sample and GroupDocs.Viewer.UI.SelfHost.Api.Service.Sample were updated to reflect this fix.


Thank you for using GroupDocs.Viewer.UI! If you encounter any issues or have suggestions, please don't hesitate to provide feedback.

8.0.4

22 Apr 19:32
cf355f3

Choose a tag to compare

Release notes

The latest release of GroupDocs.Viewer.UI includes one new feature and one bug fix.


🔧 Features

1️⃣ Added Support for Croatian (HR) Language

By default, the UI uses English as the default language. To change the default language and support only Croatian, use the following code:

builder.Services
    .AddGroupDocsViewerUI(config =>
    {
        config.DefaultLanguage = LanguageCode.Croatian;
        config.SupportedLanguages = new[] 
        {
            LanguageCode.Croatian
        };
    });

To hide the language selector and prevent users from changing the language, use the EnableLanguageSelector option:

builder.Services
    .AddGroupDocsViewerUI(config =>
    {
        config.EnableLanguageSelector = false;
    });

The screenshot below shows the UI with Croatian set as the default language and the language selector hidden:

default-language-to-croatian

🛠️ Fixes

1️⃣ Print Button Does Not Work

This issue occurred in image mode when PreloadPages was set to a value higher than the actual number of pages in the document.

The changes included in this release fix the issue and improve the handling of the Print button.

Note: In image mode, GroupDocs.Viewer.UI prints images. In HTML mode, it prints a PDF file.


Thank you for using GroupDocs.Viewer.UI! If you encounter any issues or have suggestions, please don't hesitate to provide feedback.