New to Telerik Document ProcessingStart a free 30-day trial

Creating Accessible PDF Documents

Updated on Sep 8, 2026
Minimum VersionQ3 2025
Related Feature:Accessibility Support

Use RadPdfProcessing of Telerik Document Processing to generate accessible PDF documents. This article shows how to export accessible output by using compliance settings, tagging strategies, and structure trees.

To export accessible output, the document must target PDF/A-1a, PDF/A-2a, PDF/A-3a, or PDF/UA-1 compliance. To achieve this, configure PdfFormatProvider.ExportSettings.ComplianceLevel and PdfFormatProvider.ExportSettings.TaggingStrategy as described in PdfComplianceLevel and Tagged PDF.

RadFixedDocument provides a constructor overload with an autoTag parameter. The AutoTag property is false by default. You can either build the StructureTree yourself or let the library tag elements automatically.

Refer to the PdfProcessing Accessibility Demo. It shows how to create accessible PDF documents programmatically and export files that match the selected compliance level.

In .NET Standard/.NET (Target OS: None) environments, fonts beyond the 14 standard ones require a FontsProvider implementation to be resolved correctly.

Creating Accessible PDF Documents with an Existing Structure Tree

When you already have a StructureTree, export the document with TaggingStrategyType.UseExisting so the existing structure is preserved:

C#

//Required for exporting images in .NET Standard
//Telerik.Documents.ImageUtils.ImagePropertiesResolver defaultImagePropertiesResolver = new Telerik.Documents.ImageUtils.ImagePropertiesResolver();
//Telerik.Documents.Extensibility.FixedExtensibilityManager.ImagePropertiesResolver = defaultImagePropertiesResolver;

RadFixedDocument fixedDocument = new RadFixedDocument(autoTag: false);
fixedDocument.DocumentInfo.Title = "Accessible Document Example";
fixedDocument.ViewerPreferences.ShouldDisplayDocumentTitle = true;

StructureElement documentStructureElement = fixedDocument.StructureTree.ChildElements.AddStructureElement(StructureTagType.Document);
StructureElement sectionStructureElement = documentStructureElement.ChildElements.AddStructureElement(StructureTagType.Section);
StructureElement paragraphStructureElement1 = sectionStructureElement.ChildElements.AddStructureElement("CustomParagraph", StructureTagType.Paragraph);
StructureElement paragraphStructureElement2 = sectionStructureElement.ChildElements.AddStructureElement(StructureTagType.Paragraph);
StructureElement figureStructureElement = sectionStructureElement.ChildElements.AddStructureElement(StructureTagType.Figure);

RadFixedPage fixedPage = fixedDocument.Pages.AddPage();

MarkedContent paragraphContainer1 = fixedPage.Content.AddMarkedContent();
TextFragment textFragment1 = paragraphContainer1.Content.AddTextFragment("Text fragment 1");
textFragment1.Font = FontsRepository.Courier;
textFragment1.Position.Translate(20, 20);

paragraphContainer1.StructureTag = paragraphStructureElement1;
paragraphStructureElement1.AlternateDescription = "Standard Paragraph in English";
paragraphStructureElement1.Language = "EN";
paragraphStructureElement1.ActualText = "Text fragment 1";

MarkedContent paragraphContainer2 = fixedPage.Content.AddMarkedContent();
TextFragment textFragment2 = paragraphContainer2.Content.AddTextFragment("Fragmento de texto 2");
textFragment2.Font = FontsRepository.Courier;
textFragment2.Position.Translate(20, 100);

paragraphContainer2.StructureTag = paragraphStructureElement2;
paragraphStructureElement2.Language = "ES";
paragraphStructureElement2.AlternateDescription = "Custom Paragraph in Spanish";
paragraphStructureElement2.ActualText = "Fragmento de texto 2";

MarkedContent imageContainer1 = fixedPage.Content.AddMarkedContent();
figureStructureElement.Language = "EN";
figureStructureElement.AlternateDescription = "Image of a Telerik Ninja";
figureStructureElement.ActualText = "Telerik Ninja logo";
var img = imageContainer1.Content.AddImage();
img.Position.Translate(100, 200);
img.ImageSource = new Telerik.Documents.Fixed.Model.Resources.ImageSource(
    File.OpenRead(@"ProgressNinjas.png"));
imageContainer1.StructureTag = figureStructureElement;
figureStructureElement.AlternateDescription = "Progress Ninja";

PdfFormatProvider provider = new PdfFormatProvider();
PdfExportSettings settings = new PdfExportSettings();
provider.ExportSettings = settings;

settings.TaggingStrategy = TaggingStrategyType.UseExisting;
settings.ComplianceLevel = PdfComplianceLevel.PdfUA1;
string outputFilePath = "AccessibleDocument.pdf";
File.Delete(outputFilePath);
using (Stream output = File.OpenWrite(outputFilePath))
{
    provider.Export(fixedDocument, output, TimeSpan.FromSeconds(10));
}

Process.Start(new ProcessStartInfo() { FileName = outputFilePath, UseShellExecute = true });
PDF Accessibility Checker toolLogical Structure
RadPdfProcessing Creating Accessible PDF Documents Validate with PDF Accessibility CheckerRadPdfProcessing Creating Accessible PDF Documents Logical Structure of PDF
RadPdfProcessing Creating Accessible PDF Documents Properties

Creating Accessible PDF Documents with Auto-Tagging

The following example adds content to a PDF document and lets RadPdfProcessing build the StructureTree automatically by using TaggingStrategyType.Build:

C#

//Required for exporting images in .NET Standard
//Telerik.Documents.ImageUtils.ImagePropertiesResolver defaultImagePropertiesResolver = new Telerik.Documents.ImageUtils.ImagePropertiesResolver();
//Telerik.Documents.Extensibility.FixedExtensibilityManager.ImagePropertiesResolver = defaultImagePropertiesResolver;

RadFixedDocument fixedDocument = new RadFixedDocument(autoTag: true);
fixedDocument.DocumentInfo.Title = "Accessible Document Example";
fixedDocument.ViewerPreferences.ShouldDisplayDocumentTitle = true;

RadFixedPage fixedPage = fixedDocument.Pages.AddPage();

MarkedContent paragraphContainer1 = fixedPage.Content.AddMarkedContent();
TextFragment textFragment1 = paragraphContainer1.Content.AddTextFragment("Text fragment 1");
textFragment1.Font = FontsRepository.Courier;
textFragment1.Position.Translate(20, 20);

MarkedContent paragraphContainer2 = fixedPage.Content.AddMarkedContent();
TextFragment textFragment2 = paragraphContainer2.Content.AddTextFragment("Fragmento de texto 2");
textFragment2.Font = FontsRepository.Courier;
textFragment2.Position.Translate(20, 100);

MarkedContent imageContainer1 = fixedPage.Content.AddMarkedContent();
var img = imageContainer1.Content.AddImage();
img.Position.Translate(100, 200);
img.ImageSource = new Telerik.Documents.Fixed.Model.Resources.ImageSource(
    File.OpenRead(@"ProgressNinjas.png"));

PdfFormatProvider provider = new PdfFormatProvider();
PdfExportSettings settings = new PdfExportSettings();
provider.ExportSettings = settings;

settings.TaggingStrategy = TaggingStrategyType.Build;
settings.ComplianceLevel = PdfComplianceLevel.PdfUA1;
string outputFilePath = "AccessibleDocumentAuto.pdf";
File.Delete(outputFilePath);
using (Stream output = File.OpenWrite(outputFilePath))
{
    provider.Export(fixedDocument, output, TimeSpan.FromSeconds(10));
}

Process.Start(new ProcessStartInfo() { FileName = outputFilePath, UseShellExecute = true });

See Also