---
title: "How to Embed Fonts in PDF with C# for Localization"
published_at: "2025-09-02T16:54:28+00:00"
modified_at: "2025-12-08T05:46:53+00:00"
url: "https://www.syncfusion.com/blogs/post/embed-fonts-in-pdf"
excerpt: "Learn how to embed fonts in PDF using C# to ensure consistent typography, support Unicode, and reduce file size with font subsetting and PDF/A conversion."
taxonomy_category:
  - ".NET"
  - "C#"
  - "Document Processing"
  - "File Formats"
  - "PDF"
  - "PDF viewer"
  - "Web Development"
taxonomy_post_tag:
  - "Complex script PDF"
  - "Complex scripts"
  - "Document Processing"
  - "Embed fonts in PDF"
  - "File Formats"
  - "Font subsetting"
  - "Font subsetting PDF"
  - "Multilingual PDF C#"
  - "OpenType font PDF"
  - "OpenType fonts"
  - "PDF"
  - "PDF optimization"
  - "PDF rendering"
  - "PDF/A"
  - "PDF/A conversion"
  - "TrueType font embedding"
  - "TrueType fonts"
  - "Unicode PDF rendering"
---

# How to Embed Fonts in PDF with C# for Localization

[Chinnu Muniyappan](https://www.syncfusion.com/blogs/author/chinnu-muniyappan)

![How to Embed Fonts in PDF with C# for Localization](https://www.syncfusion.com/blogs/wp-content/uploads/2025/09/How-to-Embed-Fonts-in-PDF-with-C-for-Localization.jpg)


**TL;DR:** Embedding fonts in PDFs ensures consistent rendering across devices. This guide shows how to embed standard, TrueType, and OpenType fonts in PDF using C#, handle Unicode and complex scripts, and optimize file size with font subsetting and PDF/A conversion.

When you send a PDF to a client or colleague, you want it to look the same on their device as yours. Without embedded fonts, a PDF viewer might substitute missing fonts, causing your carefully designed invoice or certificate to break. As Adobe explains, embedding fonts ensures the document maintains its intended design and layout. In this tutorial, you’ll learn how to embed standard and custom fonts in PDF documents using the [Syncfusion® .NET PDF Library](https://www.syncfusion.com/document-processing/pdf-framework/net/pdf-library)
. You’ll also see how to handle Unicode and complex scripts, reduce file sizes through font subsetting, and embed fonts in existing documents by converting to PDF/A.

## Why Embed fonts?

A PDF referencing fonts not installed on the viewer’s device can display incorrectly. Embedding fonts solves this problem by storing the font data inside the PDF, which:

- Preserves your document’s typography and layout.
- Maintains corporate branding without relying on external font installations.
- Supports multilingual and complex scripts without substitution.
- Ensures consistency across printers and platforms.

## Types of fonts you can embed

Learn about the various types of fonts you can embed in a PDF document:

- **Standard fonts** (e.g., ** Helvetica**, ** Courier**): Built into PDF viewers; no need to embed.
- **TrueType fonts (TTF):** Widely used; supports Unicode and is easy to embed.
- **OpenType fonts (OTF):** Offers extended typographic features; supports Unicode.
- **Complex script fonts:** Ideal for non-Latin scripts like Arabic, Hindi, and Chinese.

## Embedding strategies

- **Full embedding**: Includes the complete font file within the PDF.
- **Subset embedding**: Includes only the characters used in the document.
- **Base 14 fonts**: Standard fonts that don’t require embedding.


## Setting up a .NET Core project

First, create a console application and add the [Syncfusion.Pdf.Net.core](https://www.nuget.org/packages/Syncfusion.Pdf.Net.Core)
 package from [NuGet.org](https://www.nuget.org/)
.

### 1. Create a new console project

Open your terminal or command prompt and run:

```
dotnet new console –n create-pdf-with-standard-font
```

### 2. Add the Syncfusion® PDF library

Install the Syncfusion® PDF package from [NuGet.org](https://www.nuget.org/)
:

```
dotnet add package Syncfusion.Pdf.Net.Core
```

### 3. Add the imaging package for PDF/A conversion

If you need to convert PDFs to PDF/A format, install the [imaging](https://www.nuget.org/packages/Syncfusion.Pdf.Imaging.Net.Core)
 package:

```
dotnet add package Syncfusion.Pdf.Imaging.Net.Core
```

### 4. Import required namespaces

In your **Program.cs** file, import the following namespaces:

```
using Syncfusion.Pdf;
using Syncfusion.Pdf.Graphics;
using Syncfusion.Drawing;
```

## Embedding fonts

### Standard fonts

Standard Base-14 fonts (e.g., **Helvetica,** ** Times**,** Courier**) are built into most ** PDF viewers**. When you use the Syncfusion® [PdfStandardFont](https://help.syncfusion.com/cr/document-processing/Syncfusion.Pdf.Graphics.PdfStandardFont.html)
 class, these fonts are embedded automatically:

Refer to the following code example to learn how to create a PDF file with standard fonts embedded by default.

```
//Create a new PDF document
using (PdfDocument document = new PdfDocument())
{
    //Add a page to the document
    PdfPage page = document.Pages.Add();
    //Create a font
    PdfStandardFont font = new PdfStandardFont(PdfFontFamily.Helvetica, 18);
    //Draw text on the page
    page.Graphics.DrawString("Hello, World! - This text uses an embedded Helvetica font!", font, PdfBrushes.Black, new PointF(10, 10));
    //Save the document
    document.Save("embed-standard-font.pdf");
}
```

By executing the above code, you will get the generated output document.

**Note:** To view the font details, open the document in Adobe PDF Reader and navigate to **File -> document properties**, or press ** Ctrl + D**.

![Embedded standard fonts in PDF](https://www.syncfusion.com/blogs/wp-content/uploads/2025/09/Embedded-standard-fonts-in-PDF.png)

Embedded standard fonts in PDF

## TrueType fonts (TTF)

To embed a custom **TrueType font**, use the [PdfTrueTypeFont](https://help.syncfusion.com/cr/document-processing/Syncfusion.Pdf.Graphics.PdfTrueTypeFont.html)
 class. The constructor accepts a **Font** or ** Stream** and two boolean parameters: [embed (embed the font data) and subset](https://help.syncfusion.com/cr/document-processing/Syncfusion.Pdf.Graphics.PdfTrueTypeFont.html#Syncfusion_Pdf_Graphics_PdfTrueTypeFont__ctor_System_IO_Stream_System_Single_System_Boolean_System_Boolean_)
. Setting embed to true ensures the font travels with the PDF, and enabling subset reduces file size.

Refer to the following code example to learn how to embed a **TrueType font** in a PDF document using Syncfusion®.

```
PdfDocument document = new PdfDocument();
PdfPage page = document.Pages.Add();
PdfGraphics graphics = page.Graphics;

Font font = new Font("Arial", 12);
PdfTrueTypeFont pdfFont = new PdfTrueTypeFont(font, 12, true, false); // embed = true, subset = false

graphics.DrawString("Hello, world!", pdfFont, PdfBrushes.Black, new PointF(10, 10));

document.Save("TTFEmbedded.pdf");
document.Close(true);
```

After executing the above code, the output PDF will include the **TrueType font**, ensuring consistent text styling regardless of the viewer’s system configuration.

![Embedded TrueType font in a PDF document](https://www.syncfusion.com/blogs/wp-content/uploads/2025/09/Embedded-TrueType-font-in-a-PDF-document-1.png)

Embedded TrueType font in a PDF document

## OpenType fonts (OTF)

**OpenType fonts** often support advanced typographic features and extended character sets. You can embed them similarly by loading the font from a stream:

Refer to the following code example to learn how to embed an **OpenType font** in a PDF document using Syncfusion®.

```
//Text to draw         
string text = "Lorem ipsum...";

//Create a new PDF document
using (PdfDocument document = new PdfDocument())
{
    //Add a page
    PdfPage page = document.Pages.Add();

    //Create font
    using FileStream fontFileStream = new FileStream("../../../../data/NotoSerif-Black.otf", FileMode.Open, FileAccess.Read, FileShare.ReadWrite);
    PdfFont font = new PdfTrueTypeFont(fontFileStream, 14);

    //Get the page client size 
    SizeF clipBounds = page.Graphics.ClientSize;
    //Create rect to draw text
    RectangleF rect = new RectangleF(0, 0, clipBounds.Width, clipBounds.Height);
    //Draw text.
    page.Graphics.DrawString(text, font, PdfBrushes.Black, rect);

    //Save the document to a file
    document.Save("embed-open-type-font-in-pdf.pdf");
    document.Close(true);
}
```

After executing the above code, the resulting PDF will include the embedded OpenType font, ensuring consistent and professional text rendering across all devices

![Embedded OpenType font in a PDF document](https://www.syncfusion.com/blogs/wp-content/uploads/2025/09/Embedded-OpenType-font-in-a-PDF-document.png)

Embedded OpenType font in a PDF document


## Rendering Unicode and complex scripts

For multilingual documents, you need fonts that support the required scripts and, in some cases, special formatting instructions:

### Unicode text

Unicode text allows you to represent characters from virtually any language or symbol set, making it essential for creating multilingual PDF documents. Whether working with accented characters, non-Latin scripts, or special symbols, the **Syncfusion® PDF library** provides full support for Unicode rendering using the **`PdfTrueTypeFont` class**. This ensures that your text appears correctly across all platforms and devices.

Refer to the following code example to learn how to render Unicode text in a PDF.

```
using (PdfDocument document = new PdfDocument())
{
    PdfPage page = document.Pages.Add();
    PdfGraphics graphics = page.Graphics;

    // Create fonts that support Unicode
    PdfTrueTypeFont unicodeFont = new PdfTrueTypeFont(new FileStream("../../../../data/arial.ttf", FileMode.Open), 14);

    // Ensure the font supports a wide range of characters
    PdfSolidBrush brush = new PdfSolidBrush(Color.Black);

    float yPosition = 50;

    // English text
    graphics.DrawString("English: Hello World!", unicodeFont, brush, new PointF(10, yPosition));
    yPosition += 30;

    // Spanish text with accents
    graphics.DrawString("Español: ¡Hola Mundo! Niño, José, María", unicodeFont, brush, new PointF(10, yPosition));
    yPosition += 30;

    // French text with accents
    graphics.DrawString("Français: Bonjour le Monde! Café, Naïve, Façade", unicodeFont, brush, new PointF(10, yPosition));
    yPosition += 30;

    // German text with umlauts
    graphics.DrawString("Deutsch: Hallo Welt! Müller, Größe, Weiß", unicodeFont, brush, new PointF(10, yPosition));
    yPosition += 30;

    // Russian text (Cyrillic)
    graphics.DrawString("Русский: Привет Мир! Москва, Россия", unicodeFont, brush, new PointF(10, yPosition));
    yPosition += 30;

    // Mathematical symbols
    graphics.DrawString("Mathematics: ∑, ∞, α, β, γ, π, Ω, ∆", unicodeFont, brush, new PointF(10, yPosition));

    using (FileStream stream = new FileStream("multilingual-pdf.pdf", FileMode.Create))
    {
        document.Save(stream);
    }
}
```

After executing the above code, the PDF will display the Unicode characters correctly, ensuring accurate multilingual support.

![Rendering Unicode text in PDF](https://www.syncfusion.com/blogs/wp-content/uploads/2025/09/Rendering-unicode-text-in-PDF.png)

Rendering Unicode text in PDF

### Complex script text

Complex scripts, such as **Tamil**, ** Thai**, and ** Arabic**, require advanced handling to ensure correct character shaping and alignment in PDF documents. The ** Syncfusion® PDF Library** supports rendering these scripts using the `PdfTrueTypeFont` class along with `PdfStringFormat`, which offers a ComplexScript option for script shaping and a `TextDirection` option to handle right-to-left (RTL) languages properly.

```
//Create a new PDF document
using (PdfDocument document = new PdfDocument())
{
      //Add a page to the document
    PdfPage page = document.Pages.Add();
 
      //Create string format and enable complex script support
    PdfStringFormat format = new PdfStringFormat() { ComplexScript = true };
 
      //Load a TrueType font for the Thai language    
    PdfTrueTypeFont thaiUnicodeFont = new PdfTrueTypeFont(new FileStream("../../../../data/tahoma.ttf", FileMode.Open), 14);
 
      //Draw the Thai text
    page.Graphics.DrawString("สวัสดีชาวโลก", thaiUnicodeFont, PdfBrushes.Black, new RectangleF(0, 130, 300, 50), format);
 
      //Create a Unicode font for the Indic language
    PdfTrueTypeFont indicUnicodeFont = new PdfTrueTypeFont(new FileStream("../../../../data/NotoSansTamil-Regular.ttf", FileMode.Open), 14);
 
      //Draw the Indic text
    page.Graphics.DrawString("வணக்கம் உலகம்", indicUnicodeFont, PdfBrushes.Black, new RectangleF(0, 180, 300, 50), format);
 
      //Load a Unicode font for the Arabic language
    PdfTrueTypeFont arabicUnicodeFont = new PdfTrueTypeFont(new FileStream("../../../../data/arial.ttf", FileMode.Open), 14);
 
      //Set the text direction for right-to-left languages
    format.TextDirection = PdfTextDirection.RightToLeft;
 
    page.Graphics.DrawString("مرحبا بالعالم", arabicUnicodeFont, PdfBrushes.Black, new RectangleF(0, 230, 300, 50), format);
 
      //Save the document
    document.Save("complex-script-text-in-pdf.pdf");
}
```

### Key Points:

- Choose fonts that include the necessary glyphs.
- Set **ComplexScript = true** for scripts requiring ligatures and shaping (** Thai, Tamil, Hindi**)
- Set **TextDirection = RightToLeft** for right-to-left languages like Arabic
- The chosen font must support the target scripts for proper rendering

By executing the above code, you will get the output document as follows.

![Rendering complex scripts text in PDF](https://www.syncfusion.com/blogs/wp-content/uploads/2025/09/Rendering-complex-scripts-text-in-PDF.png)

Rendering complex script text in PDF

## Optimising file size with font subsetting

Embedding full font files in a PDF can noticeably increase the file size, especially when only a few characters from the font are used. **Font subsetting** addresses this by embedding only the glyphs actually used in the document. The ** Syncfusion® PDF Library** supports automatic font subsetting when using the `PdfTrueTypeFont` class, just set the subset parameter to true.

Refer to the following code example to learn how to subset fonts in a PDF using Syncfusion®.

```
//Load the custom font file
using (FileStream fontStream = new FileStream("../../../../data/arial.ttf", FileMode.Open, FileAccess.Read))
{
    //Create a PDF font using the font stream and enable both embed and subset options.
    PdfFont font = new PdfTrueTypeFont(fontStream, 12, true, true);

    //Create a PDF document
    using (PdfDocument document = new PdfDocument())
    {
        //Add page
        PdfPage page = document.Pages.Add();
        //Draw text using the arial font
        page.Graphics.DrawString("Optimized PDF with subsetted font!", font, PdfBrushes.Black, new PointF(10, 10));
        //Save the document
        document.Save("embed-without-subset-font.pdf");
    }
}
```

The resulting PDF will embed only the glyphs in your strings, significantly reducing file size.

![Subsetting fonts for optimized PDF file size](https://www.syncfusion.com/blogs/wp-content/uploads/2025/09/Subsetting-fonts-for-optimized-PDF-file-size.png)

Subsetting fonts for optimized PDF file size


## Embed fonts in an existing PDF via PDF/A conversion

To ensure all fonts are embedded in an existing PDF, convert it to a PDF/A conformance level. PDF/A is an archival format that requires fonts to be embedded. Syncfusion’s ConvertToPDFA method handles the details.

**Note:** To enable PDF/A conversion, you must install the [Syncfusion.Pdf.Imaging.Net.Core](https://www.nuget.org/packages/Syncfusion.Pdf.Imaging.Net.Core)
 NuGet package. Run the following command in your NuGet Package Manager Console:```
Install-Package Syncfusion.Pdf.Imaging.Net.Core
```

For Linux environments, refer to the [documentation](https://help.syncfusion.com/document-processing/pdf/pdf-library/net/nuget-packages-required)
 for detailed information on the required NuGet packages.

Refer to the following code example to learn how to convert an existing PDF to PDF/A and embed its fonts:

```
//Load the PDF document. 
using (PdfLoadedDocument loadedDocument = new PdfLoadedDocument("../../../../data/input.pdf"))
{

      //Subscribe to the SubstituteFont event to supply the required font.
      loadedDocument.SubstituteFont += LoadedDocument_SubstituteFont;

      //Create a PdfConformance option
      PdfConformanceOptions pdfConformanceOptions = new PdfConformanceOptions
      {
          // Set the conformance level to PDF/A-1B.
          ConformanceLevel = PdfConformanceLevel.Pdf_A1B,
          // Set the option to subset the embedded fonts.
          SubsetFonts = true
      };

      //Convert the PDF document to PDF/A-1B format to embed the fonts.
      loadedDocument.ConvertToPDFA(pdfConformanceOptions);

      //Save the PDF document to file.
      loadedDocument.Save("embed-fonts-in-existing-pdf.pdf");

      //Close the document.
      loadedDocument.Close(true);
}
```

To provide the necessary font during the conversion process, add the following code to the event handler. In this example, the [SkiaSharp](https://www.nuget.org/packages/SkiaSharp/)
 library is used to retrieve the font stream based on the font name obtained from the event.

```
void LoadedDocument_SubstituteFont(object sender, PdfFontEventArgs args)
{
    //Get the font name.
    string fontName = args.FontName.Split(',')[0];

    //Map PdfFontStyle to SKFontStyle
    SKFontStyle sKFontStyle = args.FontStyle switch
    {
        PdfFontStyle.Bold => SKFontStyle.Bold,
        PdfFontStyle.Italic => SKFontStyle.Italic,
        PdfFontStyle.Bold | PdfFontStyle.Italic => SKFontStyle.BoldItalic,
        _ => SKFontStyle.Normal
    };

    using SKTypeface typeface = SKTypeface.FromFamilyName(fontName, sKFontStyle);
    if (typeface == null)
    {
        args.FontStream = null;
        return;
    }

    using SKStreamAsset typeFaceStream = typeface.OpenStream();
    if (typeFaceStream == null || typeFaceStream.Length == 0)
    {
        args.FontStream = null;
        return;
    }

    byte[] fontData = new byte[typeFaceStream.Length];
    int bytesRead = typeFaceStream.Read(fontData, fontData.Length);
    if (bytesRead != fontData.Length)
    {
        args.FontStream = null;
        return;
    }

    //Create a new memory stream from the font data.
    args.FontStream = new MemoryStream(fontData);
}
```

Executing the above code will convert a PDF/A document with embedded fonts, ensuring compliance and consistent display.

![Embedded fonts in an existing PDF via PDFA conversion](https://www.syncfusion.com/blogs/wp-content/uploads/2025/09/Embedded-fonts-in-an-existing-PDF-via-PDFA-conversion-1.png)

Embedded fonts in an existing PDF via PDFA conversion

## Real-world use cases

### Business invoice generation

Create professional invoices with consistent branding by embedding custom fonts using the **Syncfusion® PDF Library**. This ensures that your invoices are polished and uniform across different platforms and devices.

Once you execute the [sample](https://github.com/SyncfusionExamples/embed-font-in-pdf-csharp/blob/master/real-world-use-cases/InvoiceGenerator.cs)
, the output document will be generated as shown below.

![Business invoice document](https://www.syncfusion.com/blogs/wp-content/uploads/2025/09/Business-invoice-document.png)

Business invoice document

### Certificate generation

Design and generate professional certificates with custom fonts to reflect your organization’s branding and style. Using the **Syncfusion® PDF Library**, you can embed custom fonts to ensure consistent typography across devices and platforms, enhancing your certificates’ visual appeal and authenticity.

Once you run the [sample](https://github.com/SyncfusionExamples/embed-font-in-pdf-csharp/blob/master/real-world-use-cases/CertificateGenerator.cs)
, the output certificate will be generated as shown below.

![Professional certificate of completion](https://www.syncfusion.com/blogs/wp-content/uploads/2025/09/Professional-certificate-of-completion.png)

Professional certificate of completion

## Best practices

- Always embed custom fonts when distributing PDFs externally to prevent substitution.
- Use font subsetting for documents where only a fraction of the font’s characters are used.
- Select Unicode fonts that cover all languages you need, and enable complex script shaping when necessary.
- Verify the final PDF using a viewer’s font properties; embedded fonts are typically marked as **Embedded** or ** Embedded Subset**.

## GitHub reference

For details on the implementation, refer to the [GitHub](https://github.com/SyncfusionExamples/embed-font-in-pdf-csharp)
 demo.


## Conclusion

Embedding fonts in PDFs with C# using [Syncfusion’s .NET PDF Library](https://www.syncfusion.com/document-processing/pdf-framework/net-core/pdf-library)
 is straightforward: decide whether you need standard or custom fonts, load the appropriate font files, and set the embed and subset options accordingly. Handling Unicode and complex scripts requires selecting fonts with the right glyph coverage and enabling shaping and text direction flags. For existing PDFs, converting to **PDF/A** embeds fonts automatically and ensures compliance. By following these techniques and best practices, you’ll produce professional, consistent PDFs that render correctly on any device.

Explore Syncfusion’s **.NET PDF Library** today! You can examine our [online examples](https://ej2.syncfusion.com/aspnetcore/pdf/default#/fluent2)
 and [documentation](https://help.syncfusion.com/document-processing/pdf/pdf-library/net/working-with-text)
 for more features and functionalities. Existing Syncfusion® users can download the newest version of Essential Studio® from the [license and download](https://www.syncfusion.com/account)
 page, while new users can start a 30-day [free trial](https://www.syncfusion.com/downloads)
 to experience its full potential.

Our dedicated support team is also available via the [support forum](https://www.syncfusion.com/forums)
, [support portal](https://support.syncfusion.com/)
, or [feedback portal](https://www.syncfusion.com/feedback/)
 for any questions or concerns and is committed to providing prompt and comprehensive assistance.

## Related Blogs

- [Create Fill, and Edit Fillable PDF Forms Using C# – A Complete Guide](https://www.syncfusion.com/blogs/post/create-fill-edit-pdf-forms-using-csharp)
- [Secure Your PDF Documents Like a Pro Using C#](https://www.syncfusion.com/blogs/post/secure-your-pdf-documents-csharp)
- [Step-by-Step Guide to Adding and Removing Watermarks in PDF using C#](https://www.syncfusion.com/blogs/post/add-remove-watermark-pdf-csharp)
- [How to Digitally Sign and Verify PDF Signatures in C#](https://www.syncfusion.com/blogs/post/digitally-sign-and-verify-pdf-signatures-in-csharp)
