Jak tworzyć zgodne z sekcją 508 oraz dostępne pliki PDF 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 IronPDF automatycznie dodaje oznaczone struktury zawartości, kolejność czytania, obsługę tekstu alternatywnego oraz metadane dostępności do plików PDF generowanych z HTML, pozwalając deweloperom .NET budować kompatybilne z czytnikami ekranu dokumenty dla agencji rządowych, dostawców usług zdrowotnych oraz wszelkich organizacji pracujących przy kontraktach federalnych.

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.
  • Dlaczego 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 dlaczego 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 plik PDF do formatu PDF/UA w języku 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

Dla tego przykładu używamy sample-document.pdf, standardowego pliku PDF bez funkcji dostępności, który reprezentuje typowy dokument reliktowy wymagający konwersji.

Kod poniżej ładuje istniejący plik PDF za pomocą PdfDocument.FromFile(), następnie wywołuje SaveAsPdfUA(), aby wyeksportować nową wersję zgodną z 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

Dla dokumentów, które pierwotnie zostały wygenerowane z HTML z atrybutem lang, specyfikacja językowa zostaje 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

Ten przykład używa benefits-summary.pdf, dokumentu o korzyściach, który potrzebuje konwersji na zgodność z dostępnością, z zachowaniem języka z oryginalnego źródła HTML.

Kod ładuje plik PDF i wywołuje SaveAsPdfUA(), aby go skonwertować. Specyfikacja językowa z oryginalnego atrybutu HTML lang zostaje zachowana w strukturze PDF/UA, zapewniając użycie poprawnych zasad wymowy przez czytniki ekranu.

: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 w formacie 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 oznaczenia PDF, ustawia tytuł dokumentu za pomocą MetaData.Title i zapisuje poprawny wynik. Atrybut lang='en' na elemencie HTML zostaje przeniesiony do PDF w celach detekcji języka przez czytnik 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.

Kod poniżej pokazuje dwa podejścia: RenderHtmlFileAsPdf() ładuje HTML ze ścieżki lokalnego pliku, podczas gdy RenderUrlAsPdf() pobiera i renderuje zawartość z adresu URL w sieci. Obie metody produkują standardowe pliki PDF, które następnie są konwertowane do formatu PDF/UA za pomocą 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 wymogami 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

Ten przykład używa enrollment-guide-draft.pdf, wersji roboczej przewodnika po zapisach na korzyści, która potrzebuje kompleksowych metadanych dla zgodności z dostępnością i 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 (pochodząca aplikacja) oraz znaczniki czasowe. Na koniec SaveAsPdfUA() eksportuje dokument 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 za pomocą RenderHtmlAsPdfUA(), następnie konfiguruje pełny zestaw właściwości metadanych na 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 wymogami.

: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 przez atrybut lang w źródle HTML, który jest zachowany w wyniku PDF/UA.

Kod przedstawia dwa scenariusze językowe. Pierwszy renderuje angielską zawartość HTML z lang='en' na elemencie html, a drugi obsługuje zawartość hiszpańską z lang='es'. Metoda RenderHtmlAsPdfUA() zachowuje atrybut języka z HTML, a SaveAsPdfUA() utrzymuje 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 wspiera specyfikację językową za pomocą standardowego atrybutu HTML lang. Powszechne kody języków obejmują en (angielski), es (hiszpański), fr (francuski), de (niemiecki), pt (portugalski), zh (chiński), ja (japoński), ko (koreański) i ar (arabski) oraz 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 buduje dokument HTML z jasną hierarchią nagłówków (h1 dla głównego tytułu, h2 dla sekcji, h3 dla podsekcji), niezamówionymi listami (ul/li) dla punktów z wypunktowaniem oraz zamówionymi listami (ol/li) dla sekwencji numerowanych. Metoda RenderHtmlAsPdfUA() konwertuje te elementy semantyczne na odpowiednie oznaczenia PDF, które technologie wspomagające mogą nawigować.

: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, pozwalając czytnikom ekranu przekazywać takie same spostrzeżenia, jakie widzą widzący użytkownicy oglądający wykresy.

: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 katalog pracowników z odpowiednim oznaczeniem dla dostępności. Element caption zapewnia tytuł tabeli ogłaszany przed zawartością. Komórki nagłówków używają th z scope="col", aby wskazać, że mają zastosowanie do wszystkich komórek w swojej kolumnie. Elementy thead i tbody oddzielają sekcje strukturalne. Metoda RenderHtmlAsPdfUA() IronPDF zachowuje te zależności w strukturze PDF, co pozwala czytnikom ekranu kojarzyć komórki 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 z wieloma rozdziałami, następnie programistycznie dodaje hierarchię zakładek przy użyciu kolekcji Bookmarks. Zakładki na najwyższym poziomie wskazują strony rozpoczynające rozdziały za pomocą AddBookMarkAtEnd() z indeksem strony. Podzakładki dla podsekcji są dodawane przez właściwość Children rodzica, 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 metodzie 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, ustawiając RenderingOptions.TableOfContents na TableOfContentsTypes.WithPageNumbers. HTML zawiera zastępczy div z id="ironpdf-toc", gdzie zostanie wstawiony wygenerowany spis treści. IronPDF skanuje elementy nagłówków (h1, h2, itd.), buduje hierarchiczny spis treści z numerami stron i wstawia go w miejsce zastępcze.

: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 formularzy, ustawiając RenderingOptions.CreatePdfFormsFromHtml = true. Formularz HTML używa odpowiednich wzorów dostępności: każde wejście ma unikalny id, który pasuje do atrybutu for jego etykiety, przyciski radiowe są grupowane w fieldset z opisową legend, a pola wyboru mają związane etykiety. Metoda RenderHtmlAsPdfUA() konwertuje te elementy na interaktywne pola formularzy PDF, zachowując skojarzenia 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 się kilka wzorów dostępności. Każde wejście ma unikalny atrybut id, który pasuje do atrybutu for jego etykiety. To połączenie pozwala ogłosić „Pełne imię i nazwisko, edytuj tekst", gdy użytkownik przeskoczy do tego pola. Przyciski radiowe są grupowane w polu zestawu z legendą opisującą cel grupy. Pola wyboru mają etykiety umieszczone po elemencie wejścia, zgodnie ze standardowymi konwencjami formularzy.

Opcja renderowania CreatePdfFormsFromHtml musi być włączona, aby IronPDF tworzyło interaktywne pola formularzy zamiast statycznych reprezentacji formularza.

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

Tworzenie plików PDF 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 zintegrować walidację z procesem pracy, korzystając z zewnętrznych narzędzi. Walidator veraPDF jest dostępny jako aplikacja wiersza poleceń, którą można wywołać z kodu C#.

Kod demonstruje kompletny proces walidacji. Najpierw generuje testowy plik PDF za pomocą RenderHtmlAsPdfUA() ze skonfigurowanymi metadanymi. Następnie wywołuje veraPDF z C#, używając Process.Start(), ustawiając proces na uruchomienie z flagą --flavour ua1 dla walidacji PDF/UA-1. Wynik zostaje zapisany, a kod zakończenia określa, czy dokument przeszedł walidację.

: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 weryfikację kolejności czytania, weryfikację tekstu alternatywnego oraz dostępności pól formularzy. Mimo że nie jest darmowy, Acrobat Pro jest powszechnie dostępny w środowiskach Enterprise i dostarcza szczegółowe raporty na temat problemów z dostępnością.

Dla zautomatyzowanych potoków testowych narzędzie PAC (PDF Accessibility Checker) od fundacji PDF/UA oferuje kolejne rozwiązanie do walidacji. PAC zapewnia zarówno interfejs graficzny, jak i możliwości wiersza poleceń, co czyni go odpowiednim do integracji w ciągłych potokach integracyjnych.

Jakie są najlepsze praktyki dla utrzymania dostępnych plików PDF w aplikacjach Enterprise?

Tworzenie pojedynczych dostępnych dokumentów jest proste, gdy pozna się techniki. Utrzymanie dostępności na dużą skalę w całym Enterprise wymaga systematycznych podejść i dyscypliny organizacyjnej.

Standaryzacja szablonów redukuje zmienność i zapewnia spójność. Tworzenie biblioteki zatwierdzonych szablonów HTML z semantyczną strukturą, dostępnymi wzorami formularzy i spójnym stylizowaniem daje deweloperom podstawy do produkcji zgodnych wyników domyślnie.

Kod demonstruje wzorzec generowania raportów Enterprise. Inicjalizuje ChromePdfRenderer z włączoną funkcją tworzenia formularzy, następnie buduje raport HTML ze zmiennych szablonu, używając HttpUtility.HtmlEncode() dla bezpiecznego wstawiania zawartości. Raport HTML zawiera spójne stylizowanie i semantyczną strukturę. Po renderowaniu za pomocą RenderHtmlAsPdfUA() są konfigurowane standardowe właściwości metadanych (tytuł, autor, twórca i daty) przed zapisaniem. Ten wzorzec można owinąć w usługę wielokrotnego użycia, aby wymusić zgodność z dostępnością 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ęścią ciągłego potoku integracyjnego. Każdy proces, który generuje pliki PDF, powinien zawierać kroki walidacyjne, które nie pozwolą kontynuować budowy, gdy wymagania dostępności nie są spełnione. Powstrzymuje to nieodpowiednie dokumenty przed dotarciem do produkcji.

Szkolenie personelu jest równie ważne jak techniczna implementacja. Autorzy treści potrzebują zrozumieć, dlaczego dostępność jest ważna i jak ich wybory wpływają na ostateczny wynik. Nauczanie autorów poprawnego używania poziomów nagłówków, dostarczania znaczących opisów obrazów i odpowiedniego strukturyzowania tabel produkuje lepszy materiał źródłowy, który przekształca się w zgodne pliki PDF.

Kontrola wersji szablonów i regularne audyty dostępności pomagają utrzymać zgodność z biegiem czasu. Gdy wymagania biznesowe się rozwijają i szablony są modyfikowane, okresowe przeglądy zapewniają, że zmiany nie wprowadziły niezamierzenie barier dostępności.

Dokumentowanie podejścia do dostępności tworzy wiedzę instytucjonalną, która przetrwa wymianę pracowników. Rejestracja stosowanych standardów, używanych narzędzi do walidacji i istniejących procedur naprawy dla zidentyfikowanych problemów pomaga utrzymać spójne praktyki w całej organizacji.

Dostępność nie jest jednorazowym osiągnięciem, ale trwającym zobowiązaniem. Standardy ewoluują, technologie wspomagające się poprawiają, a potrzeby użytkowników się zmieniają. Organizacje, które budują dostępność w swoich standardowych przepływach pracy, zamiast traktować ją jako dodatek, są najlepiej przygotowane do spełnienia obecnych wymagań i przyszłych oczekiwań.

Techniki omówione w tym przewodniku zapewniają solidną podstawę do tworzenia zgodnych z sekcją 508 plików PDF za pomocą IronPDF. Łącząc poprawną strukturę HTML, odpowiednie metadane, pomoc nawigacyjną i testy walidacyjne, deweloperzy .NET mogą tworzyć dokumenty, które spełniają wymagania prawne, a jednocześnie naprawdę służą użytkownikom polegającym na dostępnej zawartości.

Wnioski

upraszcza złożoność standardów dostępności PDF, pozwalając deweloperom .NET skupić się na zawartości, podczas gdy biblioteka zajmuje się wymaganiami struktury PDF/UA. Ten samouczek omówił konwersję istniejących plików PDF na format PDF/UA, renderowanie HTML bezpośrednio do dostępnych plików PDF, ustawianie metadanych dokumentu i specyfikacji języka dla kompatybilności z czytnikami ekranu, tworzenie oznaczonej struktury dokumentu z semantycznego HTML, budowanie dostępnych formularzy i nawigacji z zakładkami oraz walidację zgodności za pomocą narzędzi zewnętrznych jak veraPDF.

Gdy dostępność staje się częścią szerszego cyklu życia dokumentu, te wzorce łączą się naturalnie z zgodnością archivalną PDF/A na rzecz długoterminowego przechowywania i przetwarzania wsadowego na rzecz generowania dostępnych dokumentów na szeroką skalę w systemach rządowych lub opieki zdrowotnej.

Czy chcesz rozpocząć budowę? Pobierz IronPDF i wypróbuj z bezpłatną wersją próbną. Ta sama biblioteka obsługuje wszystko, od pojedynczego generowania dostępnego dokumentu po szerokie w całym Enterprise potoki zgodności PDF/UA. W przypadku pytań dotyczących implementacji dostępności lub wymagań sekcji 508 zapraszamy do kontaktu z naszym zespołem 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 wymogami 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,135,201 | Wersja: 2026.4 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.