Jak utworzyć zgodne z Section 508 PDFy w C# z IronPDF

This article was translated from English: Does it need improvement?
Translated
View the article in English

Generowanie plików PDF zgodnych z normami dostępności w języku C# .NET za pomocą IronPDF pozwala tworzyć dokumenty zgodne ze standardem PDF/UA, które od razu spełniają wymagania sekcji 508 i WCAG 2.0 AA. Metoda RenderHtmlAsPdfUA firmy IronPDF automatycznie dodaje do plików PDF generowanych z HTML strukturę treści z tagami, kolejność czytania, obsługę tekstu alternatywnego oraz metadane dotyczące dostępności, umożliwiając programistom .NET tworzenie dokumentów zgodnych z czytnikami ekranu dla agencji rządowych, placówek służby zdrowia oraz wszelkich organizacji realizujących kontrakty federalne.

TL;DR: Przewodnik Quickstart

Ten samouczek obejmuje tworzenie dokumentów zgodnych z sekcją 508 i dostępnych w formacie PDF/UA w języku C# .NET, od generowania struktury tagów po dostępność formularzy i weryfikację zgodności.

  • Dla kogo to jest: programiści .NET realizujący kontrakty rządowe, projekty federalne lub systemy opieki zdrowotnej/edukacyjne, w których dostępność plików PDF jest wymagana prawnie.
  • Co będziesz tworzyć: generowanie plików PDF/UA z HTML, konwersja starszych plików PDF do formatu PDF/UA, oznaczanie języka, struktura oznaczona na podstawie semantycznego HTML, tekst alternatywny dla obrazów, tabele dostępne dla osób niepełnosprawnych, nawigacja za pomocą zakładek oraz oznaczone pola formularzy.
  • Gdzie działa: .NET 10, .NET 8 LTS, .NET Framework 4.6.2+ oraz .NET Standard 2.0.
  • Kiedy stosować to podejście: Gdy pliki PDF muszą przejść audyty zgodności z sekcją 508, walidację PDF/UA (ISO 14289) lub spełnić wymagania WCAG 2.0 poziomu AA.
  • Dłączego ma to znaczenie z technicznego punktu widzenia: Standardowe pliki PDF nie posiadają struktury semantycznej. IronPDF automatycznie tworzy drzewo treści z tagami, potrzebne czytnikom ekranowym, na podstawie poprawnie sformułowanego kodu HTML.

Utwórz dokument PDF/UA zgodny z sekcją 508 za pomocą zaledwie kilku wierszy kodu:

  1. Install IronPDF with NuGet Package Manager

    PM > Install-Package IronPdf
  2. Skopiuj i uruchom ten fragment kodu.

    using IronPdf;
    
    ChromePdfRenderer renderer = new ChromePdfRenderer();
    PdfDocument pdf = renderer.RenderHtmlAsPdfUA("<html lang='en'><body><h1>Accessible PDF</h1></body></html>");
    pdf.SaveAs("accessible-document.pdf");
  3. Wdrożenie do testowania w środowisku produkcyjnym

    Rozpocznij używanie IronPDF w swoim projekcie już dziś z darmową wersją próbną

    arrow pointer

Po zakupie lub zapisaniu się na 30-dniowy okres próbny IronPDF, dodaj swój klucz licencyjny na początku aplikacji.

IronPdf.License.LicenseKey = "KEY";
IronPdf.License.LicenseKey = "KEY";
Imports IronPdf

IronPdf.License.LicenseKey = "KEY"
$vbLabelText   $csharpLabel

Rozpocznij używanie IronPDF w swoim projekcie już dziś dzięki darmowej wersji próbnej.

Pierwszy krok:
green arrow pointer
NuGet Zainstaluj za pomocą NuGet

PM >  Install-Package IronPdf

Sprawdź IronPDF na NuGet dla szybkiej instalacji. Z ponad 10 milionami pobrań, przekształca rozwój PDF z C#. Możesz również pobrać DLL lub instalator Windows.

Spis treści


Czym jest zgodność z sekcją 508 i dłączego ma ona znaczenie w przypadku plików PDF?

Sekcja 508 odnosi się do poprawki z 1998 r. do ustawy o rehabilitacji z 1973 r. Ta federalna ustawa wymaga, aby wszystkie technologie elektroniczne i informatyczne opracowywane, nabywane, utrzymywane lub wykorzystywane przez agencje federalne były dostępne dla osób niepełnosprawnych. Zakres wykracza poza same urzędy państwowe. Wszelkie organizacje otrzymujące fundusze federalne, zawierające umowy z agencjami federalnymi lub świadczące usługi technologiczne na rzecz podmiotów rządowych również muszą przestrzegać tych zasad.

Praktyczne konsekwencje są znaczące. Wykonawca tworzący oprogramowanie dla federalnego programu opieki zdrowotnej nie może po prostu dostarczać raportów w formacie PDF, które wyglądają poprawnie na ekranie. Dokumenty te muszą być czytelne dla czytników ekranu, nawigowalne za pomocą klawiatury oraz ustrukturyzowane w sposób umożliwiający interpretację przez technologie wspomagające. Niespełnienie tych wymagań może skutkować odrzuceniem dostarczonych materiałów, utratą kontraktów i potencjalnymi działaniami prawnymi.

Pliki PDF stwarzają szczególne wyzwania w zakresie dostępności. W przeciwieństwie do stron internetowych w formacie HTML, które przeglądarki renderują przy użyciu wbudowanych funkcji ułatwień dostępu, pliki PDF są samodzielnymi dokumentami, które muszą zawierać własne informacje strukturalne. Plik PDF, który wygląda idealnie, może być całkowicie bezużyteczny dla osoby korzystającej z czytnika ekranu, jeśli nie ma odpowiednich tagów, logicznej kolejności czytania lub tekstu alternatywnego dla obrazów.

Konsekwencje nieprzestrzegania przepisów wykraczają poza ryzyko prawne. Organizacje, które tworzą dokumenty niedostępne, skutecznie wykluczają znaczną część swoich odbiorców. Według Światowej Organizacji Zdrowia około 16% światowej populacji doświadcza jakiejś formy niepełnosprawności. W przypadku usług rządowych i programów finansowanych ze środków federalnych wykluczenie tych osób jest nie tylko złym praktyką, ale także naruszeniem ochrony praw obywatelskich.

Czym są PDF/UA i WCAG oraz jaki mają związek z sekcją 508?

Zrozumienie relacji między różnymi standardami dostępności pomaga wyjaśnić, co programiści faktycznie muszą wdrożyć. W dyskusji na temat dostępnych plików PDF krzyżują się trzy kluczowe standardy: sekcja 508, WCAG i PDF/UA.

Wytyczne dotyczące dostępności treści internetowych, powszechnie znane jako WCAG, zostały opracowane przez World Wide Web Consortium. Niniejsze wytyczne określają zasady, dzięki którym treści cyfrowe stają się dostrzegalne, obsługiwane, zrozumiałe i solidne. Chociaż wytyczne WCAG zostały opracowane przede wszystkim z myślą o treściach internetowych, ich zasady mają również zastosowanie do dokumentów PDF. Zmienione standardy sekcji 508, zaktualizowane w 2017 r., bezpośrednio uwzględniają WCAG 2.0 poziom AA jako techniczny punkt odniesienia dla zgodności. Oznacza to, że spełnienie wymagań WCAG 2.0 AA jest w praktyce równoznaczne ze spełnieniem wymagań sekcji 508 dotyczących dokumentów elektronicznych.

PDF/UA, co oznacza PDF/Universal Accessibility, to norma ISO (ISO 14289) zaprojektowana specjalnie dla dokumentów PDF zapewniających dostępność. Podczas gdy WCAG opisuje, co powinny osiągać treści dostępne dla osób niepełnosprawnych, PDF/UA określa dokładnie, jak pliki PDF muszą być skonstruowane wewnętrznie, aby osiągnąć te cele. Standard określa wymagania dotyczące treści oznaczonych tagami, metadanych, specyfikacji językowej, tekstu alternatywnego oraz dziesiątek innych elementów technicznych.

Potraktuj te standardy jako uzupełniające się warstwy. WCAG określa wyniki w zakresie dostępności, których potrzebują użytkownicy. PDF/UA zapewnia specyfikację techniczną umożliwiającą osiągnięcie tych rezultatów w formacie PDF. Sekcja 508 tworzy mandat prawny wymagający zgodności z WCAG, który z kolei wskazuje PDF/UA jako ścieżkę implementacji dla dokumentów PDF.

Dla programistów praktyczne wnioski są proste. Tworzenie dokumentów zgodnych z PDF/UA spełnia wymagania techniczne zgodności z sekcją 508. IronPDF radzi sobie z większością tych złożonych zadań dzięki wbudowanym funkcjom ułatwień dostępu, co pozwala skupić się na treści, podczas gdy biblioteka zarządza podstawową strukturą pliku PDF.

Jak przekonwertować istniejący PDF do formatu PDF/UA w C#?

Wiele organizacji posiada biblioteki istniejących dokumentów PDF, które zostały utworzone, zanim dostępność stała się priorytetem. Zamiast tworzyć te dokumenty od podstaw, IronPDF pozwala konwertować standardowe pliki PDF do formatu PDF/UA. Ten proces konwersji dodaje niezbędną strukturę tagów i metadane w celu zapewnienia zgodności z technologiami wspomagającymi.

Konwersja wykorzystuje metodę SaveAsPdfUA, która pobiera istniejący obiekt PdfDocument i eksportuje go w formacie PDF/UA. Oto kompletny przykład działania.

Plik wejściowy PDF

W tym przykładzie używamy sample-document.pdf, standardowego pliku PDF bez funkcji ułatwień dostępu, który reprezentuje typowy starszy dokument wymagający konwersji.

Poniższy kod ładuje istniejący plik PDF za pomocą PdfDocument.FromFile(), a następnie wywołuje SaveAsPdfUA() w celu wyeksportowania nowej wersji zgodnej ze standardem PDF/UA-1. IronPDF automatycznie analizuje strukturę dokumentu i dodaje wymagane treści oznaczone tagami, metadane oraz znaczniki dostępności.

:path=/static-assets/pdf/content-code-examples/tutorials/accessible-pdfs-government-compliance/convert-to-pdfua.cs
using IronPdf;
using System;

string inputPath = "document.pdf";
string outputPath = "document-accessible.pdf";

// Load the existing PDF document
PdfDocument pdf = PdfDocument.FromFile(inputPath);

// Export as PDF/UA compliant document
// The method automatically adds required accessibility structure
pdf.SaveAsPdfUA(outputPath);

Console.WriteLine($"Successfully converted {inputPath} to PDF/UA format.");
Imports IronPdf
Imports System

Dim inputPath As String = "document.pdf"
Dim outputPath As String = "document-accessible.pdf"

' Load the existing PDF document
Dim pdf As PdfDocument = PdfDocument.FromFile(inputPath)

' Export as PDF/UA compliant document
' The method automatically adds required accessibility structure
pdf.SaveAsPdfUA(outputPath)

Console.WriteLine($"Successfully converted {inputPath} to PDF/UA format.")
$vbLabelText   $csharpLabel

W przypadku dokumentów, które zostały pierwotnie wyrenderowane z HTML z atrybutem lang, specyfikacja językowa jest zachowana w strukturze PDF/UA. Poniższy przykład pokazuje, w jaki sposób oznaczenia językowe są przenoszone z kodu źródłowego HTML.

Plik wejściowy PDF

W tym przykładzie wykorzystano benefits-summary.pdf, dokument opisujący zalety, który wymaga konwersji pod kątem dostępności przy zachowaniu języka z oryginalnego źródła HTML.

Kod ładuje plik PDF i wywołuje SaveAsPdfUA() w celu jego konwersji. Specyfikacja językowa z oryginalnego atrybutu HTML lang jest zachowana w strukturze PDF/UA, co gwarantuje, że czytniki ekranowe będą stosować prawidłowe zasady wymowy.

:path=/static-assets/pdf/content-code-examples/tutorials/accessible-pdfs-government-compliance/convert-with-language.cs
using IronPdf;
using System;

string inputPath = "document.pdf";
string outputPath = "document-accessible.pdf";

PdfDocument pdf = PdfDocument.FromFile(inputPath);

// Language is specified via the lang attribute in the HTML source.
// The PDF/UA structure preserves the language for screen readers.
pdf.SaveAsPdfUA(outputPath);

Console.WriteLine("Conversion complete with language specification.");
Imports IronPdf
Imports System

Module Program
    Sub Main()
        Dim inputPath As String = "document.pdf"
        Dim outputPath As String = "document-accessible.pdf"

        Dim pdf As PdfDocument = PdfDocument.FromFile(inputPath)

        ' Language is specified via the lang attribute in the HTML source.
        ' The PDF/UA structure preserves the language for screen readers.
        pdf.SaveAsPdfUA(outputPath)

        Console.WriteLine("Conversion complete with language specification.")
    End Sub
End Module
$vbLabelText   $csharpLabel

IronPDF domyślnie generuje pliki PDF/UA-1, co jest powszechnie przyjętą wersją standardu. Proces konwersji analizuje istniejącą strukturę pliku PDF i dodaje odpowiednie tagi dla nagłówków, akapitów, list i innych elementów treści. Chociaż automatyczna konwersja sprawdza się w przypadku wielu dokumentów, złożone układy lub zeskanowane obrazy mogą wymagać dodatkowej ręcznej interwencji w celu osiągnięcia pełnej zgodności.

Jak mogę renderować HTML bezpośrednio do dostępnego dokumentu PDF/UA?

Konwersja istniejących plików PDF rozwiązuje problem starszych treści, ale nowe dokumenty zyskują na tym, że są tworzone z myślą o dostępności od samego początku. Metoda RenderHtmlAsPdfUA firmy IronPDF generuje wynik zgodny ze standardami bezpośrednio na podstawie danych wejściowych HTML. Podejście to wykorzystuje strukturę semantyczną już obecną w poprawnie sformułowanym kodzie HTML do tworzenia dobrze zorganizowanych plików PDF.

Poniższy przykład ilustruje renderowanie ciągu znaków HTML do dostępnego pliku PDF.

Kod tworzy instancję ChromePdfRenderer i wywołuje RenderHtmlAsPdfUA() z ciągiem HTML zawierającym elementy semantyczne, takie jak nagłówki i akapity. Renderer zachowuje strukturę HTML jako tagi PDF, ustawia tytuł dokumentu za pomocą MetaData.Title i zapisuje zgodny wynik. Atrybut lang='en' w elemencie HTML jest przenoszony do pliku PDF w celu wykrywania języka przez czytniki ekranu.

:path=/static-assets/pdf/content-code-examples/tutorials/accessible-pdfs-government-compliance/render-html-to-pdfua.cs
using IronPdf;
using System;

ChromePdfRenderer renderer = new ChromePdfRenderer();

string htmlContent = @"
<!DOCTYPE html>
<html lang='en'>
<head>
    <meta charset='UTF-8'>
    <title>Quarterly Financial Report</title>
    <style>
        body { font-family: Arial, sans-serif; line-height: 1.6; }
        h1 { color: #333; }
        h2 { color: #555; margin-top: 20px; }
        p { margin-bottom: 15px; }
        table { border-collapse: collapse; width: 100%; margin: 20px 0; }
        th, td { border: 1px solid #ddd; padding: 12px; text-align: left; }
        th { background-color: #f4f4f4; }
    </style>
</head>
<body>
    <h1>Q4 2024 Financial Summary</h1>
    <p>This report provides an overview of financial performance for the fourth quarter.</p>

    <h2>Revenue Highlights</h2>
    <p>Total revenue increased by 12% compared to the previous quarter, driven primarily by expansion in the enterprise segment.</p>

    <h2>Expense Analysis</h2>
    <p>Operating expenses remained stable, with a slight reduction in administrative costs offset by increased investment in research and development.</p>
</body>
</html>";

// Render directly to PDF/UA format
PdfDocument pdf = renderer.RenderHtmlAsPdfUA(htmlContent);

// Set additional metadata for accessibility
pdf.MetaData.Title = "Q4 2024 Financial Summary";

pdf.SaveAs("financial-report-accessible.pdf");

Console.WriteLine("Accessible PDF created successfully.");
Imports IronPdf
Imports System

Dim renderer As New ChromePdfRenderer()

Dim htmlContent As String = "
<!DOCTYPE html>
<html lang='en'>
<head>
    <meta charset='UTF-8'>
    <title>Quarterly Financial Report</title>
    <style>
        body { font-family: Arial, sans-serif; line-height: 1.6; }
        h1 { color: #333; }
        h2 { color: #555; margin-top: 20px; }
        p { margin-bottom: 15px; }
        table { border-collapse: collapse; width: 100%; margin: 20px 0; }
        th, td { border: 1px solid #ddd; padding: 12px; text-align: left; }
        th { background-color: #f4f4f4; }
    </style>
</head>
<body>
    <h1>Q4 2024 Financial Summary</h1>
    <p>This report provides an overview of financial performance for the fourth quarter.</p>

    <h2>Revenue Highlights</h2>
    <p>Total revenue increased by 12% compared to the previous quarter, driven primarily by expansion in the enterprise segment.</p>

    <h2>Expense Analysis</h2>
    <p>Operating expenses remained stable, with a slight reduction in administrative costs offset by increased investment in research and development.</p>
</body>
</html>"

' Render directly to PDF/UA format
Dim pdf As PdfDocument = renderer.RenderHtmlAsPdfUA(htmlContent)

' Set additional metadata for accessibility
pdf.MetaData.Title = "Q4 2024 Financial Summary"

pdf.SaveAs("financial-report-accessible.pdf")

Console.WriteLine("Accessible PDF created successfully.")
$vbLabelText   $csharpLabel

Wynik w formacie PDF

Powyższy kod generuje semantycznie ustrukturyzowany dokument PDF/UA:

Należy zwrócić uwagę, że kod HTML zawiera atrybut lang w elemencie html. Ten atrybut jest przenoszony do pliku PDF i pomaga czytnikom ekranowym zidentyfikować język dokumentu. Elementy semantycznego HTML, takie jak h1, h2 i p, są bezpośrednio przekształcane na odpowiednie tagi PDF, tworząc logiczną strukturę dokumentu, po której mogą poruszać się technologie wspomagające.

Do renderowania plików HTML lub adresów URL zamiast ciągów znaków IronPDF udostępnia odpowiednie metody.

Poniższy kod przedstawia dwa podejścia: RenderHtmlFileAsPdf() ładuje kod HTML z lokalnej ścieżki pliku, natomiast RenderUrlAsPdf() pobiera i renderuje zawartość z adresu URL. Obie metody generują standardowe pliki PDF, które są następnie konwertowane do formatu PDF/UA przy użyciu SaveAsPdfUA(). To dwuetapowe podejście sprawdza się dobrze, gdy przed konwersją na format dostępny dla osób niepełnosprawnych konieczne jest zastosowanie dodatkowego przetwarzania.

:path=/static-assets/pdf/content-code-examples/tutorials/accessible-pdfs-government-compliance/render-from-file-url.cs
using IronPdf;

ChromePdfRenderer renderer = new ChromePdfRenderer();

// Render from an HTML file on disk
PdfDocument pdfFromFile = renderer.RenderHtmlFileAsPdf("report.html");

// Convert the rendered PDF to PDF/UA format
pdfFromFile.SaveAsPdfUA("report-accessible.pdf");

// Render from a web URL
PdfDocument pdfFromUrl = renderer.RenderUrlAsPdf("https://example.com");

// Convert to accessible format
pdfFromUrl.SaveAsPdfUA("webpage-accessible.pdf");
Imports IronPdf

Dim renderer As New ChromePdfRenderer()

' Render from an HTML file on disk
Dim pdfFromFile As PdfDocument = renderer.RenderHtmlFileAsPdf("report.html")

' Convert the rendered PDF to PDF/UA format
pdfFromFile.SaveAsPdfUA("report-accessible.pdf")

' Render from a web URL
Dim pdfFromUrl As PdfDocument = renderer.RenderUrlAsPdf("https://example.com")

' Convert to accessible format
pdfFromUrl.SaveAsPdfUA("webpage-accessible.pdf")
$vbLabelText   $csharpLabel

Jak ustawić metadane dokumentu, aby zapewnić zgodność z wymogąmi dostępności?

Metadane plików PDF służą wielu celom w zakresie dostępności. Technologie wspomagające odczytują właściwości dokumentu, takie jak tytuł i autor, aby pomóc użytkownikom zidentyfikować, co właśnie czytają. Wyszukiwarki i systemy zarządzania dokumentami wykorzystują metadane do indeksowania i wyszukiwania. Narzędzia do sprawdzania zgodności sprawdzają, czy wymagane pola metadanych są wypełnione.

IronPDF udostępnia metadane poprzez właściwość MetaData obiektów PdfDocument. Następujące właściwości mają największe znaczenie dla dostępności.

Plik wejściowy PDF

W tym przykładzie wykorzystano enrollment-guide-draft.pdf, czyli projekt przewodnika dotyczącego rejestracji w programie świadczeń, który wymaga kompleksowych metadanych w celu zapewnienia zgodności z wymogami dostępności oraz zarządzania dokumentami.

Kod ładuje istniejący plik PDF i konfiguruje wszystkie kluczowe właściwości metadanych: Title (ogłaszane przez czytniki ekranu), Author (identyfikuje źródło), Subject (krótki opis), Keywords (dla możliwości wyszukiwania), Creator (aplikacja źródłowa) oraz znaczniki daty. Na koniec SaveAsPdfUA() eksportuje dokument wraz z metadanymi i strukturą dostępności PDF/UA.

:path=/static-assets/pdf/content-code-examples/tutorials/accessible-pdfs-government-compliance/set-metadata.cs
using IronPdf;
using System;

PdfDocument pdf = PdfDocument.FromFile("document.pdf");

// Set the document title - critical for accessibility
// Screen readers announce this when opening the document
pdf.MetaData.Title = "Employee Benefits Enrollment Guide 2024";

// Author information helps identify document source
pdf.MetaData.Author = "Human Resources Department";

// Subject provides a brief description
pdf.MetaData.Subject = "Guide to selecting and enrolling in employee benefit programs";

// Keywords improve searchability
pdf.MetaData.Keywords = "benefits, enrollment, health insurance, retirement, HR";

// Creator identifies the originating application
pdf.MetaData.Creator = "Benefits Portal v3.2";

// Set document dates
pdf.MetaData.CreationDate = DateTime.Now;
pdf.MetaData.ModifiedDate = DateTime.Now;

// Save as PDF/UA with complete metadata
pdf.SaveAsPdfUA("document-accessible.pdf");

Console.WriteLine("Document metadata configured for accessibility.");
Imports IronPdf
Imports System

Dim pdf As PdfDocument = PdfDocument.FromFile("document.pdf")

' Set the document title - critical for accessibility
' Screen readers announce this when opening the document
pdf.MetaData.Title = "Employee Benefits Enrollment Guide 2024"

' Author information helps identify document source
pdf.MetaData.Author = "Human Resources Department"

' Subject provides a brief description
pdf.MetaData.Subject = "Guide to selecting and enrolling in employee benefit programs"

' Keywords improve searchability
pdf.MetaData.Keywords = "benefits, enrollment, health insurance, retirement, HR"

' Creator identifies the originating application
pdf.MetaData.Creator = "Benefits Portal v3.2"

' Set document dates
pdf.MetaData.CreationDate = DateTime.Now
pdf.MetaData.ModifiedDate = DateTime.Now

' Save as PDF/UA with complete metadata
pdf.SaveAsPdfUA("document-accessible.pdf")

Console.WriteLine("Document metadata configured for accessibility.")
$vbLabelText   $csharpLabel

Na szczególną uwagę zasługuje właściwość Title. Programy do przeglądania plików PDF mogą wyświetlać nazwę pliku lub tytuł dokumentu na pasku tytułu i w zakładkach. Ze względu na dostępność należy wyświetlić tytuł dokumentu, ponieważ zapewnia on istotny kontekst. Tytuł taki jak "Przewodnik po świadczeniach pracowniczych 2024" jest o wiele bardziej przydatny niż nazwa pliku typu "doc_final_v3_revised.PDF".

Podczas tworzenia nowych plików PDF z HTML można ustawić metadane przed zapisaniem.

Kod renderuje HTML bezpośrednio do formatu PDF/UA przy użyciu RenderHtmlAsPdfUA(), a następnie konfiguruje pełny zestaw właściwości metadanych w wynikowym obiekcie PdfDocument przed wywołaniem SaveAs(). Takie podejście łączy strukturę dostępności i metadane w jednym procesie, co idealnie nadaje się do tworzenia nowych dokumentów zgodnych z wymogąmi.

:path=/static-assets/pdf/content-code-examples/tutorials/accessible-pdfs-government-compliance/new-document-metadata.cs
using IronPdf;
using System;

ChromePdfRenderer renderer = new ChromePdfRenderer();

string html = @"
<!DOCTYPE html>
<html lang='en'>
<head><title>Policy Document</title></head>
<body>
    <h1>Information Security Policy</h1>
    <p>This document outlines security requirements for all employees.</p>
</body>
</html>";

PdfDocument pdf = renderer.RenderHtmlAsPdfUA(html);

// Configure comprehensive metadata
pdf.MetaData.Title = "Information Security Policy";
pdf.MetaData.Author = "IT Security Team";
pdf.MetaData.Subject = "Corporate security requirements and guidelines";
pdf.MetaData.Keywords = "security, policy, compliance, data protection";
pdf.MetaData.Creator = "Policy Management System";
pdf.MetaData.CreationDate = DateTime.Now;
pdf.MetaData.ModifiedDate = DateTime.Now;

pdf.SaveAs("security-policy-accessible.pdf");
Imports IronPdf
Imports System

Dim renderer As New ChromePdfRenderer()

Dim html As String = "
<!DOCTYPE html>
<html lang='en'>
<head><title>Policy Document</title></head>
<body>
    <h1>Information Security Policy</h1>
    <p>This document outlines security requirements for all employees.</p>
</body>
</html>"

Dim pdf As PdfDocument = renderer.RenderHtmlAsPdfUA(html)

' Configure comprehensive metadata
pdf.MetaData.Title = "Information Security Policy"
pdf.MetaData.Author = "IT Security Team"
pdf.MetaData.Subject = "Corporate security requirements and guidelines"
pdf.MetaData.Keywords = "security, policy, compliance, data protection"
pdf.MetaData.Creator = "Policy Management System"
pdf.MetaData.CreationDate = DateTime.Now
pdf.MetaData.ModifiedDate = DateTime.Now

pdf.SaveAs("security-policy-accessible.pdf")
$vbLabelText   $csharpLabel

Jak określić język dokumentu dla czytników ekranu?

Specyfikacja językowa jest podstawowym wymogiem dostępności, który ma bezpośredni wpływ na sposób odtwarzania treści. Gdy technologia wspomagająca napotyka tekst, wykorzystuje określony język do wyboru odpowiednich reguł wymowy, głosu i wzorców czytania. Dokument bez specyfikacji językowej zmusza oprogramowanie do zgadywania, co często skutkuje zniekształconym lub niezrozumiałym dźwiękiem.

Aby zapewnić zgodność z PDF/UA, dokument musi zawierać deklarację języka głównego. IronPDF obsługuje to za pomocą atrybutu lang w kodzie źródłowym HTML, który jest zachowywany w pliku wyjściowym PDF/UA.

Kod przedstawia dwa scenariusze językowe. Pierwsza renderuje angielską treść HTML z lang='en' w elemencie html, a druga obsługuje treść hiszpańską z lang='es'. Metoda RenderHtmlAsPdfUA() zachowuje atrybut języka z kodu HTML, a SaveAsPdfUA() zachowuje go w wyniku. Dzięki temu czytniki ekranu będą stosować prawidłowe zasady wymowy dla głównego języka dokumentu.

:path=/static-assets/pdf/content-code-examples/tutorials/accessible-pdfs-government-compliance/set-language.cs
using IronPdf;

ChromePdfRenderer renderer = new ChromePdfRenderer();

string htmlContent = @"
<!DOCTYPE html>
<html lang='en'>
<head><title>Annual Report</title></head>
<body>
    <h1>Annual Report 2024</h1>
    <p>This report summarizes organizational activities and financial performance.</p>
</body>
</html>";

PdfDocument pdf = renderer.RenderHtmlAsPdfUA(htmlContent);

// Language is set via lang='en' in the HTML; SaveAsPdfUA preserves it
pdf.SaveAsPdfUA("annual-report.pdf");

string htmlContentEs = @"
<!DOCTYPE html>
<html lang='es'>
<head><title>Informe Anual</title></head>
<body>
    <h1>Informe Anual 2024</h1>
    <p>Este informe resume las actividades organizacionales y el desempeño financiero.</p>
</body>
</html>";

PdfDocument pdfEs = renderer.RenderHtmlAsPdfUA(htmlContentEs);

// Language is set via lang='es' in the HTML; SaveAsPdfUA preserves it
pdfEs.SaveAsPdfUA("informe-anual.pdf");
Imports IronPdf

Dim renderer As New ChromePdfRenderer()

Dim htmlContent As String = "
<!DOCTYPE html>
<html lang='en'>
<head><title>Annual Report</title></head>
<body>
    <h1>Annual Report 2024</h1>
    <p>This report summarizes organizational activities and financial performance.</p>
</body>
</html>"

Dim pdf As PdfDocument = renderer.RenderHtmlAsPdfUA(htmlContent)

' Language is set via lang='en' in the HTML; SaveAsPdfUA preserves it
pdf.SaveAsPdfUA("annual-report.pdf")

Dim htmlContentEs As String = "
<!DOCTYPE html>
<html lang='es'>
<head><title>Informe Anual</title></head>
<body>
    <h1>Informe Anual 2024</h1>
    <p>Este informe resume las actividades organizacionales y el desempeño financiero.</p>
</body>
</html>"

Dim pdfEs As PdfDocument = renderer.RenderHtmlAsPdfUA(htmlContentEs)

' Language is set via lang='es' in the HTML; SaveAsPdfUA preserves it
pdfEs.SaveAsPdfUA("informe-anual.pdf")
$vbLabelText   $csharpLabel

IronPDF obsługuje specyfikację języka poprzez standardowy atrybut HTML lang. Typowe kody języków to en (angielski), es (hiszpański), fr (francuski), de (niemiecki), pt (portugalski), zh (chiński), ja (japoński), ko (koreański) oraz ar (arabski) i wiele innych.

W przypadku dokumentów zawierających wiele języków główny język dokumentu powinien odzwierciedlać dominującą treść. Technologie wspomagające radzą sobie całkiem dobrze z sporadycznymi frazami obcojęzycznymi, ale dokumenty zawierające znaczne ilości treści w wielu językach stanowią bardziej złożone wyzwanie, które może wymagać specjalistycznego podejścia.

Jak utworzyć dostępną strukturę pliku PDF z tagami na podstawie kodu HTML?

Struktura plików PDF z metadanymi stanowi podstawę dostępności. Tagi definiują logiczną organizację treści, odróżniając nagłówki od akapitów, identyfikując listy i pozycje na listach, oznaczając tabele oraz ustalając kolejność czytania. Bez prawidłowego oznaczania technologie wspomagające nie są w stanie przekazać użytkownikom struktury dokumentu.

Najbardziej efektywnym sposobem tworzenia dobrze otagowanych plików PDF za pomocą IronPDF jest rozpoczęcie od semantycznego kodu HTML. Silnik renderujący Chromium zachowuje strukturę HTML podczas konwersji do formatu PDF, przekształcając elementy HTML w odpowiednie tagi PDF. Pisanie dobrego kodu HTML automatycznie zapewnia dobrą strukturę pliku PDF.

Rozważmy poniższy przykład, który ilustruje prawidłowe oznaczenia semantyczne.

Kod tworzy dokument HTML z przejrzystą hierarchią nagłówków (h1 dla tytułu głównego, h2 dla sekcji, h3 dla podsekcji), listami nieuporządkowanymi (li) dla punktów oraz listy uporządkowane (li) dla sekwencji numerowanych. Metoda RenderHtmlAsPdfUA() przekształca te elementy semantyczne w odpowiednie tagi PDF, po których mogą poruszać się technologie wspomagające.

:path=/static-assets/pdf/content-code-examples/tutorials/accessible-pdfs-government-compliance/semantic-structure.cs
using IronPdf;
using System;

ChromePdfRenderer renderer = new ChromePdfRenderer();

string htmlContent = @"
<!DOCTYPE html>
<html lang='en'>
<head>
    <title>Project Proposal</title>
    <style>
        body { font-family: Georgia, serif; line-height: 1.8; max-width: 800px; margin: 0 auto; padding: 20px; }
        h1 { font-size: 28px; border-bottom: 2px solid #333; padding-bottom: 10px; }
        h2 { font-size: 22px; color: #444; margin-top: 30px; }
        h3 { font-size: 18px; color: #666; }
        ul, ol { margin-left: 20px; }
        li { margin-bottom: 8px; }
    </style>
</head>
<body>
    <h1>Website Redesign Proposal</h1>

    <h2>Executive Summary</h2>
    <p>This proposal outlines a comprehensive redesign of the corporate website to improve user experience, accessibility, and conversion rates.</p>

    <h2>Project Objectives</h2>
    <p>The redesign aims to achieve several key goals:</p>
    <ul>
        <li>Improve mobile responsiveness across all device types</li>
        <li>Achieve WCAG 2.1 Level AA compliance for accessibility</li>
        <li>Reduce page load times by 40 percent</li>
        <li>Increase conversion rates through improved user flows</li>
    </ul>

    <h2>Implementation Timeline</h2>
    <p>The project will proceed in three phases:</p>
    <ol>
        <li>Discovery and planning: weeks one through four</li>
        <li>Design and development: weeks five through twelve</li>
        <li>Testing and launch: weeks thirteen through sixteen</li>
    </ol>

    <h3>Phase One Details</h3>
    <p>The discovery phase includes stakeholder interviews, competitive analysis, and technical assessment of the current platform.</p>

    <h3>Phase Two Details</h3>
    <p>Design and development will follow an agile methodology with two-week sprints and regular stakeholder reviews.</p>

    <h2>Budget Considerations</h2>
    <p>The proposed budget covers all aspects of the redesign including design, development, content migration, and quality assurance testing.</p>
</body>
</html>";

PdfDocument pdf = renderer.RenderHtmlAsPdfUA(htmlContent);

pdf.MetaData.Title = "Website Redesign Proposal";
pdf.MetaData.Author = "Digital Strategy Team";

pdf.SaveAs("proposal-accessible.pdf");

Console.WriteLine("Structured document created with proper heading hierarchy.");
Imports IronPdf
Imports System

Dim renderer As New ChromePdfRenderer()

Dim htmlContent As String = "
<!DOCTYPE html>
<html lang='en'>
<head>
    <title>Project Proposal</title>
    <style>
        body { font-family: Georgia, serif; line-height: 1.8; max-width: 800px; margin: 0 auto; padding: 20px; }
        h1 { font-size: 28px; border-bottom: 2px solid #333; padding-bottom: 10px; }
        h2 { font-size: 22px; color: #444; margin-top: 30px; }
        h3 { font-size: 18px; color: #666; }
        ul, ol { margin-left: 20px; }
        li { margin-bottom: 8px; }
    </style>
</head>
<body>
    <h1>Website Redesign Proposal</h1>

    <h2>Executive Summary</h2>
    <p>This proposal outlines a comprehensive redesign of the corporate website to improve user experience, accessibility, and conversion rates.</p>

    <h2>Project Objectives</h2>
    <p>The redesign aims to achieve several key goals:</p>
    <ul>
        <li>Improve mobile responsiveness across all device types</li>
        <li>Achieve WCAG 2.1 Level AA compliance for accessibility</li>
        <li>Reduce page load times by 40 percent</li>
        <li>Increase conversion rates through improved user flows</li>
    </ul>

    <h2>Implementation Timeline</h2>
    <p>The project will proceed in three phases:</p>
    <ol>
        <li>Discovery and planning: weeks one through four</li>
        <li>Design and development: weeks five through twelve</li>
        <li>Testing and launch: weeks thirteen through sixteen</li>
    </ol>

    <h3>Phase One Details</h3>
    <p>The discovery phase includes stakeholder interviews, competitive analysis, and technical assessment of the current platform.</p>

    <h3>Phase Two Details</h3>
    <p>Design and development will follow an agile methodology with two-week sprints and regular stakeholder reviews.</p>

    <h2>Budget Considerations</h2>
    <p>The proposed budget covers all aspects of the redesign including design, development, content migration, and quality assurance testing.</p>
</body>
</html>"

Dim pdf As PdfDocument = renderer.RenderHtmlAsPdfUA(htmlContent)

pdf.MetaData.Title = "Website Redesign Proposal"
pdf.MetaData.Author = "Digital Strategy Team"

pdf.SaveAs("proposal-accessible.pdf")

Console.WriteLine("Structured document created with proper heading hierarchy.")
$vbLabelText   $csharpLabel

Wynik w formacie PDF

W niniejszym pliku PDF zachowano hierarchię nagłówków i strukturę listy ułatwiającą nawigację:

Zwróć uwagę na hierarchię nagłówków w tym przykładzie. Dokument zawiera jeden element h1 dla tytułu głównego, a następnie elementy h2 dla głównych sekcji i elementy h3 dla podsekcji. Ta hierarchia jest niezbędna dla zapewnienia dostępności. Użytkownicy technologii wspomagających często poruszają się po dokumentach, przechodząc między nagłówkami, więc logiczna struktura pozwala im szybko znaleźć potrzebne treści.

Listy są przetwarzane semantycznie przy użyciu ul dla list nieuporządkowanych i ol dla list uporządkowanych. Każdy element li staje się elementem listy oznaczonej w pliku PDF. Technologie wspomagające odczytują listy, wskazując liczbę zawartych w nich elementów, a następnie odczytując każdy element po kolei.

Jak dodać tekst alternatywny do obrazów, aby zapewnić kompatybilność z czytnikami ekranu?

Obrazy stanowią podstawowe wyzwanie w zakresie dostępności. Treści wizualne nie są dostępne dla użytkowników niewidomych lub słabowidzących. Tekst alternatywny, potocznie nazywany alt text, stanowi opis tekstowy, który może zostać odczytany zamiast obrazu.

Podczas generowania plików PDF z HTML atrybut alt elementów img jest przenoszony do pliku PDF jako tekst alternatywny.

Kod tworzy raport sprzedaży zawierający dwa wykresy. Każdy element img zawiera szczegółowy atrybut alt, który opisuje dane wykresu, a nie tylko jego typ. Na przykład tekst alternatywny określa rzeczywiste wyniki sprzedaży i porównania regionalne. Metoda RenderHtmlAsPdfUA() osadza te opisy jako tekst alternatywny w pliku PDF, umożliwiając czytnikom ekranowym przekazanie tych samych informacji, które użytkownicy widzący uzyskują podczas przeglądania wykresów.

:path=/static-assets/pdf/content-code-examples/tutorials/accessible-pdfs-government-compliance/image-accessibility.cs
using IronPdf;
using System;

ChromePdfRenderer renderer = new ChromePdfRenderer();

string htmlContent = @"
<!DOCTYPE html>
<html lang='en'>
<head>
    <title>Sales Performance Report</title>
    <style>
        body { font-family: Arial, sans-serif; padding: 20px; }
        .chart-container { margin: 20px 0; text-align: center; }
        img { max-width: 100%; height: auto; }
        .caption { font-style: italic; color: #666; margin-top: 10px; }
    </style>
</head>
<body>
    <h1>Q3 Sales Performance Report</h1>

    <h2>Regional Sales Comparison</h2>
    <p>The following chart illustrates sales performance across regions for the third quarter.</p>

    <div class='chart-container'>
        <img src='https://example.com/charts/regional-sales-q3.png'
             alt='Bar chart comparing Q3 sales across four regions: Northeast at 2.4 million dollars, Southeast at 1.8 million dollars, Midwest at 2.1 million dollars, and West at 3.2 million dollars. The West region shows the highest performance with a 15 percent increase from Q2.'
             width='600' height='400'>
        <p class='caption'>Figure 1: Regional Sales Comparison Q3 2024</p>
    </div>

    <h2>Monthly Trend Analysis</h2>
    <p>Sales showed consistent growth throughout the quarter with acceleration in September.</p>

    <div class='chart-container'>
        <img src='https://example.com/charts/monthly-trend.png'
             alt='Line graph showing monthly sales from July through September. July sales were 2.1 million dollars, August increased to 2.4 million dollars, and September reached 2.9 million dollars, representing a 38 percent total increase over the quarter.'
             width='600' height='300'>
        <p class='caption'>Figure 2: Monthly Sales Trend Q3 2024</p>
    </div>

    <h2>Key Findings</h2>
    <p>Analysis indicates strong momentum heading into Q4, particularly in the Western region where new product launches drove significant customer acquisition.</p>
</body>
</html>";

PdfDocument pdf = renderer.RenderHtmlAsPdfUA(htmlContent);

pdf.MetaData.Title = "Q3 Sales Performance Report";
pdf.MetaData.Author = "Sales Analytics Team";

pdf.SaveAs("sales-report-accessible.pdf");

Console.WriteLine("Report created with accessible image descriptions.");
Imports IronPdf
Imports System

Dim renderer As New ChromePdfRenderer()

Dim htmlContent As String = "
<!DOCTYPE html>
<html lang='en'>
<head>
    <title>Sales Performance Report</title>
    <style>
        body { font-family: Arial, sans-serif; padding: 20px; }
        .chart-container { margin: 20px 0; text-align: center; }
        img { max-width: 100%; height: auto; }
        .caption { font-style: italic; color: #666; margin-top: 10px; }
    </style>
</head>
<body>
    <h1>Q3 Sales Performance Report</h1>

    <h2>Regional Sales Comparison</h2>
    <p>The following chart illustrates sales performance across regions for the third quarter.</p>

    <div class='chart-container'>
        <img src='https://example.com/charts/regional-sales-q3.png'
             alt='Bar chart comparing Q3 sales across four regions: Northeast at 2.4 million dollars, Southeast at 1.8 million dollars, Midwest at 2.1 million dollars, and West at 3.2 million dollars. The West region shows the highest performance with a 15 percent increase from Q2.'
             width='600' height='400'>
        <p class='caption'>Figure 1: Regional Sales Comparison Q3 2024</p>
    </div>

    <h2>Monthly Trend Analysis</h2>
    <p>Sales showed consistent growth throughout the quarter with acceleration in September.</p>

    <div class='chart-container'>
        <img src='https://example.com/charts/monthly-trend.png'
             alt='Line graph showing monthly sales from July through September. July sales were 2.1 million dollars, August increased to 2.4 million dollars, and September reached 2.9 million dollars, representing a 38 percent total increase over the quarter.'
             width='600' height='300'>
        <p class='caption'>Figure 2: Monthly Sales Trend Q3 2024</p>
    </div>

    <h2>Key Findings</h2>
    <p>Analysis indicates strong momentum heading into Q4, particularly in the Western region where new product launches drove significant customer acquisition.</p>
</body>
</html>"

Dim pdf As PdfDocument = renderer.RenderHtmlAsPdfUA(htmlContent)

pdf.MetaData.Title = "Q3 Sales Performance Report"
pdf.MetaData.Author = "Sales Analytics Team"

pdf.SaveAs("sales-report-accessible.pdf")

Console.WriteLine("Report created with accessible image descriptions.")
$vbLabelText   $csharpLabel

Aby napisać skuteczny tekst alternatywny, trzeba zrozumieć, jakie informacje przekazuje obraz. W przypadku wykresów i diagramów tekst alternatywny powinien opisywać prezentowane dane, a nie tylko stwierdzać, że wykres istnieje. Użycie terminu "wykres słupkowy" nie wnosi żadnych użytecznych informacji. Opis "wykresu słupkowego porównującego sprzedaż w trzecim kwartale w czterech regionach, gdzie region Zachodni prowadzi z wynikiem 3,2 mln dolarów" zapewnia użytkownikom z dysfunkcją wzroku taki sam wgląd w dane, jaki uzyskują użytkownicy widzący, przeglądając wykres.

Obrazy dekoracyjne, które nie służą celom informacyjnym, powinny mieć puste atrybuty alt. To sygnał dla czytników ekranu, że obraz można pominąć:

<img src="decorative-border.png" alt="">
<img src="decorative-border.png" alt="">
HTML

Jak tworzyć tabele dostępne dla osób niepełnosprawnych w dokumentach PDF?

Tabele stanowią złożone wyzwanie pod względem dostępności, ponieważ kodują relacje między danymi w dwóch wymiarach. Użytkownik widzący może wizualnie przeglądać wiersze i kolumny, aby zrozumieć, w jaki sposób komórki odnoszą się do swoich nagłówków. Użytkownicy korzystający z technologii wspomagających potrzebują, aby ta zależność została wyraźnie zdefiniowana poprzez prawidłowe oznaczenia.

HTML zapewnia elementy strukturalne niezbędne do tworzenia tabel dostępnych dla osób niepełnosprawnych. Kluczowe elementy obejmują th dla komórek nagłówkowych, td dla komórek danych oraz atrybuty scope, które wyjaśniają, czy nagłówki odnoszą się do wierszy, czy kolumn.

Kod tworzy tabelę katalogu pracowników z odpowiednim oznaczeniem dostępności. Element caption zapewnia tytuł tabeli odczytywany przed treścią. Komórki nagłówkowe używają th z scope="col", aby wskazać, że odnoszą się do wszystkich komórek w danej kolumnie. Elementy thead i tbody oddzielają sekcje strukturalne. Funkcja RenderHtmlAsPdfUA() programu IronPDF zachowuje te relacje w strukturze pliku PDF, umożliwiając czytnikom ekranowym powiązanie komórek danych z nagłówkami kolumn.

:path=/static-assets/pdf/content-code-examples/tutorials/accessible-pdfs-government-compliance/accessible-table.cs
using IronPdf;
using System;

ChromePdfRenderer renderer = new ChromePdfRenderer();

string htmlContent = @"
<!DOCTYPE html>
<html lang='en'>
<head>
    <title>Employee Directory</title>
    <style>
        body { font-family: Arial, sans-serif; padding: 20px; }
        table { border-collapse: collapse; width: 100%; margin: 20px 0; }
        th, td { border: 1px solid #ccc; padding: 12px; text-align: left; }
        th { background-color: #f0f0f0; font-weight: bold; }
        caption { font-size: 18px; font-weight: bold; margin-bottom: 10px; text-align: left; }
    </style>
</head>
<body>
    <h1>Department Staff Directory</h1>
    <p>Contact information for all department personnel as of January 2024.</p>

    <table>
        <caption>Engineering Department Staff</caption>
        <thead>
            <tr>
                <th scope='col'>Name</th>
                <th scope='col'>Title</th>
                <th scope='col'>Email</th>
                <th scope='col'>Extension</th>
            </tr>
        </thead>
        <tbody>
            <tr>
                <td>Sarah Chen</td>
                <td>Senior Software Engineer</td>
                <td>schen@company.com</td>
                <td>4521</td>
            </tr>
            <tr>
                <td>Marcus Williams</td>
                <td>DevOps Engineer</td>
                <td>mwilliams@company.com</td>
                <td>4522</td>
            </tr>
            <tr>
                <td>Jennifer Park</td>
                <td>QA Lead</td>
                <td>jpark@company.com</td>
                <td>4523</td>
            </tr>
            <tr>
                <td>Robert Gonzalez</td>
                <td>Technical Writer</td>
                <td>rgonzalez@company.com</td>
                <td>4524</td>
            </tr>
        </tbody>
    </table>

    <h2>Contact Guidelines</h2>
    <p>Please use email for non-urgent matters. Phone extensions connect to voicemail outside business hours.</p>
</body>
</html>";

PdfDocument pdf = renderer.RenderHtmlAsPdfUA(htmlContent);

pdf.MetaData.Title = "Department Staff Directory";

pdf.SaveAs("directory-accessible.pdf");

Console.WriteLine("Directory created with accessible table structure.");
Imports IronPdf
Imports System

Dim renderer As New ChromePdfRenderer()

Dim htmlContent As String = "
<!DOCTYPE html>
<html lang='en'>
<head>
    <title>Employee Directory</title>
    <style>
        body { font-family: Arial, sans-serif; padding: 20px; }
        table { border-collapse: collapse; width: 100%; margin: 20px 0; }
        th, td { border: 1px solid #ccc; padding: 12px; text-align: left; }
        th { background-color: #f0f0f0; font-weight: bold; }
        caption { font-size: 18px; font-weight: bold; margin-bottom: 10px; text-align: left; }
    </style>
</head>
<body>
    <h1>Department Staff Directory</h1>
    <p>Contact information for all department personnel as of January 2024.</p>

    <table>
        <caption>Engineering Department Staff</caption>
        <thead>
            <tr>
                <th scope='col'>Name</th>
                <th scope='col'>Title</th>
                <th scope='col'>Email</th>
                <th scope='col'>Extension</th>
            </tr>
        </thead>
        <tbody>
            <tr>
                <td>Sarah Chen</td>
                <td>Senior Software Engineer</td>
                <td>schen@company.com</td>
                <td>4521</td>
            </tr>
            <tr>
                <td>Marcus Williams</td>
                <td>DevOps Engineer</td>
                <td>mwilliams@company.com</td>
                <td>4522</td>
            </tr>
            <tr>
                <td>Jennifer Park</td>
                <td>QA Lead</td>
                <td>jpark@company.com</td>
                <td>4523</td>
            </tr>
            <tr>
                <td>Robert Gonzalez</td>
                <td>Technical Writer</td>
                <td>rgonzalez@company.com</td>
                <td>4524</td>
            </tr>
        </tbody>
    </table>

    <h2>Contact Guidelines</h2>
    <p>Please use email for non-urgent matters. Phone extensions connect to voicemail outside business hours.</p>
</body>
</html>"

Dim pdf As PdfDocument = renderer.RenderHtmlAsPdfUA(htmlContent)

pdf.MetaData.Title = "Department Staff Directory"

pdf.SaveAs("directory-accessible.pdf")

Console.WriteLine("Directory created with accessible table structure.")
$vbLabelText   $csharpLabel

Wynik w formacie PDF

Wynik zawiera poprawnie sformułowaną tabelę z powiązaniami nagłówków:

Atrybut scope w elementach ma kluczowe znaczenie. Ustawienie scope="col" oznacza, że nagłówek dotyczy wszystkich komórek w tej kolumnie. W przypadku tabel, w których pierwsza komórka każdego wiersza służy jako nagłówek wiersza, należy zamiast tego użyć atrybutu scope="row". Złożone tabele zawierające nagłówki zarówno wierszy, jak i kolumn wymagają obu atrybutów.

Element caption zawiera tytuł tabeli, który jest odczytywany przed treścią tabeli. Dzięki temu użytkownicy będą mieli kontekst dotyczący tego, jakie informacje otrzymają.

W przypadku tabel ze scalonymi komórkami lub nieregularną strukturą dodatkowe atrybuty, takie jak nagłówki i identyfikatory, mogą w sposób jednoznaczny powiązać komórki danych z odpowiadającymi im nagłówkami. Jednak z punktu widzenia dostępności preferowane są proste struktury tabel z jednolitymi wierszami i kolumnami.

Jak dodać zakładki i nawigację w celu zapewnienia dostępności dokumentów?

Zakładki stanowią punkty orientacyjne, które pomagają wszystkim użytkownikom poruszać się po długich dokumentach, ale są szczególnie cenne z punktu widzenia dostępności. Użytkownicy, którzy nie mogą przeglądać stron wzrokowo, polegają na zakładkach, aby znaleźć interesujące ich sekcje. Te uporządkowane konspekty umożliwiają przejście bezpośrednio do konkretnych treści.

IronPDF obsługuje programowe tworzenie hierarchicznych struktur zakładek.

Kod renderuje podręcznik pracownika zawierający wiele rozdziałów, a następnie programowo dodaje hierarchię zakładek przy użyciu kolekcji Bookmarks. Zakładki najwyższego poziomu odsyłają do stron początkowych rozdziałów za pomocą AddBookMarkAtEnd() wraz z indeksem stron. Podzakładki dla podsekcji są dodawane poprzez właściwość Children elementu nadrzędnego, tworząc zagnieżdżone drzewo nawigacyjne. Parametr indeksu strony jest liczony od zera, więc strona 0 jest pierwszą stroną.

:path=/static-assets/pdf/content-code-examples/tutorials/accessible-pdfs-government-compliance/bookmarks-navigation.cs
using IronPdf;
using System;

ChromePdfRenderer renderer = new ChromePdfRenderer();

string htmlContent = @"
<!DOCTYPE html>
<html lang='en'>
<head>
    <title>Employee Handbook</title>
    <style>
        body { font-family: Georgia, serif; line-height: 1.8; padding: 40px; }
        h1 { page-break-before: always; }
        h1:first-of-type { page-break-before: avoid; }
        h2 { margin-top: 30px; }
    </style>
</head>
<body>
    <h1>Employee Handbook</h1>
    <p>Welcome to our organization. This handbook contains policies and procedures for all employees.</p>

    <h1>Chapter 1: Employment Policies</h1>
    <h2>Equal Opportunity</h2>
    <p>Our organization is committed to providing equal employment opportunities to all applicants and employees.</p>

    <h2>At-Will Employment</h2>
    <p>Employment with the organization is at-will unless otherwise specified in a written agreement.</p>

    <h1>Chapter 2: Compensation and Benefits</h1>
    <h2>Pay Periods</h2>
    <p>Employees are paid on a bi-weekly basis, with pay dates falling on alternating Fridays.</p>

    <h2>Health Insurance</h2>
    <p>Full-time employees are eligible for health insurance coverage beginning the first of the month following hire date.</p>

    <h2>Retirement Plans</h2>
    <p>The organization offers a 401(k) plan with employer matching contributions up to four percent of salary.</p>

    <h1>Chapter 3: Time Off Policies</h1>
    <h2>Vacation</h2>
    <p>Employees accrue vacation time based on length of service, starting at two weeks annually.</p>

    <h2>Sick Leave</h2>
    <p>Employees receive five days of paid sick leave per calendar year.</p>
</body>
</html>";

PdfDocument pdf = renderer.RenderHtmlAsPdfUA(htmlContent);

// Add top-level bookmarks for main sections
var introBookmark = pdf.Bookmarks.AddBookMarkAtEnd("Introduction", 0);

var chapter1Bookmark = pdf.Bookmarks.AddBookMarkAtEnd("Chapter 1: Employment Policies", 1);
chapter1Bookmark.Children.AddBookMarkAtEnd("Equal Opportunity", 1);
chapter1Bookmark.Children.AddBookMarkAtEnd("At-Will Employment", 1);

var chapter2Bookmark = pdf.Bookmarks.AddBookMarkAtEnd("Chapter 2: Compensation and Benefits", 2);
chapter2Bookmark.Children.AddBookMarkAtEnd("Pay Periods", 2);
chapter2Bookmark.Children.AddBookMarkAtEnd("Health Insurance", 2);
chapter2Bookmark.Children.AddBookMarkAtEnd("Retirement Plans", 2);

var chapter3Bookmark = pdf.Bookmarks.AddBookMarkAtEnd("Chapter 3: Time Off Policies", 3);
chapter3Bookmark.Children.AddBookMarkAtEnd("Vacation", 3);
chapter3Bookmark.Children.AddBookMarkAtEnd("Sick Leave", 3);

pdf.MetaData.Title = "Employee Handbook";
pdf.MetaData.Author = "Human Resources";

pdf.SaveAs("handbook-with-bookmarks.pdf");

Console.WriteLine("Handbook created with navigational bookmarks.");
Imports IronPdf
Imports System

Dim renderer As New ChromePdfRenderer()

Dim htmlContent As String = "
<!DOCTYPE html>
<html lang='en'>
<head>
    <title>Employee Handbook</title>
    <style>
        body { font-family: Georgia, serif; line-height: 1.8; padding: 40px; }
        h1 { page-break-before: always; }
        h1:first-of-type { page-break-before: avoid; }
        h2 { margin-top: 30px; }
    </style>
</head>
<body>
    <h1>Employee Handbook</h1>
    <p>Welcome to our organization. This handbook contains policies and procedures for all employees.</p>

    <h1>Chapter 1: Employment Policies</h1>
    <h2>Equal Opportunity</h2>
    <p>Our organization is committed to providing equal employment opportunities to all applicants and employees.</p>

    <h2>At-Will Employment</h2>
    <p>Employment with the organization is at-will unless otherwise specified in a written agreement.</p>

    <h1>Chapter 2: Compensation and Benefits</h1>
    <h2>Pay Periods</h2>
    <p>Employees are paid on a bi-weekly basis, with pay dates falling on alternating Fridays.</p>

    <h2>Health Insurance</h2>
    <p>Full-time employees are eligible for health insurance coverage beginning the first of the month following hire date.</p>

    <h2>Retirement Plans</h2>
    <p>The organization offers a 401(k) plan with employer matching contributions up to four percent of salary.</p>

    <h1>Chapter 3: Time Off Policies</h1>
    <h2>Vacation</h2>
    <p>Employees accrue vacation time based on length of service, starting at two weeks annually.</p>

    <h2>Sick Leave</h2>
    <p>Employees receive five days of paid sick leave per calendar year.</p>
</body>
</html>"

Dim pdf As PdfDocument = renderer.RenderHtmlAsPdfUA(htmlContent)

' Add top-level bookmarks for main sections
Dim introBookmark = pdf.Bookmarks.AddBookMarkAtEnd("Introduction", 0)

Dim chapter1Bookmark = pdf.Bookmarks.AddBookMarkAtEnd("Chapter 1: Employment Policies", 1)
chapter1Bookmark.Children.AddBookMarkAtEnd("Equal Opportunity", 1)
chapter1Bookmark.Children.AddBookMarkAtEnd("At-Will Employment", 1)

Dim chapter2Bookmark = pdf.Bookmarks.AddBookMarkAtEnd("Chapter 2: Compensation and Benefits", 2)
chapter2Bookmark.Children.AddBookMarkAtEnd("Pay Periods", 2)
chapter2Bookmark.Children.AddBookMarkAtEnd("Health Insurance", 2)
chapter2Bookmark.Children.AddBookMarkAtEnd("Retirement Plans", 2)

Dim chapter3Bookmark = pdf.Bookmarks.AddBookMarkAtEnd("Chapter 3: Time Off Policies", 3)
chapter3Bookmark.Children.AddBookMarkAtEnd("Vacation", 3)
chapter3Bookmark.Children.AddBookMarkAtEnd("Sick Leave", 3)

pdf.MetaData.Title = "Employee Handbook"
pdf.MetaData.Author = "Human Resources"

pdf.SaveAs("handbook-with-bookmarks.pdf")

Console.WriteLine("Handbook created with navigational bookmarks.")
$vbLabelText   $csharpLabel

Wynik w formacie PDF

Wygenerowany plik PDF zawiera panel zakładek z nawigacją, umożliwiający szybki dostęp do poszczególnych sekcji:

Parametr indeksu strony w AddBookMarkAtEnd wykorzystuje indeksowanie od zera, gdzie strona 0 jest pierwszą stroną dokumentu. Zagnieżdżone zakładki utworzone za pomocą właściwości Children tworzą hierarchię odzwierciedlającą strukturę dokumentu.

W przypadku dokumentów HTML o prawidłowej strukturze nagłówków IronPDF może automatycznie wygenerować spis treści zawierający linki nawigacyjne.

Kod umożliwia automatyczne generowanie spisu treści poprzez ustawienie RenderingOptions.TableOfContents na TableOfContentsTypes.WithPageNumbers. Kod HTML zawiera symbol zastępczy div oraz id="ironpdf-toc", w których zostanie wstawiony wygenerowany spis treści. IronPDF skanuje elementy nagłówków (h1, h2 itp.), tworzy hierarchiczny spis treści z numerami stron i wstawia go w miejsce oznaczone symbolem zastępczym.

:path=/static-assets/pdf/content-code-examples/tutorials/accessible-pdfs-government-compliance/table-of-contents.cs
using IronPdf;

ChromePdfRenderer renderer = new ChromePdfRenderer();

// Enable automatic table of contents generation
renderer.RenderingOptions.TableOfContents = TableOfContentsTypes.WithPageNumbers;

string htmlContent = @"
<!DOCTYPE html>
<html lang='en'>
<head><title>Technical Manual</title></head>
<body>
    <div id='ironpdf-toc'></div>

    <h1>System Administration Guide</h1>
    <p>Comprehensive guide to system configuration and maintenance.</p>

    <h2>Installation</h2>
    <p>Step-by-step installation procedures for all supported platforms.</p>

    <h2>Configuration</h2>
    <p>Detailed configuration options and recommended settings.</p>

    <h2>Troubleshooting</h2>
    <p>Common issues and their resolutions.</p>
</body>
</html>";

PdfDocument pdf = renderer.RenderHtmlAsPdfUA(htmlContent);

pdf.MetaData.Title = "System Administration Guide";

pdf.SaveAs("manual-with-toc.pdf");
Imports IronPdf

Dim renderer As New ChromePdfRenderer()

' Enable automatic table of contents generation
renderer.RenderingOptions.TableOfContents = TableOfContentsTypes.WithPageNumbers

Dim htmlContent As String = "
<!DOCTYPE html>
<html lang='en'>
<head><title>Technical Manual</title></head>
<body>
    <div id='ironpdf-toc'></div>

    <h1>System Administration Guide</h1>
    <p>Comprehensive guide to system configuration and maintenance.</p>

    <h2>Installation</h2>
    <p>Step-by-step installation procedures for all supported platforms.</p>

    <h2>Configuration</h2>
    <p>Detailed configuration options and recommended settings.</p>

    <h2>Troubleshooting</h2>
    <p>Common issues and their resolutions.</p>
</body>
</html>"

Dim pdf As PdfDocument = renderer.RenderHtmlAsPdfUA(htmlContent)

pdf.MetaData.Title = "System Administration Guide"

pdf.SaveAs("manual-with-toc.pdf")
$vbLabelText   $csharpLabel

Element div o identyfikatorze id="ironpdf-toc" oznacza miejsce, w którym pojawi się wygenerowany spis treści. IronPDF tworzy spis treści na podstawie elementów nagłówkowych, tworząc klikalne linki, które przenoszą do poszczególnych sekcji.

Jak utworzyć dostępne formularze PDF z odpowiednimi etykietami?

Formularze interaktywne wymagają szczególnej uwagi pod kątem dostępności. Każde pole wprowadzania danych musi mieć programowo powiązaną etykietę, aby można było ogłosić oczekiwane dane wejściowe. Same etykiety wizualne są niewystarczające, ponieważ brakuje im podstawowego powiązania, którego technologie wspomagające potrzebują do prawidłowej interpretacji formularza.

IronPDF renderuje elementy formularzy HTML jako interaktywne pola formularzy PDF. Prawidłowe oznaczenia formularzy HTML przekładają się na dostępne formularze PDF.

Kod umożliwia tworzenie pól formularza poprzez ustawienie RenderingOptions.CreatePdfFormsFromHtml = true. Formularz HTML wykorzystuje odpowiednie wzorce dostępności: każde pole wprowadzania danych ma unikalny atrybut id, który odpowiada atrybutowi for jego etykiety, przyciski opcji są zgrupowane w fieldset z opisowym legend, a pola wyboru mają przypisane etykiety. Metoda RenderHtmlAsPdfUA() przekształca te elementy w interaktywne pola formularza PDF z zachowaniem powiązań etykiet dla czytników ekranu.

:path=/static-assets/pdf/content-code-examples/tutorials/accessible-pdfs-government-compliance/accessible-form.cs
using IronPdf;
using System;

ChromePdfRenderer renderer = new ChromePdfRenderer();

// Enable form field creation from HTML forms
renderer.RenderingOptions.CreatePdfFormsFromHtml = true;

string htmlContent = @"
<!DOCTYPE html>
<html lang='en'>
<head>
    <title>Contact Request Form</title>
    <style>
        body { font-family: Arial, sans-serif; padding: 30px; max-width: 600px; }
        .form-group { margin-bottom: 20px; }
        label { display: block; margin-bottom: 5px; font-weight: bold; }
        input[type='text'], input[type='email'], textarea {
            width: 100%; padding: 10px; border: 1px solid #ccc; border-radius: 4px;
        }
        textarea { height: 120px; resize: vertical; }
        .checkbox-group { margin: 15px 0; }
        .checkbox-group label { display: inline; font-weight: normal; margin-left: 8px; }
        fieldset { border: 1px solid #ddd; padding: 15px; margin-bottom: 20px; }
        legend { font-weight: bold; padding: 0 10px; }
    </style>
</head>
<body>
    <h1>Contact Request Form</h1>
    <p>Please complete all required fields marked with an asterisk.</p>

    <form>
        <div class='form-group'>
            <label for='fullname'>Full Name *</label>
            <input type='text' id='fullname' name='fullname' required>
        </div>

        <div class='form-group'>
            <label for='email'>Email Address *</label>
            <input type='email' id='email' name='email' required>
        </div>

        <div class='form-group'>
            <label for='phone'>Phone Number</label>
            <input type='text' id='phone' name='phone'>
        </div>

        <fieldset>
            <legend>Preferred Contact Method</legend>
            <div class='checkbox-group'>
                <input type='radio' id='contact-email' name='contact-method' value='email'>
                <label for='contact-email'>Email</label>
            </div>
            <div class='checkbox-group'>
                <input type='radio' id='contact-phone' name='contact-method' value='phone'>
                <label for='contact-phone'>Phone</label>
            </div>
        </fieldset>

        <div class='form-group'>
            <label for='message'>Message *</label>
            <textarea id='message' name='message' required></textarea>
        </div>

        <div class='checkbox-group'>
            <input type='checkbox' id='newsletter' name='newsletter'>
            <label for='newsletter'>Subscribe to our newsletter</label>
        </div>
    </form>
</body>
</html>";

PdfDocument pdf = renderer.RenderHtmlAsPdfUA(htmlContent);

pdf.MetaData.Title = "Contact Request Form";

pdf.SaveAs("contact-form-accessible.pdf");

Console.WriteLine("Accessible form created with proper field labels.");
Imports IronPdf
Imports System

Dim renderer As New ChromePdfRenderer()

' Enable form field creation from HTML forms
renderer.RenderingOptions.CreatePdfFormsFromHtml = True

Dim htmlContent As String = "
<!DOCTYPE html>
<html lang='en'>
<head>
    <title>Contact Request Form</title>
    <style>
        body { font-family: Arial, sans-serif; padding: 30px; max-width: 600px; }
        .form-group { margin-bottom: 20px; }
        label { display: block; margin-bottom: 5px; font-weight: bold; }
        input[type='text'], input[type='email'], textarea {
            width: 100%; padding: 10px; border: 1px solid #ccc; border-radius: 4px;
        }
        textarea { height: 120px; resize: vertical; }
        .checkbox-group { margin: 15px 0; }
        .checkbox-group label { display: inline; font-weight: normal; margin-left: 8px; }
        fieldset { border: 1px solid #ddd; padding: 15px; margin-bottom: 20px; }
        legend { font-weight: bold; padding: 0 10px; }
    </style>
</head>
<body>
    <h1>Contact Request Form</h1>
    <p>Please complete all required fields marked with an asterisk.</p>

    <form>
        <div class='form-group'>
            <label for='fullname'>Full Name *</label>
            <input type='text' id='fullname' name='fullname' required>
        </div>

        <div class='form-group'>
            <label for='email'>Email Address *</label>
            <input type='email' id='email' name='email' required>
        </div>

        <div class='form-group'>
            <label for='phone'>Phone Number</label>
            <input type='text' id='phone' name='phone'>
        </div>

        <fieldset>
            <legend>Preferred Contact Method</legend>
            <div class='checkbox-group'>
                <input type='radio' id='contact-email' name='contact-method' value='email'>
                <label for='contact-email'>Email</label>
            </div>
            <div class='checkbox-group'>
                <input type='radio' id='contact-phone' name='contact-method' value='phone'>
                <label for='contact-phone'>Phone</label>
            </div>
        </fieldset>

        <div class='form-group'>
            <label for='message'>Message *</label>
            <textarea id='message' name='message' required></textarea>
        </div>

        <div class='checkbox-group'>
            <input type='checkbox' id='newsletter' name='newsletter'>
            <label for='newsletter'>Subscribe to our newsletter</label>
        </div>
    </form>
</body>
</html>"

Dim pdf As PdfDocument = renderer.RenderHtmlAsPdfUA(htmlContent)

pdf.MetaData.Title = "Contact Request Form"

pdf.SaveAs("contact-form-accessible.pdf")

Console.WriteLine("Accessible form created with proper field labels.")
$vbLabelText   $csharpLabel

Wynik w formacie PDF

Wygenerowany PDF zawiera interaktywne pola formularzy z poprawnymi skojarzeniami etykiet:

W tym przykładzie formularza pojawia sie kilka wzorow dostępności. Kazde wejscie ma unikalny atrybut id, ktory pasuje do atrybutu for jego etykiety. To połączenie pozwala oglosic 'Pelne imie i nazwisko, edytuj tekst', gdy użytkownik przeskoczy do tego pola. Przyciski radiowe sa grupowane w polu zestawu z legenda opisujaca cel grupy. Pola wyboru maja etykiety umieszczone po elemencie wejscia, zgodnie z standardowymi konwencjami formularzy.

Aby IronPDF tworzył interaktywne pola formularza zamiast statycznych reprezentacji formularza, należy włączyć opcję renderowania CreatePdfFormsFromHtml.

Jak zweryfikowac zgodność z PDF/UA po wygenerowaniu?

Tworzenie PDF-ow z funkcjami dostępności to tylko część procesu. Weryfikacja potwierdza, czy wygenerowane dokumenty faktycznie spełniają techniczne wymagania standardu PDF/UA. Do tego celu istnieje wiele narzędzi, z veraPDF jako najpowszechniej uznawanym otwartym narzędziem do walidacji.

Chociaż IronPDF nie zawiera wbudowanej walidacji, można zintegrowac walidacje w swoj proces pracy, korzystając z zewnętrznych narzędzi. Walidator veraPDF jest dostępny jako aplikacja wiersza polecen, która można wywolac z kodu C#.

Kod demonstruje kompletny proces walidacji. Najpierw generuje testowy plik PDF przy użyciu RenderHtmlAsPdfUA() z skonfigurowanymi metadanymi. Następnie wywołuje veraPDF z C# za pomocą Process.Start(), konfigurując proces tak, aby działał z flagą --flavour ua1 do walidacji PDF/UA-1. Wynik zostaje zapisany, a kod zakonczenia okresla, czy dokument przeszedl walidacje.

:path=/static-assets/pdf/content-code-examples/tutorials/accessible-pdfs-government-compliance/validation.cs
using IronPdf;
using System;
using System.Diagnostics;

// Create the accessible PDF
ChromePdfRenderer renderer = new ChromePdfRenderer();

string htmlContent = @"
<!DOCTYPE html>
<html lang='en'>
<head><title>Test Document</title></head>
<body>
    <h1>Validation Test</h1>
    <p>This document will be validated for PDF/UA compliance.</p>
</body>
</html>";

PdfDocument pdf = renderer.RenderHtmlAsPdfUA(htmlContent);
pdf.MetaData.Title = "Validation Test Document";

string outputPath = "test-document.pdf";
pdf.SaveAs(outputPath);

Console.WriteLine($"PDF created at: {outputPath}");
Console.WriteLine("Run veraPDF validation with:");
Console.WriteLine($"  verapdf --flavour ua1 {outputPath}");

// Validate using veraPDF
string verapdfPath = "verapdf";
ProcessStartInfo startInfo = new ProcessStartInfo
{
    FileName = verapdfPath,
    Arguments = $"--flavour ua1 \"{outputPath}\"",
    RedirectStandardOutput = true,
    RedirectStandardError = true,
    UseShellExecute = false,
    CreateNoWindow = true
};

using (Process process = Process.Start(startInfo))
{
    string output = process.StandardOutput.ReadToEnd();
    process.WaitForExit();

    // veraPDF returns 0 for valid documents
    bool isValid = process.ExitCode == 0;

    Console.WriteLine(isValid ? "Document passes PDF/UA validation." : "Document has validation issues.");
    Console.WriteLine(output);
}
Imports IronPdf
Imports System
Imports System.Diagnostics

' Create the accessible PDF
Dim renderer As New ChromePdfRenderer()

Dim htmlContent As String = "
<!DOCTYPE html>
<html lang='en'>
<head><title>Test Document</title></head>
<body>
    <h1>Validation Test</h1>
    <p>This document will be validated for PDF/UA compliance.</p>
</body>
</html>"

Dim pdf As PdfDocument = renderer.RenderHtmlAsPdfUA(htmlContent)
pdf.MetaData.Title = "Validation Test Document"

Dim outputPath As String = "test-document.pdf"
pdf.SaveAs(outputPath)

Console.WriteLine($"PDF created at: {outputPath}")
Console.WriteLine("Run veraPDF validation with:")
Console.WriteLine($"  verapdf --flavour ua1 {outputPath}")

' Validate using veraPDF
Dim verapdfPath As String = "verapdf"
Dim startInfo As New ProcessStartInfo With {
    .FileName = verapdfPath,
    .Arguments = $"--flavour ua1 ""{outputPath}""",
    .RedirectStandardOutput = True,
    .RedirectStandardError = True,
    .UseShellExecute = False,
    .CreateNoWindow = True
}

Using process As Process = Process.Start(startInfo)
    Dim output As String = process.StandardOutput.ReadToEnd()
    process.WaitForExit()

    ' veraPDF returns 0 for valid documents
    Dim isValid As Boolean = process.ExitCode = 0

    Console.WriteLine(If(isValid, "Document passes PDF/UA validation.", "Document has validation issues."))
    Console.WriteLine(output)
End Using
$vbLabelText   $csharpLabel

Adobe Acrobat Pro również zawiera funkcje sprawdzania dostępności. Checker do sprawdzania dostępności w Acrobat Pro wykonuje kompleksowe testy, w tym weryfikacje kolejnosci czytania, weryfikacje tekstu alternatywnego oraz dostępności pol formularzy. Mimo, ze nie jest darmowy, Acrobat Pro jest powszechnie dostępny w środowiskach Enterprise i dostarcza szczegółowe raporty na temat problemow z dostępnościa.

Dla zautomatyzowanych potokow testowych narzędzie PAC (PDF Accessibility Checker) od fundacji PDF/UA oferuje kolejne rozwiązanie do walidacji. PAC zapewnia zarowno interfejs graficzny, jak i możliwosci wiersza polecen, co czyni go odpowiednim do integracji w ciaglych potokach integracyjnych.

Jakie sa najlepsze praktyki dla utrzymania dostępnych PDF-ow w aplikacjach Enterprise?

Tworzenie pojedynczych dostępnych dokumentów jest proste, gdy zrozumiesz techniki. Utrzymanie dostępności na duza skale w całym Enterprise wymaga systematycznych podejsc i dyscypliny organizacyjnej.

Standaryzacja szablonow redukuje zmiennosc i zapewnia spojnosc. Tworzenie biblioteki zatwierdzonych szablonow HTML z semantyczna struktura, dostępnymi wzorami formularzy i spójnym stylizowaniem daje deweloperom podstawy do produkcji zgodnych wynikow domyslnie.

Kod demonstruje wzorzec generowania raportow Enterprise. Inicjuje ChromePdfRenderer z włączoną funkcją tworzenia formularzy, a następnie tworzy raport HTML na podstawie zmiennych szablonu, używając HttpUtility.HtmlEncode() do bezpiecznego wstawiania treści. Raport HTML zawiera spojne stylizowanie i semantyczna strukture. Po renderowaniu za pomocą RenderHtmlAsPdfUA() przed zapisaniem konfigurowane są standardowe właściwości metadanych (tytuł, autor, twórca i daty). Ten wzorzec można owinac w usługę wielokrotnego użycia, aby wymusic zgodność z dostępnościa we wszystkich generowanych dokumentach.

:path=/static-assets/pdf/content-code-examples/tutorials/accessible-pdfs-government-compliance/enterprise-service.cs
using IronPdf;
using System;
using System.Web;

ChromePdfRenderer renderer = new ChromePdfRenderer();
renderer.RenderingOptions.CreatePdfFormsFromHtml = true;

string title = "Quarterly Report";
string author = "Finance Team";
string content = "<p>Financial performance overview for Q4 2024.</p>";

// Build report HTML from template
string reportHtml = $@"
<!DOCTYPE html>
<html lang='en'>
<head>
    <meta charset='UTF-8'>
    <title>{HttpUtility.HtmlEncode(title)}</title>
    <style>
        body {{
            font-family: 'Segoe UI', Arial, sans-serif;
            line-height: 1.6;
            max-width: 800px;
            margin: 0 auto;
            padding: 40px;
            color: #333;
        }}
        h1 {{ font-size: 28px; color: #1a1a1a; border-bottom: 2px solid #0066cc; padding-bottom: 10px; }}
        h2 {{ font-size: 22px; color: #333; margin-top: 30px; }}
        p {{ margin-bottom: 15px; }}
        table {{ border-collapse: collapse; width: 100%; margin: 20px 0; }}
        th, td {{ border: 1px solid #ddd; padding: 12px; text-align: left; }}
        th {{ background-color: #f5f5f5; }}
    </style>
</head>
<body>
    <h1>{HttpUtility.HtmlEncode(title)}</h1>
    {content}
</body>
</html>";

PdfDocument pdf = renderer.RenderHtmlAsPdfUA(reportHtml);

// Configure standard metadata
pdf.MetaData.Title = title;
pdf.MetaData.Author = author;
pdf.MetaData.Creator = "Enterprise Document System";
pdf.MetaData.CreationDate = DateTime.Now;
pdf.MetaData.ModifiedDate = DateTime.Now;

pdf.SaveAs("quarterly-report-accessible.pdf");
Imports IronPdf
Imports System
Imports System.Web

Dim renderer As New ChromePdfRenderer()
renderer.RenderingOptions.CreatePdfFormsFromHtml = True

Dim title As String = "Quarterly Report"
Dim author As String = "Finance Team"
Dim content As String = "<p>Financial performance overview for Q4 2024.</p>"

' Build report HTML from template
Dim reportHtml As String = $"
<!DOCTYPE html>
<html lang='en'>
<head>
    <meta charset='UTF-8'>
    <title>{HttpUtility.HtmlEncode(title)}</title>
    <style>
        body {{
            font-family: 'Segoe UI', Arial, sans-serif;
            line-height: 1.6;
            max-width: 800px;
            margin: 0 auto;
            padding: 40px;
            color: #333;
        }}
        h1 {{ font-size: 28px; color: #1a1a1a; border-bottom: 2px solid #0066cc; padding-bottom: 10px; }}
        h2 {{ font-size: 22px; color: #333; margin-top: 30px; }}
        p {{ margin-bottom: 15px; }}
        table {{ border-collapse: collapse; width: 100%; margin: 20px 0; }}
        th, td {{ border: 1px solid #ddd; padding: 12px; text-align: left; }}
        th {{ background-color: #f5f5f5; }}
    </style>
</head>
<body>
    <h1>{HttpUtility.HtmlEncode(title)}</h1>
    {content}
</body>
</html>"

Dim pdf As PdfDocument = renderer.RenderHtmlAsPdfUA(reportHtml)

' Configure standard metadata
pdf.MetaData.Title = title
pdf.MetaData.Author = author
pdf.MetaData.Creator = "Enterprise Document System"
pdf.MetaData.CreationDate = DateTime.Now
pdf.MetaData.ModifiedDate = DateTime.Now

pdf.SaveAs("quarterly-report-accessible.pdf")
$vbLabelText   $csharpLabel

Zautomatyzowane testowanie powinno być częścia twojego ciaglego potoku integracyjnego. Kazdy proces, ktory generuje PDF-y, powinien zawierać kroki walidacyjne, ktore nie pozwola kontynuowac budowy, gdy wymagania dostępności nie sa spelnione. Powstrzymuje to nieodpowiednie dokumenty przed dotarciem do produkcji.

Szkolenie personelu jest rownie ważne jak techniczna implementacja. Autorzy treści potrzebuja zrozumieć, dłączego dostępność jest ważna i jak ich wybory wpływają na ostateczny wynik. Nauczanie autorow poprawnego używania poziomow nagłówków, dostarczania znaczacych opisow obrazów i odpowiednio strukturyzowania tabel produkuje lepszy material zrodlowy, ktory przeksztalca sie w zgodne PDF-y.

Kontrola wersji szablonow i regularne audyty dostępności pomagają utrzymac zgodność z biegiem czasu. Gdy wymagania biznesowe sie rozwijają i szablony sa modyfikowane, okresowe przeglądania zapewniają, ze zmiany nie wprowadzily niezamierzenie barier dostępności.

Dokumentowanie podejścia do dostępności tworzy wiedzę instytucjonalna, która przetrwa wymianie pracowników. Rejestracja, ktore standardy przestrzegasz, jakich narzędzi używasz do walidacji i jakie procedury naprawy istnieja dla zidentyfikowanych problemow pomaga utrzymac spójne praktyki w całej organizacji.

Dostępnosc nie jest jednorazowym osiagnieciem, ale trwajacym zobowiązaniem. Standardy ewoluuja, technologie wspomagajace sie poprawiają, a potrzeby użytkowników sie zmieniaja. Organizacje, ktore buduja dostępność w swoich standardowych przepływach pracy, zamiast traktowac ja jako dodatek, sa najlepiej przygotowane do spelnienia obecnych wymagań i przyszlych oczekiwan.

Techniki omowione w tym przewodniku zapewniają solidna podstawe do tworzenia zgodnych z sekcja 508 PDF-ow za pomoca IronPDF. Laczac poprawna strukture HTML, odpowiednie metadane, pomoc nawigacyjna i testy walidacyjne, deweloperzy .NET mogą tworzyć dokumenty, ktore spełniają wymagania prawne, a jednoczesnie naprawde sluza użytkownikom polegającym na dostępną zawartość.

Wnioski

IronPDF upraszcza zlozonosc standardow dostępności PDF, pozwalając deweloperom .NET skupic sie na zawartości, podczas gdy biblioteka zajmuje sie wymaganiami struktury PDF/UA. Ten tutorial omowil konwersje istniejących PDF-ow na format PDF/UA, renderowanie HTML bezpośrednio do dostępnych PDF-ow, ustawianie metadanych dokumentu i specyfikacji języka dla kompatybilnosci z czytnikami ekranu, tworzenie oznaczonej struktury dokumentu z semantycznego HTML, budowanie dostępnych formularzy i nawigacji z zakladkami oraz walidacje zgodności za pomoca narzędzi zewnętrznych jak veraPDF.

Gdy dostępność staje sie częścia szerszego cyklu życia dokumentu, te wzorce lacza sie naturalnie z zgodnościa archiwalna PDF/A na rzecz dlugoterminowego przechowywania i przetwarzania wsadowego na rzecz generowania dostępnych dokumentów na szeroka skale w systemach rzadowych lub opieki zdrowotnej.

Czy jesteś gotowy do rozpoczęcia budowy? Pobierz IronPDF i wyprobuj go z darmowa wersja probna. Ta sama biblioteka obsługuje wszysto, od pojedynczego generowania dostępnego dokumentu po szerokie w całym Enterprise potoki zgodności PDF/UA. Jeśli masz pytania dotyczące implementacji dostępności lub wymagań sekcji 508, skontaktuj się z naszym zespolem wsparcia inżynierskiego.

Często Zadawane Pytania

Czym jest zgodność plików PDF z sekcją 508?

Zgodność z sekcją 508 gwarantuje, że technologie elektroniczne i informatyczne, takie jak pliki PDF, są dostępne dla osób niepełnosprawnych. IronPDF pomaga tworzyć pliki PDF spełniające te standardy, umożliwiając dodawanie tekstu alternatywnego, tworzenie tabel dostępnych dla osób niepełnosprawnych i nie tylko.

Jak mogę użyć IronPDF do konwersji istniejących plików PDF do formatu PDF/UA?

IronPDF oferuje funkcje konwersji istniejących plików PDF do formatu PDF/UA, zapewniając ich zgodność ze standardami dostępności. Obejmuje to dodawanie niezbędnych metadanych i elementów strukturyzujących w celu zapewnienia dostępności treści.

Czy IronPDF może pomóc w renderowaniu HTML-a dostosowanego do potrzeb osób niepełnosprawnych?

Tak, IronPDF może renderować treści HTML, które są dostępne i zgodne ze standardami PDF/UA, co ułatwia tworzenie dostępnych dokumentów na podstawie treści internetowych.

Jak dodać tekst alternatywny do obrazów w plikach PDF za pomocą IronPDF?

IronPDF umożliwia dodawanie tekstu alternatywnego do obrazów w plikach PDF, co ma kluczowe znaczenie dla dostępności. Ta funkcja zapewnia opis obrazów dla użytkowników korzystających z czytników ekranu.

Jakie funkcje oferuje IronPDF do tworzenia tabel i formularzy dostosowanych do potrzeb osób niepełnosprawnych?

IronPDF udostępnia narzędzia do tworzenia tabel i formularzy o strukturze, które są dostępne, co pomaga zapewnić, że dane i pola wprowadzania danych są przejrzyste i zrozumiałe dla wszystkich użytkowników.

Jak mogę sprawdzić zgodność moich plików PDF z wymogąmi rządowymi za pomocą IronPDF?

IronPDF zawiera narzędzia do sprawdzania zgodności plików PDF z wymaganiami sekcji 508 i PDF/UA, co pomaga zapewnić, że dokumenty spełniają niezbędne standardy dostępności.

Czy za pomocą IronPDF można zautomatyzować tworzenie plików PDF dostosowanych do potrzeb osób niepełnosprawnych?

Tak, IronPDF można zintegrować z automatycznymi procesami roboczymi w celu konsekwentnego tworzenia dostępnych plików PDF, usprawniając proces spełniania standardów zgodności.

Jakie języki programowania są kompatybilne z IronPDF w celu tworzenia plików PDF zgodnych z zasadami dostępności?

IronPDF jest zaprojektowany do współpracy z językiem C#, umożliwiając programistom tworzenie dostępnych plików PDF bezpośrednio w środowisku .NET Framework.

Czy są dostępne jakieś samouczki dotyczące korzystania z IronPDF?

Tak, IronPDF udostępnia obszerne samouczki i dokumentację, które poprowadzą Cię przez proces tworzenia dostępnych plików PDF i efektywnego wykorzystania wszystkich jego funkcji.

Czy IronPDF może pomóc w zapewnieniu wielojęzycznej dostępności plików PDF?

IronPDF obsługuje tworzenie wielojęzycznych, dostępnych plików PDF poprzez obsługę tekstu i języków Unicode, zapewniając dostępność w dokumentach w różnych językach.

Curtis Chau
Autor tekstów technicznych

Curtis Chau posiada tytuł licencjata z informatyki (Uniwersytet Carleton) i specjalizuje się w front-endowym rozwoju, z ekspertką w Node.js, TypeScript, JavaScript i React. Pasjonuje się tworzeniem intuicyjnych i estetycznie przyjemnych interfejsów użytkownika, Curtis cieszy się pracą z nowoczesnymi frameworkami i tworzeniem dobrze zorganizowanych, atrakcyjnych wizualnie podrę...

Czytaj więcej
Gotowy, aby rozpocząć?
Nuget Pliki do pobrania 18,926,724 | Wersja: 2026.5 just released
Still Scrolling Icon

Wciąż przewijasz?

Czy chcesz szybko dowodu? PM > Install-Package IronPdf
Uruchom przykład i zobacz, jak Twój kod HTML zamienia się w plik PDF.