Creating Accessible PDF Documents
| Minimum Version | Q3 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:
//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 tool | Logical Structure |
|---|---|
![]() | ![]() |
![]() |
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:
//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 });


