DEV Community

IronSoftware
IronSoftware

Posted on

Syncfusion .NET Core Linux Deployment: Fixing libgdiplus, Font, and Docker Issues

When deploying Syncfusion document processing libraries to Linux environments, developers frequently encounter a cascade of initialization failures, missing dependencies, and rendering problems. These issues manifest as cryptic exceptions during runtime, font substitution problems in generated documents, and memory leaks in containerized deployments.

The Problem

Syncfusion's document processing libraries for .NET Core rely on native dependencies that behave differently across operating systems. On Windows, System.Drawing.Common provides graphics functionality through GDI+. On Linux, this same functionality requires libgdiplus, an open-source implementation maintained by the Mono project. Additionally, Syncfusion's PDF Viewer and HTML-to-PDF converter depend on PDFium and the Blink rendering engine respectively, each with their own platform-specific requirements.

The core issues stem from three areas: native library dependencies that must be manually installed on Linux, font availability differences between Windows and Linux environments, and permission constraints in containerized deployments.

Error Messages and Symptoms

Developers report several common exceptions when running Syncfusion document processing on Linux:

System.TypeInitializationException: The type initializer for 'Gdip' threw an exception.
---> System.DllNotFoundException: Unable to load shared library 'gdiplus' or one of its dependencies.
Enter fullscreen mode Exit fullscreen mode
System.TypeInitializationException: The type initializer for 'Syncfusion.EJ2.PdfViewer.PdfiumNative' threw an exception.
---> System.DllNotFoundException: Unable to load shared library 'libpdfium.so' or one of its dependencies.
Enter fullscreen mode Exit fullscreen mode
PdfException: Failed to convert webpage
Enter fullscreen mode Exit fullscreen mode

Font-related issues typically appear as incorrect character rendering, missing glyphs, or complete text substitution in generated documents. These problems often go unnoticed until production deployment because development typically occurs on Windows where required fonts are available.

Who Is Affected

These issues affect developers deploying Syncfusion document processing in:

  • Docker containers running Linux-based images (Debian, Ubuntu, Alpine)
  • Azure App Service Linux and Azure Functions on Linux consumption plans
  • AWS Lambda with .NET Core runtime
  • Linux servers running CentOS, Ubuntu, or other distributions
  • .NET 6+ applications where Microsoft made System.Drawing.Common Windows-only

The problems are particularly acute for organizations migrating from Windows Server to Linux containers for cost reduction, or teams adopting cloud-native architectures that favor Linux-based deployments.

Evidence from the Developer Community

Developer reports span multiple years across Syncfusion forums, GitHub issues, and Stack Overflow questions.

Timeline

Date Event Source
2020-07-15 PDF Viewer unable to load libpdfium.so reported Syncfusion Forums
2021-07-14 DOC to PDF conversion failures in Linux Docker Syncfusion Forums
2022-01-20 .NET 6 upgrade breaks PDF Viewer service Syncfusion Forums
2023-03-15 Alpine Linux musl compatibility issues documented Syncfusion Forums
2024-11-20 Type initializer for PdfiumNative exceptions continue Syncfusion Forums
2025-01-15 Memory not released after disposal reported Syncfusion Forums

Community Reports

"We are seeing the error 'Unable to load shared library libpdfium.so or one of its dependencies' when deploying to our Linux Docker container. Everything works fine on Windows."
— Developer, Syncfusion Forums, 2020

"The type initializer for 'Gdip' threw an exception in renderpdfpages API. We upgraded to .NET 6 and now the PDF Viewer service won't start."
— Developer, Syncfusion Forums, 2022

"Alpine Linux distribution is based on musl libc and differs from other Debian OS. We cannot find and install the exact dependencies of pdfium within Alpine Linux OS."
— Syncfusion Support, Syncfusion Forums, 2023

The Alpine Linux incompatibility is notable: Syncfusion has acknowledged they cannot support Alpine-based containers due to musl libc incompatibility with PDFium.

Root Cause Analysis

The fundamental issue is architectural: Syncfusion's document processing libraries were designed with Windows GDI+ as the primary graphics backend. When porting to .NET Core for cross-platform support, the libraries retained dependencies on System.Drawing.Common, which Microsoft deprecated for Linux in .NET 6.

Three specific architectural decisions create deployment friction:

1. PDFium Runtime Extraction: Syncfusion embeds PDFium binaries and extracts them at runtime to the application directory. If the directory lacks write permissions (common in containerized environments), initialization fails. This design pattern also conflicts with immutable container filesystems.

2. System.Drawing.Common Dependency: For graphics operations, Syncfusion relies on System.Drawing.Common which requires libgdiplus on Linux. The libgdiplus library is a Mono project dependency that is not installed by default on most Linux distributions and must be manually added to Dockerfiles or deployment scripts.

3. Font Discovery: Syncfusion expects fonts to be available at standard system paths. Linux containers typically ship with minimal font sets, causing text rendering failures when Windows-specific fonts (like Arial or Times New Roman) are referenced in documents.

Attempted Workarounds

The Syncfusion documentation and community forums describe several approaches to address these issues.

Workaround 1: Installing libgdiplus and Dependencies

Approach: Add Linux packages to Dockerfile before running the application.

FROM mcr.microsoft.com/dotnet/aspnet:8.0

# Create symbolic links for native library compatibility
RUN ln -s /lib/x86_64-linux-gnu/libdl.so.2 /lib/x86_64-linux-gnu/libdl.so

# Install System.Drawing native dependencies
RUN apt-get update && apt-get install -y --allow-unauthenticated \
    libgdiplus \
    libc6-dev \
    libx11-dev

# Create symbolic link for gdiplus
RUN ln -s libgdiplus.so gdiplus.dll

COPY . /app
WORKDIR /app
ENTRYPOINT ["dotnet", "MyApp.dll"]
Enter fullscreen mode Exit fullscreen mode

Limitations:

  • Increases container image size by 50-100MB
  • libgdiplus is an unmaintained Mono project dependency
  • Does not work on Alpine Linux due to musl libc incompatibility
  • Must be repeated for every container image

Workaround 2: Platform-Specific NuGet Packages

Approach: Use conditional package references to load correct binaries per platform.

<PackageReference Include="Syncfusion.EJ2.PdfViewer.AspNet.Core.Linux"
    Version="24.1.41"
    Condition="$([MSBuild]::IsOsPlatform('Linux'))" />
<PackageReference Include="Syncfusion.EJ2.PdfViewer.AspNet.Core.Windows"
    Version="24.1.41"
    Condition="$([MSBuild]::IsOsPlatform('Windows'))" />
Enter fullscreen mode Exit fullscreen mode

Limitations:

  • Complicates the project file with platform-specific logic
  • Both packages must be kept in sync for version compatibility
  • Does not address the underlying dependency issues

Workaround 3: Manual PDFium Path Configuration

Approach: Pre-deploy PDFium binaries and set the ReferencePath property.

PdfRenderer.ReferencePath = "/app/pdfium/";
Enter fullscreen mode Exit fullscreen mode

Limitations:

  • Requires extracting and managing native binaries separately
  • Must ensure correct architecture (x64, ARM64) is deployed
  • Permission issues may still occur depending on the deployment target

Workaround 4: Font Installation and Substitution

Approach: Install Microsoft fonts in the container and configure font substitution.

# Install Microsoft compatible fonts
RUN apt-get install -y ttf-mscorefonts-installer fontconfig

# Or copy custom fonts
COPY ./fonts /usr/share/fonts/custom
RUN fc-cache -f -v
Enter fullscreen mode Exit fullscreen mode

With font substitution in code:

renderer.Settings.EmbedFonts = true;
renderer.Settings.EmbedCompleteFonts = true;
Enter fullscreen mode Exit fullscreen mode

Limitations:

  • Microsoft core fonts package has licensing restrictions
  • Font substitution may produce different layouts than expected
  • Adds significant complexity to deployment pipelines

A Different Approach: IronPDF

When evaluating alternatives for Linux deployment, architecture becomes the deciding factor. Libraries that embed their own rendering engines avoid the dependency management issues that plague System.Drawing.Common-based solutions.

Why IronPDF Handles Linux Differently

IronPDF uses an embedded Chromium rendering engine for HTML-to-PDF conversion and PDF operations. This architecture provides several advantages for Linux deployment:

No libgdiplus Dependency: IronPDF does not use System.Drawing.Common for graphics operations. The rendering engine is self-contained within the NuGet package.

Single Package Deployment: The IronPDF NuGet package contains all required native binaries for Windows, Linux, and macOS. There are no platform-specific packages to manage.

Docker-Ready: The package is designed for containerized deployment. Native binaries are loaded from within the package rather than extracted to disk at runtime.

Alpine Linux Support: Unlike PDFium-based solutions, IronPDF functions on Alpine Linux containers because it does not depend on glibc-specific libraries.

Code Example

using IronPdf;

public class LinuxDocumentService
{
    public byte[] ConvertHtmlToPdf(string htmlContent)
    {
        // IronPDF automatically handles native library loading on Linux
        // No additional configuration required for Docker deployment
        var renderer = new ChromePdfRenderer();

        // Configure rendering options
        renderer.RenderingOptions.MarginTop = 20;
        renderer.RenderingOptions.MarginBottom = 20;

        // Font handling is managed by the embedded Chromium engine
        // System fonts are used when available, with automatic fallback

        var pdf = renderer.RenderHtmlAsPdf(htmlContent);
        return pdf.BinaryData;
    }

    public byte[] ConvertUrlToPdf(string url)
    {
        var renderer = new ChromePdfRenderer();

        // URL rendering works identically on Windows and Linux
        var pdf = renderer.RenderUrlAsPdf(url);
        return pdf.BinaryData;
    }
}
Enter fullscreen mode Exit fullscreen mode

A minimal Dockerfile for IronPDF on Linux:

FROM mcr.microsoft.com/dotnet/aspnet:8.0

# Only libfontconfig is needed for font discovery
RUN apt-get update && apt-get install -y libfontconfig1

COPY . /app
WORKDIR /app
ENTRYPOINT ["dotnet", "MyApp.dll"]
Enter fullscreen mode Exit fullscreen mode

Key points about this code:

  • No libgdiplus installation required
  • No PDFium binaries to manage
  • No symbolic link workarounds
  • Works on both Debian-based and Alpine Linux containers

API Reference

For more details on the methods used:

Migration Considerations

Switching document processing libraries requires evaluation of several factors.

Licensing

IronPDF is commercial software with per-developer licensing. A free trial is available for evaluation. Syncfusion uses a per-developer licensing model as well, with a community license available for qualifying individuals and small companies.

API Differences

The primary difference is in the rendering approach. Syncfusion's HtmlToPdfConverter requires the Blink engine binaries and specific command-line arguments for Linux. IronPDF's ChromePdfRenderer handles this internally.

Syncfusion code:

HtmlToPdfConverter converter = new HtmlToPdfConverter(HtmlRenderingEngine.Blink);
BlinkConverterSettings settings = new BlinkConverterSettings();
settings.CommandLineArguments.Add("--no-sandbox");
settings.CommandLineArguments.Add("--disable-setuid-sandbox");
Enter fullscreen mode Exit fullscreen mode

IronPDF equivalent:

var renderer = new ChromePdfRenderer();
// Sandbox settings are managed automatically
Enter fullscreen mode Exit fullscreen mode

What You Gain

  • Single NuGet package for all platforms
  • No native dependency management
  • Alpine Linux compatibility
  • Reduced Dockerfile complexity
  • Consistent behavior between development and production environments

What to Consider

  • Different API surface requiring code changes
  • Commercial licensing costs
  • Learning curve for existing Syncfusion users
  • Testing required to validate output compatibility

Conclusion

Linux deployment issues with Syncfusion document processing stem from architectural dependencies on System.Drawing.Common and platform-specific native libraries. While workarounds exist, they add complexity to deployment pipelines and may not cover all scenarios, particularly Alpine Linux containers. Developers prioritizing Linux-native deployment may find libraries with embedded rendering engines provide a more straightforward path to production.


Written by Jacob Mellor, CTO at Iron Software and original developer of IronPDF.


References

  1. How to create PDF document in Linux Docker using C#{:rel="nofollow"} - Syncfusion KB article on Docker deployment
  2. The type initializer for 'Gdip' threw an exception{:rel="nofollow"} - Forum thread on GDI+ initialization failures
  3. Unable to load shared library libpdfium ALPINE LINUX{:rel="nofollow"} - Discussion of Alpine Linux compatibility issues
  4. PDF Viewer Service died after .NET 6 upgrade{:rel="nofollow"} - Breaking changes in .NET 6
  5. How to use external fonts for HTML to PDF conversion in Linux docker container{:rel="nofollow"} - Font configuration documentation
  6. Converting HTML to PDF using Blink in a Linux docker container fails in Azure App Service{:rel="nofollow"} - Azure deployment issues
  7. Heavy memory leak on PDF creation{:rel="nofollow"} - Memory management issues in Blazor applications
  8. Resolve PDFium initialization error in ASP.NET Core PDF Viewer{:rel="nofollow"} - Official troubleshooting guide

For the latest IronPDF documentation and tutorials, visit ironpdf.com.

Top comments (0)