How to Archive PDFs with PDF/A Compliance in C

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

Zgodność z PDF/A w C# przy użyciu IronPDF daje programistom .NET bezpośrednią drogę do tworzenia, konwertowania i weryfikowania archiwalnych plików PDF zgodnych z normami ISO 19005 — zapewniając, że dokumenty wyświetlają się identycznie w każdym systemie, teraz lub za dziesięciolecia. Od renderowania HTML do PDF/A i konwertowania istniejących plików do PDF/A-1b, PDF/A-2b lub PDF/A-3b, po osadzanie danych źródłowych dla zgodności z ZUGFeRD i e-fakturowaniem Factur-X, IronPDF obsługuje cały przepływ pracy konwersji PDF/A bez opuszczania ekosystemu .NET.

TL;DR: Przewodnik Quickstart

Ten samouczek obejmuje tworzenie, konwertowanie i walidację dokumentów zgodnych z PDF/A w C# — w tym formaty e-fakturowania i rzeczywiste wymogi archiwizacji rządowej.

  • Dla kogo jest to skierowane: Programiści .NET budujący aplikacje generujące dokumenty do długoterminowego przechowywania lub regulowanego archiwum — zarządzanie dokumentacją rządową, zgłoszenia prawnicze, ścieżki audytów finansowych, zatrzymywanie dokumentacji medycznej lub platformy e-fakturowania, gdzie PDF/A jest twardym wymogiem zgodności.
  • Co zbudujesz: rendering od HTML do PDF/A od podstaw, konwersja istniejących plików PDF do PDF/A-1b/2b/3b, osadzenie załączników danych źródłowych dla ZUGFeRD/Factur-X e-fakturowania, walidacja zgodności z PDF/A z raportowaniem błędów i rzeczywiste wzorce archiwizacji dla NARA, wymagania dokumentów sądowych i medycznych.
  • Gdzie działa: Dowolne środowisko .NET — .NET 10, .NET 8 LTS, .NET Framework 4.6.2+, .NET Standard 2.0. Konwersja i walidacja PDF/A działają całkowicie lokalnie; nie są wymagane zewnętrzne narzędzia weryfikacji do generowania.
  • Kiedy stosować to podejście: Gdy aplikacja generuje dokumenty, które muszą przetrwać długoterminowo — faktury, umowy, raporty zgodności, zgłoszenia sądowe lub dokumentację medyczną — i gdzie przepisy wymagają formatu PDF/A, który jest zamknięty, weryfikowalny i samodzielny.
  • Dlaczego to ma znaczenie techniczne: Standardowe pliki PDF mogą odwoływać się do zewnętrznych czcionek, osadzać aktywne treści i polegać na specyficznym dla systemu renderingu — wszystko to z czasem może się zepsuć. PDF/A zabrania takich zależności na poziomie formatu, osadzając wszystko, co jest potrzebne do renderowania, bezpośrednio w pliku, gwarantując identyczny wynik na dowolnym zgodnym przeglądarce w nieskończoność.

Przekonwertuj istniejący PDF na PDF/A za pomocą zaledwie kilku linijek kodu:

  1. Install IronPDF with NuGet Package Manager

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

    using IronPdf;
    
    PdfDocument pdf = PdfDocument.FromFile("report.pdf");
    pdf.SaveAsPdfA("archived-report.pdf", PdfAVersions.PdfA3b);
  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

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


Co to jest PDF/A i dlaczego ma to znaczenie?

PDF/A jest standaryzowaną przez ISO podzbiorem formatu PDF (ISO 19005) zaprojektowanym specjalnie dla długoterminowego, niezawodnego archiwizowania dokumentów elektronicznych. W przeciwieństwie do standardowego PDF, który może odwoływać się do zewnętrznych czcionek, łączyć z zewnętrznymi treściami i polegać na specyficznych dla systemu zachowaniach renderowania, plik PDF/A jest całkowicie samowystarczalny. Każda czcionka, profil kolorów i dane metadane wymagane do renderowania dokumentu są osadzone bezpośrednio w pliku.

Ma to znaczenie, ponieważ dokument PDF/A będzie wyświetlany identycznie, niezależnie od tego, czy jest otwierany dzisiaj, czy za 100 lat, na dowolnym zgodnym przeglądarce, niezależnie od systemu operacyjnego lub wersji oprogramowania. Nie ma zależności od zasobów zewnętrznych, które mogą zniknąć, nie polega się na zainstalowaniu konkretnej czcionki i nie ma niejasności, jak kolory lub przezroczystość powinny być wyświetlane.

Poza trwałością technologiczną, zgodność z PDF/A jest często twardym wymogiem — nie tylko najlepszą praktyką. Branże i instytucje, które nakazują PDF/A, obejmują:

Systemy prawne i sądowe — Sądy w USA, UE i wielu innych jurysdykcjach wymagają lub zdecydowanie zalecają PDF/A dla elektronicznych zgłoszeń. Federalne standardy zgłoszeń CM/ECF w USA odnoszą się do PDF/A jako preferowanego formatu dla długoterminowego przechowywania rejestrów.

Agencje rządowe — Narodowe Archiwa i Administracja Dokumentacji USA (NARA) określają PDF/A jako akceptowany format do przekazywania trwałych zasobów elektronicznych. Podobnie, Komisja Europejska wymaga PDF/A dla niektórych oficjalnych publikacji i zgłoszeń regulacyjnych.

Usługi finansowe i audyt — Organy regulacyjne, takie jak SEC, akceptują zgłoszenia PDF/A, a zespoły audytowe wewnętrzne często przyjmują PDF/A, aby zapewnić, że sprawozdania finansowe, raporty i dokumentacja pomocnicza pozostają niezmienne i weryfikowalne z czasem.

Opieka zdrowotna — Przepisy dotyczące przechowywania dokumentacji medycznej (takie jak HIPAA w USA) nie nakazują konkretnego formatu pliku, ale PDF/A stał się de facto standardem dla archiwizacji kart pacjentów, raportów obrazowania i dokumentacji klinicznej, ponieważ gwarantuje długoterminową czytelność.

Krótko mówiąc, PDF/A jest formatem stosowanym wtedy, gdy dokument musi przetrwać niezmiennie w czasie, systemach i granicach organizacyjnych. Jeśli aplikacja generuje dokumenty, które mogą być odwoływane w późniejszych latach — faktury, umowy, raporty zgodności, dokumentacja medyczna — PDF/A jest właściwym wyborem.


Wersje PDF/A wyjaśnione

Standard PDF/A ewoluował przez kilka wersji, z których każda opiera się na wcześniejszych, aby wspierać dodatkowe funkcje PDF przy jednoczesnym zachowaniu rygorystycznych gwarancji archiwizacji. Zrozumienie różnic między wersjami jest kluczowe dla wyboru odpowiedniego do zastosowania przypadku.

PDF/A-1 (Podstawowe archiwizowanie)

PDF/A-1 (ISO 19005-1:2005) była pierwszą wersją standardu, opartą na PDF 1.4. Ustanowiła podstawowe wymogi archiwizacji: wszystkie czcionki muszą być osadzone; szyfrowanie jest zabronione; zawartość audio/wideo nie jest dozwolona; JavaScript jest zabroniony. PDF/A-1 występuje w dwóch poziomach zgodności:

PDF/A-1b (podstawowy): Zapewnia niezawodną wizualną reprodukcję dokumentu. To jest minimalny poziom zgodności i gwarantuje, że dokument wyglada poprawnie podczas renderowania.

PDF/A-1a (dostępny): Dodaje wymogi strukturalne i semantyczne do 1b, w tym oznaczone treści dla dostępności, mapowanie znaków Unicode i logiczny porządek czytania. To jest wyższy standard i jest wymagany, gdy liczy się zgodność dla dostępności.

PDF/A-1 jest najczęściej wspierana wersją i nadal jest powszechnie stosowana, szczególnie w kontekście prawnym i rządowym, gdzie szeroka zgodność jest priorytetem nad nowszymi funkcjami.

PDF/A-2 (JPEG2000, Przezroczystość)

PDF/A-2 (ISO 19005-2:2011) jest oparta na PDF 1.7 i wprowadza wsparcie dla funkcji, które były niedostępne w PDF/A-1:

Kompresja obrazów JPEG2000: Oferuje lepsze stosunki jakości do wielkości niż kompresja JPEG dostępna w PDF/A-1.

Przezroczystość i obsługa warstw: Umożliwia bardziej złożone wizualne układy bez spłaszczania wszystkiego do nieprzejrzystych elementów.

Osadzone załączniki PDF/A: Dokumenty PDF/A-2 mogą osadzać inne zgodne z PDF/A pliki jako załączniki (ale tylko pliki PDF/A, a nie dowolne formaty).

PDF/A-2 zawiera te same poziomy zgodności co PDF/A-1 (2b i 2a), plus nowy poziom: PDF/A-2u (Unicode), który wymaga mapowania Unicode dla całego tekstu, ale nie wymaga pełnego oznaczania strukturalnego jak poziom a.

PDF/A-3 (Osadzone pliki)

PDF/A-3 (ISO 19005-3:2012) jest najbardziej znaczącym rozszerzeniem dla nowoczesnych przepływów pracy. Dzieli te same podstawy co PDF/A-2 (PDF 1.7) i zachowuje wszystkie jego funkcje, ale dodaje jedną kluczową zdolność: możliwość osadzania plików w dowolnym formacie w dokumencie PDF/A.

Oznacza to, że można dołączyć oryginalne dane źródłowe XML, eksporty CSV, arkusze kalkulacyjne lub inne maszynowo odczytywalne pliki razem z wizualnym, odczytywalnym dla człowieka dokumentem. Kontener PDF/A-3 staje się jedną paczką, która zawiera zarówno warstwę prezentacyjną, jak i bazowe dane.

Ta zdolność jest podstawą nowoczesnych standardów e-fakturowania:

ZUGFeRD: Pochodzący z Niemiec, obecnie przyjęty w całej UE jako Factur-X. Osadza strukturalne dane faktury XML (w formacie faktury międzybranżowej) w dokumencie PDF/A-3, który również zawiera wizualną, odczytywalną dla człowieka fakturę. Jeden plik służy zarówno potrzebom przetwarzania przez człowieka, jak i maszynę.

Poziomy zgodności PDF/A-3 podążają za tym samym schematem: 3b (wizualny), 3a (dostępna + oznaczona) i 3u (mapowana na Unicode).

PDF/A-4 (Oparte na PDF 2.0)

PDF/A-4 (ISO 19005-4:2020) jest najnowszą wersją, oparta na PDF 2.0. Upraszcza strukturę poziomów zgodności; nie ma już rozróżnienia a/b/u. Zamiast tego, PDF/A-4 definiuje trzy profile:

PDF/A-4: Podstawowy profil dla ogólnej archiwizacji.

PDF/A-4f: Pozwala na osadzanie plików w dowolnym formacie (podobnie jak PDF/A-3).

PDF/A-4e: Zaprojektowany specjalnie dla dokumentów inżynieryjnych; obsługuje zawartość 3D, bogate multimedia i inne elementy techniczne.

PDF/A-4 korzysta również z ulepszeń w PDF 2.0, w tym ulepszonych struktur oznaczania i zwiększonych możliwości metadanych za pomocą XMP (Rozszerzalna Platforma Metadanych).

Adopcja PDF/A-4 rośnie, ale wciąż jest mniej powszechnie wspierana przez przeglądarki i walidatory w porównaniu do PDF/A-2 i PDF/A-3.

Którą wersję wybrać?

Wybór odpowiedniej wersji PDF/A zależy od konkretnych wymagań projektu:

Schemat decyzyjny pokazujący ścieżkę do wyboru wersji PDF/A na podstawie wymagań jak osadzone pliki, JPEG2000, przezroczystość i zgodność

Maksymalna zgodność: Dla istniejących systemów, walidatorów i przeglądarek (szczególnie w kontekstach prawniczych i rządowych), użyj PDF/A-1b lub PDF/A-2b.

E-fakturowanie: Dla ZUGFeRD, Factur-X lub podobnych standardów wymagających osadzonych danych źródłowych, użyj PDF/A-3b.

Zgodność dostępności: Dla wymagań Sekcji 508 lub WCAG, wybierz poziom zgodności a w wersji, której używasz (PDF/A-1a, PDF/A-2a lub PDF/A-3a).

Nowoczesne przepływy pracy: Dla najnowszych funkcji, gdzie Twoi konsumenci wspierają PDF 2.0, użyj PDF/A-4.

W razie wątpliwości, PDF/A-3b zapewnia najlepsze połączenie nowoczesnych możliwości i szerokiego wsparcia.


Tworzenie dokumentów PDF/A od podstaw

Teraz, gdy rozumiesz, czym jest PDF/A i na którą wersję skupić się, przejdźmy do kodu. IronPDF sprawia, że generowanie dokumentów zgodnych z PDF/A bezpośrednio z treści HTML lub konwertowanie istniejących PDF-ów do formatu PDF/A jest proste.

Instalacja IronPDF

Przed rozpoczęciem zainstaluj pakiet IronPDF NuGet w swoim projekcie .NET. Można to zrobić za pomocą konsoli menedżera pakietów NuGet, interfejsu CLI .NET lub interfejsu użytkownika NuGet w programie Visual Studio.

Install-Package IronPdf
Install-Package IronPdf
SHELL

Lub przy użyciu interfejsu CLI platformy .NET:

dotnet add package IronPdf
dotnet add package IronPdf
SHELL

IronPDF obsługuje .NET Framework 4.6.2+, .NET Core, .NET 5+ oraz .NET Standard 2.0, dzięki czemu pasuje do praktycznie każdego nowoczesnego projektu .NET bez obaw o kompatybilność.

Renderowanie HTML do PDF/A

Najczęstszym sposobem pracy jest generowanie pliku PDF z treści HTML i zapisywanie go bezpośrednio w formacie PDF/A. IronPDF's ChromePdfRenderer obsługuje konwersję z HTML do PDF, a metoda SaveAsPdfA obsługuje konwersję zgodności w jednym kroku.

:path=/static-assets/pdf/content-code-examples/tutorials/pdfa-archiving-csharp/pdfa-render-html-to-pdfa.cs
using IronPdf;

// Create HTML content for the document
string htmlContent = @"
E html>


le>
body { font-family: Arial, sans-serif; margin: 40px; }
h1 { color: #2c3e50; }
.section { margin: 20px 0; }
table { width: 100%; border-collapse: collapse; }
th, td { border: 1px solid #ddd; padding: 10px; text-align: left; }
th { background: #3498db; color: white; }
yle>


Quarterly Financial Report</h1>
eport Period: Q4 2025</p>
 class='section'>
<table>
    <tr><th>Metric</th><th>Value</th></tr>
    <tr><td>Total Revenue</td><td>$4.2M</td></tr>
    <tr><td>Operating Expenses</td><td>$2.1M</td></tr>
    <tr><td>Net Income</td><td>$2.1M</td></tr>
</table>
v>
his document is archived in PDF/A-3b format for long-term preservation.</p>

;

// Render HTML to PDF
var renderer = new ChromePdfRenderer();
using var pdf = renderer.RenderHtmlAsPdf(htmlContent);

// Save as PDF/A-3b for archival compliance
pdf.SaveAsPdfA("quarterly-report-archived.pdf", PdfAVersions.PdfA3b);
Imports IronPdf

' Create HTML content for the document
Dim htmlContent As String = "
<!DOCTYPE html>
<html>
<head>
    <style>
        body { font-family: Arial, sans-serif; margin: 40px; }
        h1 { color: #2c3e50; }
        .section { margin: 20px 0; }
        table { width: 100%; border-collapse: collapse; }
        th, td { border: 1px solid #ddd; padding: 10px; text-align: left; }
        th { background: #3498db; color: white; }
    </style>
</head>
<body>
    <h1>Quarterly Financial Report</h1>
    <p>Report Period: Q4 2025</p>
    <div class='section'>
        <table>
            <tr><th>Metric</th><th>Value</th></tr>
            <tr><td>Total Revenue</td><td>$4.2M</td></tr>
            <tr><td>Operating Expenses</td><td>$2.1M</td></tr>
            <tr><td>Net Income</td><td>$2.1M</td></tr>
        </table>
    </div>
    <p>This document is archived in PDF/A-3b format for long-term preservation.</p>
</body>
</html>
"

' Render HTML to PDF
Dim renderer As New ChromePdfRenderer()
Using pdf = renderer.RenderHtmlAsPdf(htmlContent)
    ' Save as PDF/A-3b for archival compliance
    pdf.SaveAsPdfA("quarterly-report-archived.pdf", PdfAVersions.PdfA3b)
End Using
$vbLabelText   $csharpLabel

Wynik

W tym przykładzie kod HTML jest renderowany do formatu PDF przy użyciu silnika renderującego IronPDF opartego na Chromium, co zapewnia idealną zgodność z nowoczesnymi standardami internetowymi. Metoda SaveAsPdfA następnie osadza wszystkie wymagane czcionki, konwertuje przestrzenie kolorów według potrzeby, usuwa wszelkie zabronione funkcje (jak JavaScript czy zewnętrzne linki) i zapisuje zgodne metadane XMP. Wynikiem jest w pełni samodzielny plik PDF/A-3b gotowy do archiwizacji.

To podejście doskonale współgra również z innymi funkcjami renderowania IronPDF. Możesz stosować nagłówki i stopki, ustawiać rozmiary i marginesy stron, włączać stylizację CSS oraz używać RenderingOptions do dostosowywania wyniku — wszystko przed krokiem konwersji PDF/A. Wywołanie SaveAsPdfA obsługuje transformację zgodności, niezależnie od tego, jak PDF został wygenerowany.

Konwersja istniejących plików PDF do formatu PDF/A

Nie zawsze zaczyna się od HTML. W wielu rzeczywistych sytuacjach otrzymuje się istniejące pliki PDF — ze skanerów, systemów innych firm, starszych archiwów lub przesłanych przez użytkowników — i należy je przekonwertować do formatu PDF/A w celu zgodnego z normami przechowywania.

IronPDF zapewnia to za pomocą tej samej metody SaveAsPdfA:

:path=/static-assets/pdf/content-code-examples/tutorials/pdfa-archiving-csharp/pdfa-convert-existing-pdf.cs
using IronPdf;

// Load an existing PDF file
using var pdf = PdfDocument.FromFile("existing-document.pdf");

// Convert and save as PDF/A-3b
// IronPDF automatically embeds fonts, converts color spaces, adds XMP metadata,
// and removes non-compliant features during conversion
pdf.SaveAsPdfA("existing-document-archived.pdf", PdfAVersions.PdfA3b);

// Alternative: Use ConvertToPdfA for in-memory conversion
using var pdf2 = PdfDocument.FromFile("another-document.pdf");
using var pdfA = pdf2.ConvertToPdfA(PdfAVersions.PdfA2b);
pdfA.SaveAs("another-document-archived.pdf");
Imports IronPdf

' Load an existing PDF file
Using pdf As PdfDocument = PdfDocument.FromFile("existing-document.pdf")
    ' Convert and save as PDF/A-3b
    ' IronPDF automatically embeds fonts, converts color spaces, adds XMP metadata,
    ' and removes non-compliant features during conversion
    pdf.SaveAsPdfA("existing-document-archived.pdf", PdfAVersions.PdfA3b)
End Using

' Alternative: Use ConvertToPdfA for in-memory conversion
Using pdf2 As PdfDocument = PdfDocument.FromFile("another-document.pdf")
    Using pdfA As PdfDocument = pdf2.ConvertToPdfA(PdfAVersions.PdfA2b)
        pdfA.SaveAs("another-document-archived.pdf")
    End Using
End Using
$vbLabelText   $csharpLabel

Podczas konwersji IronPDF analizuje istniejący plik PDF i stosuje niezbędne przekształcenia: osadza czcionki, do których odwołano się, ale które nie zostały dołączone, konwertuje przestrzenie kolorów RGB lub CMYK na odpowiednie profile, dodaje wymagane metadane XMP oraz usuwa wszelkie niezgodne elementy, takie jak szyfrowanie, multimedia lub JavaScript. Możesz również użyć metody ConvertToPdfA, jeśli chcesz konwertować w pamięci bez natychmiastowego zapisu na dysk — przydatne dla pipeline'ów, w których po konwersji następują dalsze procesy.

Ten wzorzec jest idealny dla projektów migracyjnych, w których konieczne jest dostosowanie starszego magazynu dokumentów do współczesnych standardów archiwizacji.


Osadzanie danych źródłowych (PDF/A-3)

Jedną z najpotężniejszych funkcji standardu PDF/A-3 jest możliwość osadzania dowolnych plików — XML, CSV, JSON, arkuszy kalkulacyjnych lub plików w dowolnym innym formacie — bezpośrednio w dokumencie PDF. Dzięki temu plik PDF z czysto wizualnego dokumentu staje się hybrydowym nośnikiem, który w jednym pliku zawiera zarówno prezentację czytelną dla człowieka, jak i dane źródłowe czytelne dla maszyny.

Załączanie plików XML/CSV wraz z dokumentem wizualnym

Podstawowy przepływ pracy jest prosty: wygeneruj lub załaduj wizualny PDF, dołącz plik danych źródłowych jako osadzony załącznik i zapisz jako PDF/A-3. IronPDF obsługuje osadzanie plików przez różne przeciążenia metody ConvertToPdfA — można przekazywać bezpośrednie ścieżki plików jako IEnumerable<string>, używać EmbedFileByte dla tablic bajtowych już w pamięci lub używać EmbedFileStream dla przepływów opartych na strumieniach. Każde z tych rozwiązań zapewnia pełną zgodność z formatem PDF/A.

:path=/static-assets/pdf/content-code-examples/tutorials/pdfa-archiving-csharp/pdfa-embed-xml-attachment.cs
using IronPdf;
using System.Collections.Generic;

// Load the visual PDF document
using var pdf = PdfDocument.FromFile("financial-report.pdf");

// Prepare XML source data to embed
string xmlData = @"<?xml version='1.0' encoding='UTF-8'?>
alReport>
iod>Q4 2025</Period>
enue>4200000</Revenue>
enses>2100000</Expenses>
Income>2100000</NetIncome>
ialReport>";

byte[] xmlBytes = System.Text.Encoding.UTF8.GetBytes(xmlData);

// Configure the embedded file
var xmlConfig = new EmbedFileConfiguration(EmbedFileType.xml)
{
    EmbedFileName = "financial-data.xml",
    AFDesc = "Source financial data in XML format",
    AFRelationship = AFRelationship.Data
};

// Create embed file collection
var embedFiles = new List<EmbedFileByte>
{
    new EmbedFileByte(xmlBytes, xmlConfig)
};

// Convert to PDF/A-3b with embedded data
using var archivedPdf = pdf.ConvertToPdfA(embedFiles, PdfAVersions.PdfA3b);
archivedPdf.SaveAs("financial-report-with-data.pdf");
Imports IronPdf
Imports System.Collections.Generic
Imports System.Text

' Load the visual PDF document
Using pdf = PdfDocument.FromFile("financial-report.pdf")

    ' Prepare XML source data to embed
    Dim xmlData As String = "<?xml version='1.0' encoding='UTF-8'?>
<FinancialReport>
<Period>Q4 2025</Period>
<Revenue>4200000</Revenue>
<Expenses>2100000</Expenses>
<NetIncome>2100000</NetIncome>
</FinancialReport>"

    Dim xmlBytes As Byte() = Encoding.UTF8.GetBytes(xmlData)

    ' Configure the embedded file
    Dim xmlConfig As New EmbedFileConfiguration(EmbedFileType.xml) With {
        .EmbedFileName = "financial-data.xml",
        .AFDesc = "Source financial data in XML format",
        .AFRelationship = AFRelationship.Data
    }

    ' Create embed file collection
    Dim embedFiles As New List(Of EmbedFileByte) From {
        New EmbedFileByte(xmlBytes, xmlConfig)
    }

    ' Convert to PDF/A-3b with embedded data
    Using archivedPdf = pdf.ConvertToPdfA(embedFiles, PdfAVersions.PdfA3b)
        archivedPdf.SaveAs("financial-report-with-data.pdf")
    End Using

End Using
$vbLabelText   $csharpLabel

Ten wzorzec jest szczególnie przydatny w procesach sprawozdawczości finansowej, gdzie wizualny plik PDF może być sformatowanym bilansem lub rachunkiem zysków i strat, podczas gdy załączony plik XML lub CSV zawiera surowe dane, które zostały użyte do wygenerowania raportu. Audytorzy mogą sprawdzać wizualny dokument i niezależnie weryfikować bazowe liczby za pomocą osadzonych danych źródłowych — wszystko z jednego pliku. Można osadzić wiele załączników w tym samym dokumencie, przekazując dodatkowe ścieżki plików lub tablice bajtów do parametru kolekcji metody ConvertToPdfA.

ZUGFeRD i Factur-X – zgodność z przepisami dotyczącymi e-fakturowania

ZUGFeRD (Zentraler User Guide des Forums elektronische Rechnung Deutschland) i jego międzynarodowy odpowiednik Factur-X to standardy e-fakturowania, które określają, w jaki sposób ustrukturyzowane dane faktury powinny być osadzone w dokumencie PDF/A-3. Wizualny plik PDF służy jako faktura czytelna dla człowieka, natomiast osadzony plik XML (zgodny z formatem Cross-Industry Invoice, czyli CII) zawiera dane przetwarzalne maszynowo.

Kluczowe wymagania dotyczące zgodności z ZUGFeRD/Factur-X to:

Plik PDF musi być zgodny z formatem PDF/A-3b (co najmniej). Dołączony plik XML musi być zgodny ze schematem faktury międzybranżowej UN/CEFACT. Plik XML musi być nazwany zgodnie ze specyfikacją standardu (zwykle factur-x.xml dla Factur-X lub zugferd-invoice.xml dla ZUGFeRD). Należy ustawić określone właściwości metadanych XMP, aby zidentyfikować dokument jako fakturę ZUGFeRD/Factur-X.

Klasa EmbedFileConfiguration IronPDF zapewnia szczegółową kontrolę nad tymi wymaganiami. Można ustawić ConformanceLevel (jak ConformanceLevel.XRECHNUNG), SchemaNamespace, SchemaPrefix, PropertyVersion i właściwości AFRelationship, aby dopasować się do dokładnego profilu e-fakturowania oczekiwanego przez docelowy system.

Oto jak można utworzyć fakturę zgodną ze standardem ZUGFeRD za pomocą IronPDF:

:path=/static-assets/pdf/content-code-examples/tutorials/pdfa-archiving-csharp/pdfa-zugferd-invoice.cs
using IronPdf;
using System.Collections.Generic;

// Create visual invoice HTML
string invoiceHtml = @"
E html>


le>
body { font-family: Arial, sans-serif; margin: 40px; }
.header { border-bottom: 2px solid #e74c3c; padding-bottom: 15px; }
h1 { color: #e74c3c; }
.invoice-details { margin: 30px 0; }
.line-item { display: flex; justify-content: space-between; padding: 10px 0; border-bottom: 1px solid #eee; }
.total { font-size: 20px; font-weight: bold; margin-top: 20px; text-align: right; }
yle>


 class='header'>
<h1>INVOICE #INV-2026-0042</h1>
<p>Date: February 7, 2026</p>
v>
 class='invoice-details'>
<p><strong>Bill To:</strong> Acme Corporation</p>
<p><strong>Address:</strong> 123 Business Ave, Suite 100</p>
v>
 class='line-item'><span>Software License (Enterprise)</span><span>$2,499.00</span></div>
 class='line-item'><span>Annual Support Contract</span><span>$499.00</span></div>
 class='line-item'><span>Implementation Services</span><span>$1,500.00</span></div>
 class='total'>Total: $4,498.00</div>
tyle='margin-top: 40px; font-size: 12px; color: #666;'>
This invoice complies with ZUGFeRD/Factur-X e-invoicing standards.


;

// Render the visual invoice
var renderer = new ChromePdfRenderer();
using var invoicePdf = renderer.RenderHtmlAsPdf(invoiceHtml);

// Prepare ZUGFeRD/Factur-X XML invoice data
string zugferdXml = @"<?xml version='1.0' encoding='UTF-8'?>
ssIndustryInvoice xmlns:rsm='urn:un:unece:uncefact:data:standard:CrossIndustryInvoice:100'>
:ExchangedDocument>
<ram:ID>INV-2026-0042</ram:ID>
<ram:IssueDateTime>2026-02-07</ram:IssueDateTime>
m:ExchangedDocument>
:SupplyChainTradeTransaction>
<ram:ApplicableHeaderTradeSettlement>
    <ram:InvoiceCurrencyCode>USD</ram:InvoiceCurrencyCode>
    <ram:SpecifiedTradeSettlementHeaderMonetarySummation>
        <ram:GrandTotalAmount>4498.00</ram:GrandTotalAmount>
    </ram:SpecifiedTradeSettlementHeaderMonetarySummation>
</ram:ApplicableHeaderTradeSettlement>
m:SupplyChainTradeTransaction>
ossIndustryInvoice>";

byte[] xmlBytes = System.Text.Encoding.UTF8.GetBytes(zugferdXml);

// Configure for ZUGFeRD/Factur-X compliance
var zugferdConfig = new EmbedFileConfiguration(EmbedFileType.xml)
{
    EmbedFileName = "factur-x.xml",
    AFDesc = "Factur-X Invoice Data",
    ConformanceLevel = ConformanceLevel.EN16931,
    SchemaNamespace = SchemaNamespace.facturX,
    SchemaPrefix = SchemaPrefix.fx,
    PropertyVersion = PropertyVersion.v1,
    AFRelationship = AFRelationship.Alternative
};

var embedFiles = new List<EmbedFileByte>
{
    new EmbedFileByte(xmlBytes, zugferdConfig)
};

// Convert to PDF/A-3b with embedded ZUGFeRD data
using var zugferdInvoice = invoicePdf.ConvertToPdfA(embedFiles, PdfAVersions.PdfA3b);

// Set invoice metadata
zugferdInvoice.MetaData.Title = "Invoice INV-2026-0042";
zugferdInvoice.MetaData.Author = "IronSoftware Billing";
zugferdInvoice.MetaData.Subject = "ZUGFeRD/Factur-X Compliant Invoice";

zugferdInvoice.SaveAs("invoice-zugferd.pdf");
Imports IronPdf
Imports System.Collections.Generic
Imports System.Text

' Create visual invoice HTML
Dim invoiceHtml As String = "
<!DOCTYPE html>
<html>
<head>
    <style>
        body { font-family: Arial, sans-serif; margin: 40px; }
        .header { border-bottom: 2px solid #e74c3c; padding-bottom: 15px; }
        h1 { color: #e74c3c; }
        .invoice-details { margin: 30px 0; }
        .line-item { display: flex; justify-content: space-between; padding: 10px 0; border-bottom: 1px solid #eee; }
        .total { font-size: 20px; font-weight: bold; margin-top: 20px; text-align: right; }
    </style>
</head>
<body>
    <div class='header'>
        <h1>INVOICE #INV-2026-0042</h1>
        <p>Date: February 7, 2026</p>
    </div>
    <div class='invoice-details'>
        <p><strong>Bill To:</strong> Acme Corporation</p>
        <p><strong>Address:</strong> 123 Business Ave, Suite 100</p>
    </div>
    <div class='line-item'><span>Software License (Enterprise)</span><span>$2,499.00</span></div>
    <div class='line-item'><span>Annual Support Contract</span><span>$499.00</span></div>
    <div class='line-item'><span>Implementation Services</span><span>$1,500.00</span></div>
    <div class='total'>Total: $4,498.00</div>
    <p style='margin-top: 40px; font-size: 12px; color: #666;'>
        This invoice complies with ZUGFeRD/Factur-X e-invoicing standards.
    </p>
</body>
</html>"

' Render the visual invoice
Dim renderer As New ChromePdfRenderer()
Using invoicePdf = renderer.RenderHtmlAsPdf(invoiceHtml)

    ' Prepare ZUGFeRD/Factur-X XML invoice data
    Dim zugferdXml As String = "<?xml version='1.0' encoding='UTF-8'?>
    <rsm:CrossIndustryInvoice xmlns:rsm='urn:un:unece:uncefact:data:standard:CrossIndustryInvoice:100'>
        <rsm:ExchangedDocument>
            <ram:ID>INV-2026-0042</ram:ID>
            <ram:IssueDateTime>2026-02-07</ram:IssueDateTime>
        </rsm:ExchangedDocument>
        <rsm:SupplyChainTradeTransaction>
            <ram:ApplicableHeaderTradeSettlement>
                <ram:InvoiceCurrencyCode>USD</ram:InvoiceCurrencyCode>
                <ram:SpecifiedTradeSettlementHeaderMonetarySummation>
                    <ram:GrandTotalAmount>4498.00</ram:GrandTotalAmount>
                </ram:SpecifiedTradeSettlementHeaderMonetarySummation>
            </ram:ApplicableHeaderTradeSettlement>
        </rsm:SupplyChainTradeTransaction>
    </rsm:CrossIndustryInvoice>"

    Dim xmlBytes As Byte() = Encoding.UTF8.GetBytes(zugferdXml)

    ' Configure for ZUGFeRD/Factur-X compliance
    Dim zugferdConfig As New EmbedFileConfiguration(EmbedFileType.xml) With {
        .EmbedFileName = "factur-x.xml",
        .AFDesc = "Factur-X Invoice Data",
        .ConformanceLevel = ConformanceLevel.EN16931,
        .SchemaNamespace = SchemaNamespace.facturX,
        .SchemaPrefix = SchemaPrefix.fx,
        .PropertyVersion = PropertyVersion.v1,
        .AFRelationship = AFRelationship.Alternative
    }

    Dim embedFiles As New List(Of EmbedFileByte) From {
        New EmbedFileByte(xmlBytes, zugferdConfig)
    }

    ' Convert to PDF/A-3b with embedded ZUGFeRD data
    Using zugferdInvoice = invoicePdf.ConvertToPdfA(embedFiles, PdfAVersions.PdfA3b)

        ' Set invoice metadata
        zugferdInvoice.MetaData.Title = "Invoice INV-2026-0042"
        zugferdInvoice.MetaData.Author = "IronSoftware Billing"
        zugferdInvoice.MetaData.Subject = "ZUGFeRD/Factur-X Compliant Invoice"

        zugferdInvoice.SaveAs("invoice-zugferd.pdf")
    End Using
End Using
$vbLabelText   $csharpLabel

Wynik

Takie podejście pozwala systemowi fakturowania generować dokumenty, które spełniają wymagania zarówno weryfikacji przez człowieka (wizualny plik PDF), jak i przetwarzania automatycznego (osadzony XML) w jednym pakiecie zgodnym ze standardami.

Zachowanie ścieżki audytu

Poza e-fakturowaniem, możliwość osadzania plików PDF/A-3 jest cenna w każdym przepływie pracy, w którym ważne jest zachowanie pełnej ścieżki audytu. Dołączając oryginalne dane źródłowe, logi przetwarzania lub historię zmian wraz z dokumentem końcowym, tworzysz samodzielny zapis, który można niezależnie zweryfikować w dowolnym momencie w przyszłości.

Typowe wzorce osadzania ścieżki audytu obejmują:

Sprawozdania finansowe — Dołącz surowe dane księgowe (eksport CSV lub XML z systemu ERP) wraz z sformatowanym sprawozdaniem finansowym. Audytorzy mogą sprawdzić, czy liczby w dokumencie wizualnym są zgodne z danymi źródłowymi bez konieczności uzyskiwania dostępu do oryginalnego systemu.

Dokumenty regulacyjne — należy dołączyć oryginalne dane zgłoszenia, wyniki walidacji oraz wszelkie obliczenia uzupełniające jako pliki osadzone w ostatecznej wersji dokumentu zgłoszeniowego. W ten sposób powstaje pojedynczy pakiet archiwalny zawierający kompletny zapis zgłoszenia.

Zarządzanie umowami — osadzanie historii wersji, łańcuchów zatwierdzeń lub podpisanych plików metadanych w ostatecznej wersji umowy w formacie PDF. Pozwala to zachować pełny cykl życia dokumentu w jednym pliku archiwalnym.

:path=/static-assets/pdf/content-code-examples/tutorials/pdfa-archiving-csharp/pdfa-audit-trail.cs
using IronPdf;
using System;
using System.Collections.Generic;
using System.Text.Json;

// Load the final document to archive
using var pdf = PdfDocument.FromFile("executed-contract.pdf");

// Create audit trail data
var auditTrail = new
{
    DocumentId = "CONTRACT-2026-00142",
    CreatedDate = "2026-01-15T09:30:00Z",
    FinalizedDate = "2026-02-07T14:22:00Z",
    Versions = new[]
    {
        new { Version = 1, Date = "2026-01-15", Action = "Draft created", User = "john.smith@company.com" },
        new { Version = 2, Date = "2026-01-20", Action = "Legal review completed", User = "legal@company.com" },
        new { Version = 3, Date = "2026-02-01", Action = "Client revisions incorporated", User = "john.smith@company.com" },
        new { Version = 4, Date = "2026-02-07", Action = "Final execution", User = "ceo@company.com" }
    },
    Signatures = new[]
    {
        new { Signer = "Company CEO", SignedDate = "2026-02-07T14:20:00Z", IPAddress = "192.168.1.100" },
        new { Signer = "Client Representative", SignedDate = "2026-02-07T14:22:00Z", IPAddress = "10.0.0.50" }
    },
    Checksum = "SHA256:a1b2c3d4e5f6..."
};

string auditJson = JsonSerializer.Serialize(auditTrail, new JsonSerializerOptions { WriteIndented = true });
byte[] auditBytes = System.Text.Encoding.UTF8.GetBytes(auditJson);

// Configure audit trail attachment
var auditConfig = new EmbedFileConfiguration(EmbedFileType.xml)
{
    EmbedFileName = "audit-trail.json",
    AFDesc = "Complete document audit trail and version history",
    AFRelationship = AFRelationship.Supplement
};

// Create validation log
string validationLog = @"
on Report
=========
: CONTRACT-2026-00142
d: 2026-02-07T14:25:00Z

erformed:
ll required fields present
ignature blocks completed
ate formats valid
urrency amounts verified
egal clauses match template v2.1

atus: APPROVED FOR ARCHIVAL


byte[] validationBytes = System.Text.Encoding.UTF8.GetBytes(validationLog);

var validationConfig = new EmbedFileConfiguration(EmbedFileType.xml)
{
    EmbedFileName = "validation-report.txt",
    AFDesc = "Pre-archive validation report",
    AFRelationship = AFRelationship.Supplement
};

// Embed both files
var embedFiles = new List<EmbedFileByte>
{
    new EmbedFileByte(auditBytes, auditConfig),
    new EmbedFileByte(validationBytes, validationConfig)
};

// Convert to PDF/A-3b with full audit trail
using var archivedContract = pdf.ConvertToPdfA(embedFiles, PdfAVersions.PdfA3b);

// Set archival metadata
archivedContract.MetaData.Title = "Executed Contract - CONTRACT-2026-00142";
archivedContract.MetaData.Author = "Contract Management System";
archivedContract.MetaData.Subject = "Fully executed agreement with audit trail";
archivedContract.MetaData.Keywords = "contract, executed, 2026, archived";

archivedContract.SaveAs("contract-archived-with-audit.pdf");
Imports IronPdf
Imports System
Imports System.Collections.Generic
Imports System.Text.Json

' Load the final document to archive
Using pdf = PdfDocument.FromFile("executed-contract.pdf")

    ' Create audit trail data
    Dim auditTrail = New With {
        .DocumentId = "CONTRACT-2026-00142",
        .CreatedDate = "2026-01-15T09:30:00Z",
        .FinalizedDate = "2026-02-07T14:22:00Z",
        .Versions = New Object() {
            New With {.Version = 1, .Date = "2026-01-15", .Action = "Draft created", .User = "john.smith@company.com"},
            New With {.Version = 2, .Date = "2026-01-20", .Action = "Legal review completed", .User = "legal@company.com"},
            New With {.Version = 3, .Date = "2026-02-01", .Action = "Client revisions incorporated", .User = "john.smith@company.com"},
            New With {.Version = 4, .Date = "2026-02-07", .Action = "Final execution", .User = "ceo@company.com"}
        },
        .Signatures = New Object() {
            New With {.Signer = "Company CEO", .SignedDate = "2026-02-07T14:20:00Z", .IPAddress = "192.168.1.100"},
            New With {.Signer = "Client Representative", .SignedDate = "2026-02-07T14:22:00Z", .IPAddress = "10.0.0.50"}
        },
        .Checksum = "SHA256:a1b2c3d4e5f6..."
    }

    Dim auditJson As String = JsonSerializer.Serialize(auditTrail, New JsonSerializerOptions With {.WriteIndented = True})
    Dim auditBytes As Byte() = System.Text.Encoding.UTF8.GetBytes(auditJson)

    ' Configure audit trail attachment
    Dim auditConfig As New EmbedFileConfiguration(EmbedFileType.xml) With {
        .EmbedFileName = "audit-trail.json",
        .AFDesc = "Complete document audit trail and version history",
        .AFRelationship = AFRelationship.Supplement
    }

    ' Create validation log
    Dim validationLog As String = "
on Report
=========
: CONTRACT-2026-00142
d: 2026-02-07T14:25:00Z

erformed:
ll required fields present
ignature blocks completed
ate formats valid
urrency amounts verified
egal clauses match template v2.1

atus: APPROVED FOR ARCHIVAL
"

    Dim validationBytes As Byte() = System.Text.Encoding.UTF8.GetBytes(validationLog)

    Dim validationConfig As New EmbedFileConfiguration(EmbedFileType.xml) With {
        .EmbedFileName = "validation-report.txt",
        .AFDesc = "Pre-archive validation report",
        .AFRelationship = AFRelationship.Supplement
    }

    ' Embed both files
    Dim embedFiles As New List(Of EmbedFileByte) From {
        New EmbedFileByte(auditBytes, auditConfig),
        New EmbedFileByte(validationBytes, validationConfig)
    }

    ' Convert to PDF/A-3b with full audit trail
    Using archivedContract = pdf.ConvertToPdfA(embedFiles, PdfAVersions.PdfA3b)

        ' Set archival metadata
        archivedContract.MetaData.Title = "Executed Contract - CONTRACT-2026-00142"
        archivedContract.MetaData.Author = "Contract Management System"
        archivedContract.MetaData.Subject = "Fully executed agreement with audit trail"
        archivedContract.MetaData.Keywords = "contract, executed, 2026, archived"

        archivedContract.SaveAs("contract-archived-with-audit.pdf")
    End Using
End Using
$vbLabelText   $csharpLabel

Weryfikacja zgodności z formatem PDF/A

Samo utworzenie dokumentu i nazwanie go PDF/A nie wystarczy — należy sprawdzić, czy wynik rzeczywiście spełnia wymagania standardu. Plik, który twierdzi, że jest w formacie PDF/A, ale nie przechodzi walidacji, nie zostanie zaakceptowany przez systemy archiwizacji, portale rządowe ani platformy e-fakturowania.

Metody SaveAsPdfA i ConvertToPdfA IronPDF przejmują ciężar konwersji tych wymagań zgodności — osadzania czcionek, konwertowania przestrzeni kolorów, usuwania zabronionych funkcji i zapisywania metadanych XMP. Jednak w celu niezależnej weryfikacji wyniku należy przeprowadzić walidację przy użyciu dedykowanych narzędzi zewnętrznych, takich jak veraPDF (standardowy w branży walidator PDF/A typu open source) lub wbudowane narzędzie Preflight programu Adobe Acrobat Pro. Włączenie veraPDF do procesu CI/CD lub przepływu pracy związanego z przetwarzaniem dokumentów daje Ci wiarygodne, niezależne potwierdzenie, że każdy wygenerowany plik spełnia deklarowane standardy, zanim zostanie zapisany lub udostępniony.

Typowe błędy w zakresie zgodności i sposoby ich naprawy

Nawet jeśli IronPDF zajmuje się większością zadań związanych z zapewnieniem zgodności, niektóre warunki wejściowe mogą powodować błędy walidacji. Oto najczęstsze problemy i sposoby ich rozwiązania:

Czcionki nieosadzone — to najczęstszy błąd. Jeśli plik PDF źródłowy odwołuje się do czcionki z nazwy, ale nie zawiera danych czcionki, plik wyjściowy nie będzie zgodny ze standardem PDF/A. IronPDF próbuje automatycznie osadzać czcionki podczas konwersji, ale jeśli plik czcionki nie jest dostępny w systemie, w którym działa IronPDF, osadzanie zakończy się niepowodzeniem. Rozwiązanie: Upewnij się, że wszystkie czcionki użyte w dokumentach źródłowych są zainstalowane na serwerze lub używaj w treści HTML czcionek bezpiecznych dla sieci, które są powszechnie dostępne.

Niez obsługiwane przestrzenie kolorów — format PDF/A wymaga, aby wszystkie dane dotyczące kolorów były zdefiniowane w ramach określonego, osadzonego profilu kolorów (zazwyczaj sRGB dla dokumentów przeznaczonych do wyświetlania na ekranie lub profil CMYK dla dokumentów przeznaczonych do druku). Pliki PDF źródłowe, które wykorzystują przestrzenie kolorów zależne od urządzenia bez osadzonego profilu, nie przejdą walidacji. Poprawka: IronPDF w większości przypadków automatycznie obsługuje konwersję przestrzeni kolorów. W przypadku sytuacji granicznych upewnij się, że treść źródłowa określa kolory w przestrzeni sRGB.

Szyfrowanie lub ochrona hasłem — format PDF/A surowo zabrania stosowania szyfrowania. Jeśli konwertowany jest plik PDF chroniony hasłem, należy go najpierw odszyfrować. Naprawa: Użyj PdfDocument.FromFile("encrypted.pdf", "password"), aby otworzyć chroniony plik przed konwersją.

JavaScript lub treści multimedialne — format PDF/A nie dopuszcza JavaScriptu, plików audio, wideo ani innych elementów interaktywnych. Jeśli źródłowy HTML zawiera tagi <script>, osadzone wideo lub interaktywne formularze, muszą one zostać usunięte lub konwersja je usunie. Rozwiązanie: Należy upewnić się, że treść HTML jest statyczna przed renderowaniem do formatu PDF/A.

Problemy z przezroczystością (tylko PDF/A-1) — format PDF/A-1 nie obsługuje przezroczystości. Jeśli dokument zawiera elementy przezroczyste (często spotykane w nowoczesnych układach CSS), konwersja do formatu PDF/A-1 będzie wymagała spłaszczenia. Naprawa: Należy wybrać PDF/A-2 lub nowszy, jeśli dokumenty używają przezroczystości, lub upewnić się, że CSS nie używa opacity, rgba lub przezroczystych PNG podczas celowania w PDF/A-1.

Wymagania dotyczące czcionek, przestrzeni kolorów i metadanych

Zrozumienie trzech filarów zgodności z PDF/A — czcionek, przestrzeni kolorów i metadanych — pomaga projektować dokumenty, które przechodzą walidację za pierwszym razem.

Czcionki: Każda czcionka użyta w dokumencie musi być w pełni osadzona. Obejmuje to wszystkie glify występujące w tekście, a nie tylko ich podzbiór. W przypadku poziomów zgodności PDF/A-1a, 2a i 3a każdy znak musi mieć również odwzorowanie Unicode, co gwarantuje, że tekst można niezawodnie wyodrębnić i przeszukiwać.

Podczas korzystania z renderowania HTML do PDF w IronPDF silnik Chromium automatycznie osadza czcionki dostępne w systemie. Aby zagwarantować spójność pomiędzy różnymi środowiskami wdrożeniowymi (rozwojowe, staging, produkcyjne), warto rozważyć użycie czcionek Google załadowanych za pomocą tagów <link> w HTML lub dołączenie plików czcionek do aplikacji i odwoływanie się do nich za pomocą CSS @font-face.

Przestrzenie kolorów: Format PDF/A wymaga, aby wszystkie kolory były określone w przestrzeni kolorów niezależnej od urządzenia, opartej na profilu ICC. W praktyce oznacza to użycie przestrzeni sRGB dla większości dokumentów. IronPDF osadza odpowiedni profil ICC i automatycznie konwertuje kolory podczas procesu SaveAsPdfA — można również przekazać dostosowaną ścieżkę pliku ICC, jeśli przepływ pracy wymaga szczególnego profilu. Jednak w przypadku pracy z dokumentami zorientowanymi na druk, które wymagają dokładności CMYK, należy upewnić się, że źródłowe treści używają odpowiednich profili CMYK i że są one zachowane podczas konwersji.

Metadane: Format PDF/A wymaga osadzenia w dokumencie metadanych XMP (Extensible Metadata Platform). Obejmuje to tytuł dokumentu, autora, datę utworzenia, datę modyfikacji oraz identyfikator poziomu zgodności z PDF/A. IronPDF automatycznie wypełnia te pola, ale można je też ustawiać jawnie przez właściwość MetaData dla większej kontroli:

:path=/static-assets/pdf/content-code-examples/tutorials/pdfa-archiving-csharp/pdfa-metadata-settings.cs
using IronPdf;
using System;

// Create a PDF document
var renderer = new ChromePdfRenderer();
using var pdf = renderer.RenderHtmlAsPdf("<h1>Annual Report 2025</h1><p>Corporate performance summary.</p>");

// Set standard metadata properties
pdf.MetaData.Title = "Annual Report 2025 - IronSoftware Inc.";
pdf.MetaData.Author = "Finance Department";
pdf.MetaData.Subject = "Corporate annual financial and operational report";
pdf.MetaData.Keywords = "annual report, financial, 2025, corporate, IronSoftware";
pdf.MetaData.Creator = "IronPDF Document Generator";
pdf.MetaData.CreationDate = DateTime.Now;
pdf.MetaData.ModifiedDate = DateTime.Now;

// For custom or batch metadata, use SetMetaDataDictionary
var metadataDict = new System.Collections.Generic.Dictionary<string, string>
{
    { "Title", "Quarterly Report Q4 2025" },
    { "Author", "Finance Team" },
    { "Subject", "Q4 Financial Results" },
    { "Keywords", "quarterly, Q4, 2025, finance" },
    { "Department", "Finance" },
    { "Classification", "Internal" },
    { "RetentionPeriod", "7 years" }
};

using var pdf2 = renderer.RenderHtmlAsPdf("<h1>Q4 Report</h1>");
pdf2.MetaData.SetMetaDataDictionary(metadataDict);

// Convert to PDF/A with metadata preserved
pdf.SaveAsPdfA("annual-report-2025.pdf", PdfAVersions.PdfA3b);
pdf2.SaveAsPdfA("q4-report-2025.pdf", PdfAVersions.PdfA3b);
Imports IronPdf
Imports System
Imports System.Collections.Generic

' Create a PDF document
Dim renderer As New ChromePdfRenderer()
Using pdf = renderer.RenderHtmlAsPdf("<h1>Annual Report 2025</h1><p>Corporate performance summary.</p>")

    ' Set standard metadata properties
    pdf.MetaData.Title = "Annual Report 2025 - IronSoftware Inc."
    pdf.MetaData.Author = "Finance Department"
    pdf.MetaData.Subject = "Corporate annual financial and operational report"
    pdf.MetaData.Keywords = "annual report, financial, 2025, corporate, IronSoftware"
    pdf.MetaData.Creator = "IronPDF Document Generator"
    pdf.MetaData.CreationDate = DateTime.Now
    pdf.MetaData.ModifiedDate = DateTime.Now

    ' For custom or batch metadata, use SetMetaDataDictionary
    Dim metadataDict As New Dictionary(Of String, String) From {
        {"Title", "Quarterly Report Q4 2025"},
        {"Author", "Finance Team"},
        {"Subject", "Q4 Financial Results"},
        {"Keywords", "quarterly, Q4, 2025, finance"},
        {"Department", "Finance"},
        {"Classification", "Internal"},
        {"RetentionPeriod", "7 years"}
    }

    Using pdf2 = renderer.RenderHtmlAsPdf("<h1>Q4 Report</h1>")
        pdf2.MetaData.SetMetaDataDictionary(metadataDict)

        ' Convert to PDF/A with metadata preserved
        pdf.SaveAsPdfA("annual-report-2025.pdf", PdfAVersions.PdfA3b)
        pdf2.SaveAsPdfA("q4-report-2025.pdf", PdfAVersions.PdfA3b)
    End Using
End Using
$vbLabelText   $csharpLabel

Wyraźne określenie metadanych jest szczególnie ważne w przypadku dokumentów, które będą indeksowane przez systemy zarządzania dokumentacją, ponieważ pola tytułu i autora są często wykorzystywane do katalogowania i wyszukiwania.


Przykłady zastosowań w zarządzaniu dokumentacją rządową

PDF/A to nie tylko specyfikacja techniczna — to praktyczny wymóg w wielu kontekstach rządowych, prawnych i związanych z opieką zdrowotną. W tej sekcji przyjrzymy się, jak format PDF/A wpisuje się w konkretne ramy regulacyjne oraz co należy wiedzieć, aby spełnić ich wymagania przy użyciu IronPDF.

Wymagania NARA (Archiwa Narodowe Stanów Zjednoczonych)

Amerykańska Narodowa Administracja Archiwów i Dokumentacji (NARA) jest odpowiedzialna za przechowywanie dokumentów federalnych o trwałej wartości. Wytyczne NARA dotyczące przekazywania dokumentów określają format PDF/A jako jeden z preferowanych formatów do przekazywania stałych dokumentów elektronicznych do Archiwum Narodowego.

Kluczowe wymagania NARA dotyczące zgłoszeń w formacie PDF/A:

NARA akceptuje formaty PDF/A-1, PDF/A-2 i PDF/A-3 dla większości typów dokumentów. Przed przesłaniem dokumenty muszą zostać zweryfikowane pod kątem zgodności z deklarowaną wersją PDF/A. Metadane muszą zawierać nazwę agencji, która je stworzyła, identyfikator serii dokumentów oraz zakres dat, których dotyczą. Wbudowane czcionki są obowiązkowe — NARA wyraźnie odrzuca dokumenty z brakującymi czcionkami lub czcionkami, do których istnieją jedynie odniesienia. W przypadku dokumentów cyfrowych (zeskanowanych) NARA zaleca minimalną rozdzielczość 300 DPI i preferuje format PDF/A-2 lub nowszy ze względu na lepszą kompresję obrazu.

Oto jak można przygotować partię dokumentów agencji do przekazania do NARA:

Wejscie

Folder zasobów agencji z 5 plikami PDF

:path=/static-assets/pdf/content-code-examples/tutorials/pdfa-archiving-csharp/pdfa-nara-compliance.cs
using IronPdf;
using System;
using System.IO;

string inputFolder = "agency-records/";
string validatedFolder = "nara-transfer/validated/";
string rejectedFolder = "nara-transfer/rejected/";

// Create output directories
Directory.CreateDirectory(validatedFolder);
Directory.CreateDirectory(rejectedFolder);

// NARA transfer metadata requirements
string agencyName = "Department of Example";
string recordSeries = "Administrative Correspondence";
string dateRange = "2020-2025";

// Process all PDF files in the input folder
string[] pdfFiles = Directory.GetFiles(inputFolder, "*.pdf");

Console.WriteLine($"Preparing {pdfFiles.Length} records for NARA transfer");
Console.WriteLine($"Agency: {agencyName}");
Console.WriteLine($"Record Series: {recordSeries}");
Console.WriteLine();

int successCount = 0;
int failCount = 0;

foreach (string inputPath in pdfFiles)
{
    string fileName = Path.GetFileName(inputPath);

    try
    {
        using var pdf = PdfDocument.FromFile(inputPath);

        // Set NARA-required metadata
        var metadata = new System.Collections.Generic.Dictionary<string, string>
        {
            { "Title", Path.GetFileNameWithoutExtension(inputPath) },
            { "Author", agencyName },
            { "Subject", recordSeries },
            { "Keywords", $"NARA, {recordSeries}, {dateRange}" },
            { "Agency", agencyName },
            { "RecordSeries", recordSeries },
            { "DateRange", dateRange },
            { "TransferDate", DateTime.Now.ToString("yyyy-MM-dd") }
        };
        pdf.MetaData.SetMetaDataDictionary(metadata);

        // Convert to PDF/A-2b (NARA preferred for digitized records)
        string outputPath = Path.Combine(validatedFolder, fileName);
        pdf.SaveAsPdfA(outputPath, PdfAVersions.PdfA2b);

        // Verify the output
        using var verifyPdf = PdfDocument.FromFile(outputPath);
        if (verifyPdf.PageCount > 0)
        {
            successCount++;
            Console.WriteLine($"[OK] {fileName}");
        }
        else
        {
            throw new Exception("Output PDF has no pages");
        }
    }
    catch (Exception ex)
    {
        failCount++;
        Console.WriteLine($"[FAILED] {fileName}: {ex.Message}");

        // Move original to rejected folder for manual review
        try
        {
            File.Copy(inputPath, Path.Combine(rejectedFolder, fileName), overwrite: true);
        }
        catch { }
    }
}

Console.WriteLine();
Console.WriteLine("=== NARA Transfer Preparation Complete ===");
Console.WriteLine($"Successfully converted: {successCount}");
Console.WriteLine($"Failed (requires review): {failCount}");
Console.WriteLine($"Output location: {validatedFolder}");
Imports IronPdf
Imports System
Imports System.IO

Module Program
    Sub Main()
        Dim inputFolder As String = "agency-records/"
        Dim validatedFolder As String = "nara-transfer/validated/"
        Dim rejectedFolder As String = "nara-transfer/rejected/"

        ' Create output directories
        Directory.CreateDirectory(validatedFolder)
        Directory.CreateDirectory(rejectedFolder)

        ' NARA transfer metadata requirements
        Dim agencyName As String = "Department of Example"
        Dim recordSeries As String = "Administrative Correspondence"
        Dim dateRange As String = "2020-2025"

        ' Process all PDF files in the input folder
        Dim pdfFiles As String() = Directory.GetFiles(inputFolder, "*.pdf")

        Console.WriteLine($"Preparing {pdfFiles.Length} records for NARA transfer")
        Console.WriteLine($"Agency: {agencyName}")
        Console.WriteLine($"Record Series: {recordSeries}")
        Console.WriteLine()

        Dim successCount As Integer = 0
        Dim failCount As Integer = 0

        For Each inputPath As String In pdfFiles
            Dim fileName As String = Path.GetFileName(inputPath)

            Try
                Using pdf = PdfDocument.FromFile(inputPath)

                    ' Set NARA-required metadata
                    Dim metadata As New System.Collections.Generic.Dictionary(Of String, String) From {
                        {"Title", Path.GetFileNameWithoutExtension(inputPath)},
                        {"Author", agencyName},
                        {"Subject", recordSeries},
                        {"Keywords", $"NARA, {recordSeries}, {dateRange}"},
                        {"Agency", agencyName},
                        {"RecordSeries", recordSeries},
                        {"DateRange", dateRange},
                        {"TransferDate", DateTime.Now.ToString("yyyy-MM-dd")}
                    }
                    pdf.MetaData.SetMetaDataDictionary(metadata)

                    ' Convert to PDF/A-2b (NARA preferred for digitized records)
                    Dim outputPath As String = Path.Combine(validatedFolder, fileName)
                    pdf.SaveAsPdfA(outputPath, PdfAVersions.PdfA2b)

                    ' Verify the output
                    Using verifyPdf = PdfDocument.FromFile(outputPath)
                        If verifyPdf.PageCount > 0 Then
                            successCount += 1
                            Console.WriteLine($"[OK] {fileName}")
                        Else
                            Throw New Exception("Output PDF has no pages")
                        End If
                    End Using
                End Using
            Catch ex As Exception
                failCount += 1
                Console.WriteLine($"[FAILED] {fileName}: {ex.Message}")

                ' Move original to rejected folder for manual review
                Try
                    File.Copy(inputPath, Path.Combine(rejectedFolder, fileName), overwrite:=True)
                Catch
                End Try
            End Try
        Next

        Console.WriteLine()
        Console.WriteLine("=== NARA Transfer Preparation Complete ===")
        Console.WriteLine($"Successfully converted: {successCount}")
        Console.WriteLine($"Failed (requires review): {failCount}")
        Console.WriteLine($"Output location: {validatedFolder}")
    End Sub
End Module
$vbLabelText   $csharpLabel

Wynik

Folder z zatwierdzonymi plikami PDF/A

Podczas przygotowywania dokumentacji do przekazania do NARA kluczowe znaczenie ma indywidualna weryfikacja każdego pliku. Proces przyswajania NARA odrzuci niezgodne pliki, a ponowne przetwarzanie dużej partii jest kosztowne zarówno pod względem czasu, jak i wysiłku. Wbudowanie walidacji bezpośrednio w pipeline konwersji — korzystające z narzędzia takiego jak veraPDF po każdym wywołaniu SaveAsPdfA — jest najbardziej niezawodnym podejściem.

Archiwizacja dokumentów sądowych

Federalny system sądowy w USA i wiele systemów sądowych stanowych używa systemów elektronicznych zgłoszeń (przede wszystkim CM/ECF na poziomie federalnym), które akceptują lub wymagają PDF/A do długoterminowego przechowywania dokumentów. Chociaż precyzyjne wymogi różnią się w zależności od jurysdykcji, ogólne oczekiwania są konsekwentne:

Sądy federalne — Biuro Administracyjne Sądów USA zaleca PDF/A dla dokumentów, które staną się częścią stałego rekordu sprawy. Systemy CM/ECF zwykle akceptują PDF/A-1b jako minimalny standard, choć PDF/A-2b jest coraz częściej preferowane dla dokumentów o złożonym formatowaniu.

Sądy stanowe — wymogi różnią się szeroko. Niektóre stany (jak Teksas i Kalifornia) mają szczególne wymogi PDF/A dla określonych typów zgłoszeń, podczas gdy inne po prostu zalecają to jako najlepszą praktykę. Sprawdzenie konkretnych zasad dla docelowej jurysdykcji jest niezbędne.

Typowe wymagania w sądowych systemach obejmują:

Dokumenty muszą być wyszukiwalne w tekście (nie tylko skanowane obrazy), co oznacza użycie zgodności PDF/A-1a lub 2a, gdy to możliwe, lub zapewnienie, że OCR został zastosowany do skanowanych dokumentów. Rozmiary stron muszą być standardowe (zazwyczaj Letter USA, 8,5" × 11"). Metadane powinny obejmować numer sprawy, datę zgłoszenia i typ dokumentu, jeśli system zgłoszeń to obsługuje.

:path=/static-assets/pdf/content-code-examples/tutorials/pdfa-archiving-csharp/pdfa-court-filing.cs
using IronPdf;
using System;

// Court filing configuration
string caseNumber = "1:26-cv-00142-ABC";
string courtName = "US District Court, Northern District";
string documentType = "Motion for Summary Judgment";
string filingParty = "Plaintiff";

// Create legal document HTML
string legalDocumentHtml = $@"
E html>


le>
body {{
    font-family: 'Times New Roman', Times, serif;
    font-size: 12pt;
    line-height: 2;
    margin: 1in;
}}
.header {{ text-align: center; margin-bottom: 24pt; }}
.case-caption {{
    border: 1px solid black;
    padding: 12pt;
    margin: 24pt 0;
}}
.section {{ margin: 12pt 0; }}
h1 {{ font-size: 14pt; text-align: center; }}
.signature {{ margin-top: 48pt; }}
yle>


 class='header'>
<strong>{courtName}</strong>
v>

 class='case-caption'>
<p>ACME CORPORATION,<br>&nbsp;&nbsp;&nbsp;&nbsp;Plaintiff,</p>
<p>v.</p>
<p>EXAMPLE INDUSTRIES, INC.,<br>&nbsp;&nbsp;&nbsp;&nbsp;Defendant.</p>
<p style='text-align: right;'><strong>Case No. {caseNumber}</strong></p>
v>

{documentType.ToUpper()}</h1>

 class='section'>
<p>Plaintiff ACME Corporation, by and through undersigned counsel, respectfully
moves this Court for summary judgment pursuant to Federal Rule of Civil Procedure 56...</p>
v>

 class='section'>
<h2>I. INTRODUCTION</h2>
<p>This motion presents the Court with a straightforward question of contract interpretation...</p>
v>

 class='signature'>
<p>Respectfully submitted,</p>
<p>_________________________<br>
Jane Attorney, Esq.<br>
Bar No. 12345<br>
Law Firm LLP<br>
123 Legal Street<br>
City, State 12345<br>
(555) 123-4567<br>
jane@lawfirm.com</p>
<p>Attorney for Plaintiff</p>
v>

;

// Render with court-appropriate settings
var renderer = new ChromePdfRenderer();
renderer.RenderingOptions.PaperSize = IronPdf.Rendering.PdfPaperSize.Letter;
renderer.RenderingOptions.MarginTop = 72;
renderer.RenderingOptions.MarginBottom = 72;
renderer.RenderingOptions.MarginLeft = 72;
renderer.RenderingOptions.MarginRight = 72;

using var pdf = renderer.RenderHtmlAsPdf(legalDocumentHtml);

// Set metadata for court filing system indexing
var metadata = new System.Collections.Generic.Dictionary<string, string>
{
    { "Title", $"{documentType} - {caseNumber}" },
    { "Author", "Law Firm LLP" },
    { "Subject", $"Court Filing - {caseNumber}" },
    { "CaseNumber", caseNumber },
    { "DocumentType", documentType },
    { "FilingParty", filingParty },
    { "FilingDate", DateTime.Now.ToString("yyyy-MM-dd") }
};
pdf.MetaData.SetMetaDataDictionary(metadata);

// Convert to PDF/A-2b (widely accepted by federal courts)
string outputPath = $"court-filing-{caseNumber.Replace(":", "-")}.pdf";
pdf.SaveAsPdfA(outputPath, PdfAVersions.PdfA2b);
Imports IronPdf
Imports System
Imports System.Collections.Generic

' Court filing configuration
Dim caseNumber As String = "1:26-cv-00142-ABC"
Dim courtName As String = "US District Court, Northern District"
Dim documentType As String = "Motion for Summary Judgment"
Dim filingParty As String = "Plaintiff"

' Create legal document HTML
Dim legalDocumentHtml As String = $"
<!DOCTYPE html>
<html>
<head>
    <style>
        body {{
            font-family: 'Times New Roman', Times, serif;
            font-size: 12pt;
            line-height: 2;
            margin: 1in;
        }}
        .header {{ text-align: center; margin-bottom: 24pt; }}
        .case-caption {{
            border: 1px solid black;
            padding: 12pt;
            margin: 24pt 0;
        }}
        .section {{ margin: 12pt 0; }}
        h1 {{ font-size: 14pt; text-align: center; }}
        .signature {{ margin-top: 48pt; }}
    </style>
</head>
<body>
    <div class='header'>
        <strong>{courtName}</strong>
    </div>
    <div class='case-caption'>
        <p>ACME CORPORATION,<br>&nbsp;&nbsp;&nbsp;&nbsp;Plaintiff,</p>
        <p>v.</p>
        <p>EXAMPLE INDUSTRIES, INC.,<br>&nbsp;&nbsp;&nbsp;&nbsp;Defendant.</p>
        <p style='text-align: right;'><strong>Case No. {caseNumber}</strong></p>
    </div>
    <h1>{documentType.ToUpper()}</h1>
    <div class='section'>
        <p>Plaintiff ACME Corporation, by and through undersigned counsel, respectfully
        moves this Court for summary judgment pursuant to Federal Rule of Civil Procedure 56...</p>
    </div>
    <div class='section'>
        <h2>I. INTRODUCTION</h2>
        <p>This motion presents the Court with a straightforward question of contract interpretation...</p>
    </div>
    <div class='signature'>
        <p>Respectfully submitted,</p>
        <p>_________________________<br>
        Jane Attorney, Esq.<br>
        Bar No. 12345<br>
        Law Firm LLP<br>
        123 Legal Street<br>
        City, State 12345<br>
        (555) 123-4567<br>
        jane@lawfirm.com</p>
        <p>Attorney for Plaintiff</p>
    </div>
</body>
</html>
"

' Render with court-appropriate settings
Dim renderer As New ChromePdfRenderer()
renderer.RenderingOptions.PaperSize = IronPdf.Rendering.PdfPaperSize.Letter
renderer.RenderingOptions.MarginTop = 72
renderer.RenderingOptions.MarginBottom = 72
renderer.RenderingOptions.MarginLeft = 72
renderer.RenderingOptions.MarginRight = 72

Using pdf = renderer.RenderHtmlAsPdf(legalDocumentHtml)
    ' Set metadata for court filing system indexing
    Dim metadata As New Dictionary(Of String, String) From {
        {"Title", $"{documentType} - {caseNumber}"},
        {"Author", "Law Firm LLP"},
        {"Subject", $"Court Filing - {caseNumber}"},
        {"CaseNumber", caseNumber},
        {"DocumentType", documentType},
        {"FilingParty", filingParty},
        {"FilingDate", DateTime.Now.ToString("yyyy-MM-dd")}
    }
    pdf.MetaData.SetMetaDataDictionary(metadata)

    ' Convert to PDF/A-2b (widely accepted by federal courts)
    Dim outputPath As String = $"court-filing-{caseNumber.Replace(":", "-")}.pdf"
    pdf.SaveAsPdfA(outputPath, PdfAVersions.PdfA2b)
End Using
$vbLabelText   $csharpLabel

Wynik

Dla kancelarii prawniczych i firm technologicznych zajmujących się prawem, budowanie systemów zarządzania dokumentami, integracja konwersji PDF/A w przepływie pracy zgłoszeń zapewnia, że każdy archiwizowany dokument spełnia wymogi długoterminowego przechowywania sądu — bez ręcznej interwencji od paralegalów czy prawników.

Zatrzymywanie dokumentacji medycznej

Organizacje opieki zdrowotnej stoją przed rygorystycznymi wymogami przechowywania kart pacjentów. Chociaż HIPAA nie wymaga konkretnego formatu pliku, kombinacja długich okresów przechowywania (często 7–10 lat dla dorosłych, dłużej dla nieletnich), wymogów dostępu i oczekiwań audytu sprawia, że PDF/A jest naturalnym wyborem do archiwizacji dokumentów medycznych.

Kluczowe rozważenia dla archiwizacji dokumentacji medycznej:

Okresy przechowywania — Przepisy federalne i stanowe wymagają przechowywania kart medycznych przez różne okresy, często sięgające 10+ lat. Gwarancja długoterminowej czytelności PDF/A sprawia, że jest idealny do spełnienia tych wymogów bez obawy o przestarzałość formatu.

Dostępność — ADA i Sekcja 508 wymagają, aby elektroniczna dokumentacja medyczna była dostępna. Użycie poziomów zgodności PDF/A-2a lub PDF/A-3a ( które zawierają oznakowanie strukturalne) pomaga spełnić te wymogi dostępności.

Interoperacyjność — Dokumenty medyczne są często udostępniane pomiędzy dostawcami, ubezpieczycielami i pacjentami. Samowystarczalna natura PDF/A zapewnia, że dokumenty wyświetlają się konsekwentnie, niezależnie od przeglądarki czy systemu używanego do ich otwarcia.

Gotowość do audytu — Audyty opieki zdrowotnej mogą wymagać przedstawienia dokumentacji medycznej lata po ich stworzeniu. PDF/A zapewnia, że dokumenty produkowane podczas audytu są identyczne z oryginałami, bez różnic w renderingu, które mogłyby budzić wątpliwości co do integralności dokumentów.

:path=/static-assets/pdf/content-code-examples/tutorials/pdfa-archiving-csharp/pdfa-medical-records.cs
using IronPdf;
using System;
using System.Collections.Generic;

// Medical record metadata
string patientId = "MRN-2026-00847";
string documentType = "Discharge Summary";
string facility = "Metro General Hospital";
string department = "Internal Medicine";
DateTime encounterDate = new DateTime(2026, 2, 5);

// Create clinical document HTML
string clinicalDocumentHtml = $@"
E html>
ng='en'>

le>
body {{ font-family: Arial, sans-serif; margin: 40px; line-height: 1.6; }}
.header {{ border-bottom: 2px solid #2c3e50; padding-bottom: 15px; margin-bottom: 20px; }}
.patient-info {{ background: #ecf0f1; padding: 15px; margin: 15px 0; }}
.section {{ margin: 20px 0; }}
h1 {{ color: #2c3e50; }}
h2 {{ color: #3498db; font-size: 14pt; }}
.footer {{ margin-top: 40px; font-size: 10pt; color: #666; }}
yle>


 class='header'>
<h1>{facility}</h1>
<p>{department} | {documentType}</p>
v>

 class='patient-info'>
<p><strong>Patient ID:</strong> {patientId}</p>
<p><strong>Encounter Date:</strong> {encounterDate:MMMM d, yyyy}</p>
<p><strong>Attending Physician:</strong> Dr. Sarah Johnson, MD</p>
v>

 class='section'>
<h2>Chief Complaint</h2>
<p>Patient presented with acute respiratory symptoms including shortness of breath and persistent cough.</p>
v>

 class='section'>
<h2>Hospital Course</h2>
<p>Patient was admitted for observation and treatment. Symptoms improved with standard protocol...</p>
v>

 class='section'>
<h2>Discharge Instructions</h2>
<ul>
    <li>Continue prescribed medications as directed</li>
    <li>Follow up with primary care physician within 7 days</li>
    <li>Return to ED if symptoms worsen</li>
</ul>
v>

 class='footer'>
<p>Document generated: {DateTime.Now:yyyy-MM-dd HH:mm}</p>
<p>This document is archived in PDF/A-3a format for accessibility and long-term preservation.</p>
v>

;

var renderer = new ChromePdfRenderer();
using var pdf = renderer.RenderHtmlAsPdf(clinicalDocumentHtml);

// Set comprehensive metadata for medical records management
var metadata = new System.Collections.Generic.Dictionary<string, string>
{
    { "Title", $"{documentType} - {patientId}" },
    { "Author", "Metro General Hospital EHR System" },
    { "Subject", $"Clinical documentation for patient {patientId}" },
    { "PatientMRN", patientId },
    { "DocumentType", documentType },
    { "Facility", facility },
    { "Department", department },
    { "EncounterDate", encounterDate.ToString("yyyy-MM-dd") },
    { "RetentionCategory", "Medical Record - Adult" },
    { "RetentionPeriod", "10 years from last encounter" }
};
pdf.MetaData.SetMetaDataDictionary(metadata);

// Embed clinical data (HL7 FHIR format)
string fhirData = @"{
sourceType"": ""DocumentReference"",
atus"": ""current"",
pe"": { ""text"": ""Discharge Summary"" },
bject"": { ""reference"": ""Patient/MRN-2026-00847"" }


byte[] fhirBytes = System.Text.Encoding.UTF8.GetBytes(fhirData);

var fhirConfig = new EmbedFileConfiguration(EmbedFileType.xml)
{
    EmbedFileName = "clinical-data.json",
    AFDesc = "FHIR DocumentReference metadata",
    AFRelationship = AFRelationship.Data
};

var embedFiles = new List<EmbedFileByte>
{
    new EmbedFileByte(fhirBytes, fhirConfig)
};

// Convert to PDF/A-3a (accessible archival with embedded data)
using var archivedRecord = pdf.ConvertToPdfA(embedFiles, PdfAVersions.PdfA3a);

string outputPath = $"medical-record-{patientId}-{encounterDate:yyyyMMdd}.pdf";
archivedRecord.SaveAs(outputPath);
Imports IronPdf
Imports System
Imports System.Collections.Generic
Imports System.Text

' Medical record metadata
Dim patientId As String = "MRN-2026-00847"
Dim documentType As String = "Discharge Summary"
Dim facility As String = "Metro General Hospital"
Dim department As String = "Internal Medicine"
Dim encounterDate As DateTime = New DateTime(2026, 2, 5)

' Create clinical document HTML
Dim clinicalDocumentHtml As String = $"
<!DOCTYPE html>
<html lang='en'>
<head>
    <style>
        body {{ font-family: Arial, sans-serif; margin: 40px; line-height: 1.6; }}
        .header {{ border-bottom: 2px solid #2c3e50; padding-bottom: 15px; margin-bottom: 20px; }}
        .patient-info {{ background: #ecf0f1; padding: 15px; margin: 15px 0; }}
        .section {{ margin: 20px 0; }}
        h1 {{ color: #2c3e50; }}
        h2 {{ color: #3498db; font-size: 14pt; }}
        .footer {{ margin-top: 40px; font-size: 10pt; color: #666; }}
    </style>
</head>
<body>
    <div class='header'>
        <h1>{facility}</h1>
        <p>{department} | {documentType}</p>
    </div>
    <div class='patient-info'>
        <p><strong>Patient ID:</strong> {patientId}</p>
        <p><strong>Encounter Date:</strong> {encounterDate:MMMM d, yyyy}</p>
        <p><strong>Attending Physician:</strong> Dr. Sarah Johnson, MD</p>
    </div>
    <div class='section'>
        <h2>Chief Complaint</h2>
        <p>Patient presented with acute respiratory symptoms including shortness of breath and persistent cough.</p>
    </div>
    <div class='section'>
        <h2>Hospital Course</h2>
        <p>Patient was admitted for observation and treatment. Symptoms improved with standard protocol...</p>
    </div>
    <div class='section'>
        <h2>Discharge Instructions</h2>
        <ul>
            <li>Continue prescribed medications as directed</li>
            <li>Follow up with primary care physician within 7 days</li>
            <li>Return to ED if symptoms worsen</li>
        </ul>
    </div>
    <div class='footer'>
        <p>Document generated: {DateTime.Now:yyyy-MM-dd HH:mm}</p>
        <p>This document is archived in PDF/A-3a format for accessibility and long-term preservation.</p>
    </div>
</body>
</html>"

Dim renderer As New ChromePdfRenderer()
Using pdf = renderer.RenderHtmlAsPdf(clinicalDocumentHtml)
    ' Set comprehensive metadata for medical records management
    Dim metadata As New Dictionary(Of String, String) From {
        {"Title", $"{documentType} - {patientId}"},
        {"Author", "Metro General Hospital EHR System"},
        {"Subject", $"Clinical documentation for patient {patientId}"},
        {"PatientMRN", patientId},
        {"DocumentType", documentType},
        {"Facility", facility},
        {"Department", department},
        {"EncounterDate", encounterDate.ToString("yyyy-MM-dd")},
        {"RetentionCategory", "Medical Record - Adult"},
        {"RetentionPeriod", "10 years from last encounter"}
    }
    pdf.MetaData.SetMetaDataDictionary(metadata)

    ' Embed clinical data (HL7 FHIR format)
    Dim fhirData As String = "{
    ""resourceType"": ""DocumentReference"",
    ""status"": ""current"",
    ""type"": { ""text"": ""Discharge Summary"" },
    ""subject"": { ""reference"": ""Patient/MRN-2026-00847"" }
    }"

    Dim fhirBytes As Byte() = Encoding.UTF8.GetBytes(fhirData)

    Dim fhirConfig As New EmbedFileConfiguration(EmbedFileType.xml) With {
        .EmbedFileName = "clinical-data.json",
        .AFDesc = "FHIR DocumentReference metadata",
        .AFRelationship = AFRelationship.Data
    }

    Dim embedFiles As New List(Of EmbedFileByte) From {
        New EmbedFileByte(fhirBytes, fhirConfig)
    }

    ' Convert to PDF/A-3a (accessible archival with embedded data)
    Using archivedRecord = pdf.ConvertToPdfA(embedFiles, PdfAVersions.PdfA3a)
        Dim outputPath As String = $"medical-record-{patientId}-{encounterDate:yyyyMMdd}.pdf"
        archivedRecord.SaveAs(outputPath)
    End Using
End Using
$vbLabelText   $csharpLabel

Wynik

Dla systemów elektronicznej dokumentacji medycznej (EHR), najbardziej efektywne podejście to konwersja dokumentów do PDF/A w momencie ich tworzenia — gdy generowane są wyniki laboratoryjne, gdy kończone są notatki kliniczne, czy gdy produkowane są podsumowania wypisu. Ta strategia "archiwizacji w momencie tworzenia" unika kosztów i złożoności późniejszej masowej migracji.


Kolejne kroki

Archiwizowanie dokumentów w formacie PDF/A nie musi być złożone. IronPDF daje programistom .NET kompletny zestaw narzędzi do tworzenia, konwertowania i wzbogacania dokumentów zgodnych z PDF/A — wszystko w znajomym ekosystemie C#. Nieważne, czy generujesz dokumenty archiwalne z HTML, tworzysz dostępne pliki PDF do dystrybucji rządowej i w opiece zdrowotnej, konwertujesz starsze pliki PDF do długoterminowego przechowywania, czy integrujesz zewnętrzne walidacje w przepływach masowej przetwarzania, IronPDF zajmuje się szczegółami technicznymi, abyś mógł skupić się na wymaganiach swojej aplikacji.

Od podstawowego standardu PDF/A-1 po nowoczesne możliwości PDF/A-3 i PDF/A-4, IronPDF wspiera pełen zakres wersji archiwalnych i poziomów zgodności — w tym PDF/A-1a, 1b, 2a, 2b, 3a, 3b, 4, 4e i 4f. Dedykowany poradnik jak korzystać z PDF/A dokładnie omawia opcje konwersji i poziomy zgodności. W połączeniu z zarządzaniem metadanymi, osadzaniem plików przez EmbedFileConfiguration i wsparciem ZUGFeRD/Factur-X do e-fakturowania, zapewnia wszystko, czego potrzebujesz, aby spełnić wymagania archiwizacyjne agencji rządowych, systemów sądowych, organizacji opieki zdrowotnej i instytucji finansowych.

Gotowy, by rozpocząć archiwizację? Pobierz IronPDF i wypróbuj z bezpłatną wersją próbną. Jeśli masz pytania lub chcesz omówić swój konkretny scenariusz zgodności, skontaktuj się z naszym zespołem wsparcia technicznego — chętnie pomożemy Ci to zrobić poprawnie.

Często Zadawane Pytania

What is PDF/A compliance?

PDF/A compliance refers to the ISO-standardized version of PDF specifically designed for archiving and long-term preservation of electronic documents. It ensures that documents can be reproduced in the same manner for years to come.

How can I create PDF/A compliant documents using C#?

You can create PDF/A compliant documents using C# by utilizing the IronPDF library, which provides robust tools to generate and convert PDFs into various PDF/A formats.

What are the different PDF/A versions supported by IronPDF?

IronPDF supports multiple PDF/A versions including PDF/A-1, PDF/A-2, and PDF/A-3, each catering to different requirements for document archival and preservation.

Can IronPDF help with embedding source data for e-invoicing standards like ZUGFeRD and Factur-X?

Yes, IronPDF can embed source data for e-invoicing standards such as ZUGFeRD and Factur-X to facilitate electronic invoice processing and compliance.

How do I validate PDF/A compliance in C#?

You can validate PDF/A compliance using IronPDF in C# by leveraging its built-in validation tools to ensure that your documents adhere to the desired PDF/A specifications.

Is it possible to handle government archiving scenarios with IronPDF?

Yes, IronPDF is capable of handling various government archiving scenarios, including compliance with standards required for NARA, court documents, and medical records.

What are the benefits of using PDF/A for archiving?

The benefits of using PDF/A for archiving include ensuring document fidelity over time, providing a standardized format for long-term preservation, and complying with legal and organizational requirements.

Does IronPDF support converting existing PDFs to PDF/A format?

IronPDF supports converting existing PDFs to PDF/A format, allowing for easy compliance and long-term document preservation.

How does IronPDF ensure document fidelity in PDF/A conversions?

IronPDF ensures document fidelity in PDF/A conversions by maintaining fonts, images, and layout integrity, so the archived documents appear exactly as intended.

Can I use IronPDF for medical record archiving?

Yes, IronPDF can be used for medical record archiving, helping ensure compliance with industry standards and regulations for document preservation.

Ahmad Sohail
Full Stack Developer

Ahmad to full-stack developer z solidnym fundamentem w C#, Pythonie i technologiach webowych. Ma głębokie zainteresowanie tworzeniem skalowalnych rozwiązań oprogramowania i cieszy się badaniem, jak projektowanie i funkcjonalność spotykają się w rzeczywistych aplikacjach.

Przed dołączeniem do zespołu Iron Software, Ahmad pracował nad projektami ...

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.