Narity Reporterpreview

Guide

Crystal Reports on Linux and Docker.

SAP's .NET runtime for Crystal Reports runs on Windows only. To render .rpt files in a Linux container, use a Java application or a runtime that does not depend on SAP's.

What SAP supports

SAP runtimes and their operating systems
Crystal Reports for Visual Studio (.NET)Windows 10, Windows 11, and Windows Server 2016 to 2025, 64-bit only. Windows Server needs the Desktop Experience. It requires .NET Framework 4.5.2 to 4.8. Source: SAP's supported platforms document, updated May 29, 2026.
Crystal Reports for Eclipse (Java)Run time on Windows, Red Hat Enterprise Linux 7 to 9, and SUSE Linux Enterprise Server 11 to 15, with Java 8, 11, 17, or 21. Design time on Windows only. Source: SAP's supported platforms document, January 2026.
Crystal Server 2025Windows only, according to SAP's BI 2025 product availability matrix.

So a Java application can run Crystal reports on Linux with SAP's runtime. A .NET application cannot. The Crystal Solutions FAQ says that SAP offers "SDKs and runtime for .NET and Java only", and the .NET runtime has no support for .NET Core or later.

Windows containers

We found no SAP document about running the .NET runtime in a container. The supported platforms require Windows Server with the Desktop Experience. Windows Server Core container images do not have it.

An SAP employee wrote in an SAP Community answer (2020) that the runtime "requires the full framework and CR's runtime to be installed using the MSI packages". Community reports describe MSI failures in Server Core images and workarounds that SAP does not document. If you use a Windows container, treat it as an unsupported configuration and test it fully.

Render .rpt files in a Linux Docker image

Narity Reporter is an independent .NET 10 library. It reads .rpt files directly and needs no SAP runtime, no Windows, and no Windows graphics APIs. It runs on Windows, Linux, and macOS.

Start with the C# quickstart. It creates a FirstPdf console application with your SDK package in packages/ and a nuget.config file. Then add this Dockerfile to the project folder:

FROM mcr.microsoft.com/dotnet/sdk:10.0 AS build
WORKDIR /src
COPY . .
RUN dotnet restore --packages ./packages-cache \
 && dotnet publish -c Release -o /app --no-restore

FROM mcr.microsoft.com/dotnet/runtime:10.0
COPY --from=build /app /app
WORKDIR /work
ENTRYPOINT ["dotnet", "/app/FirstPdf.dll"]

Add a .dockerignore file so local build output stays out of the image:

bin/
obj/
packages-cache/
*.pdf

Build the image. Then render a report from the current folder. The PDF appears as out.pdf in the same folder.

docker build -t firstpdf .
docker run --rm -v "$PWD:/work" firstpdf report.rpt

The package from your account includes your licence, so the image does too. Keep the image in a private registry. To supply a licence at run time instead, set the REPORTER_LICENSE environment variable to the licence file path or its contents.

We built and ran this Dockerfile with the .NET 10 images on October 8, 2026. Narity Reporter is in preview. Compare its PDFs with your Crystal output, on the operating system you deploy.

Fonts

Linux images have few fonts. Narity Reporter bundles Liberation Sans and Liberation Serif as fallback fonts, so it renders without any fonts installed in the image. Substitute fonts can change text wrapping and pagination.

For closer output, supply the fonts that your reports use. Put the .ttf or .otf files in a fonts folder, and add this line to the runtime stage of the Dockerfile:

COPY fonts /app/fonts

Register the folder once, before the application renders any report:

ReportFontResolver.RegisterFontDirectory(Path.Combine(AppContext.BaseDirectory, "fonts"));

Use static fonts with TrueType outlines. Font collections, variable fonts, CFF outlines, and web fonts are not supported. Check that each font's licence allows you to copy it into an image and embed it in PDFs.

Globalization

Narity Reporter needs ICU for some legacy code pages and for locale formatting. Do not enable globalization-invariant mode.

The default Debian-based .NET images include ICU. Microsoft's image variants documentation says that Alpine and Ubuntu Chiseled images do not include ICU by default. If you want a smaller image, use their extra variants, which include it.