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 Twoja 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.
  • Dłączego 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 dłączego 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 obrazówania i dokumentacji klinicznej, ponieważ gwarantuje długoterminową czytelność.

Krótko mówiąc, PDF/A jest formatem, którego używasz, gdy dokument musi przetrwać niezmiennie w czasie, systemach i granicach organizacyjnych. Jeśli Twoja 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 wygląda poprawnie podczas renderowania.

PDF/A-1a (dostępny): Dodaje wymagania strukturalne i semantyczne do 1b, w tym treści oznaczone tagami dla dostępności, mapowanie znaków Unicode oraz logiczną kolejność 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 obejmuje te same poziomy zgodności co PDF/A-1 (2b i 2a), a także nowy poziom: PDF/A-2u (Unicode), który wymaga mapowania Unicode dla całego tekstu, ale nie wymaga pełnego oznaczania strukturalnego na poziomie 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żesz 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 Niemieć, 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 z PDF/A-3 są zgodne z tym samym schematem: 3b (wizualny), 3a (dostępny + oznaczony) oraz 3u (mapowany 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ń wprowadzonych w samym formacie PDF 2.0, w tym ulepszonych struktur tagowania i rozszerzonych możliwości metadanych przy użyciu XMP (Extensible Metadata Platform).

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 Twoich konkretnych wymagań:

Schemat decyzyjny przedstawiający ścieżkę wyboru wersji PDF/A w oparciu o wymagania, takie jak pliki osadzone, JPEG2000, przezroczystość i kompatybilność

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ść z wymogami dostępności: W przypadku wymagań sekcji 508 lub WCAG wybierz poziom zgodności a dla używanej wersji (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 NuGet IronPdf 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. Funkcja ChromePdfRenderer biblioteki IronPDF obsługuje konwersję 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 osadza następnie wszystkie wymagane czcionki, konwertuje przestrzenie kolorów w razie potrzeby, usuwa wszelkie niedozwolone elementy (takie jak JavaScript lub linki zewnętrzne) 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żna stosować nagłówki i stopki, ustawiać rozmiary stron i marginesy, dodawać style CSS oraz używać RenderingOptions do precyzyjnego dostosowywania wyniku — wszystko to przed etapem konwersji do formatu PDF/A. Wywołanie SaveAsPdfA obsługuje transformację zapewniającą zgodność niezależnie od sposobu wygenerowania pliku PDF.

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

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

IronPDF radzi sobie z tym 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żna również użyć metody ConvertToPdfA, jeśli chcesz dokonać konwersji w pamięci bez natychmiastowego zapisywania na dysku — przydatne w przypadku potoków, w których po konwersji następuje dodatkowe przetwarzanie.

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 przebieg pracy jest prosty: wygeneruj lub załaduj wizualny plik PDF, dołącz plik danych źródłowych jako osadzony załącznik i zapisz jako PDF/A-3. IronPDF obsługuje osadzanie plików poprzez wiele przeciążeń metody ConvertToPdfA — ścieżki plików można przekazywać bezpośrednio jako IEnumerable<string>, użyć EmbedFileByte dla tablic bajtów już znajdujących się w pamięci lub użyć EmbedFileStream dla procesó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ą przeglądać dokument wizualny i niezależnie weryfikować dane liczbowe na podstawie wbudowanych 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 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 (zazwyczaj 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 w IronPDF zapewnia precyzyjną kontrolę nad tymi wymaganiami. Można ustawić właściwości ConformanceLevel (takie jak ConformanceLevel.XRECHNUNG), SchemaNamespace, SchemaPrefix, PropertyVersion oraz AFRelationship, aby dopasować je do profilu e-fakturowania oczekiwanego przez system docelowy.

Oto jak możesz zbudować fakturę zgodną z ZUGFeRD przy użyciu 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 systemówi 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, zdolność do osadzania PDF/A-3 ma wartość w każdym przepływie pracy, gdzie kluczowe jest utrzymanie pełnej ścieżki audytowej. 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

Tworzenie dokumentu i nazywanie go PDF/A nie wystarczy — musisz zweryfikować, że wynik rzeczywiście spełnia wymagania standardu. Plik, który twierdzi, że jest PDF/A, ale nie spełnia weryfikacji, nie zostanie zaakceptowany przez systemy archiwizacyjne, portale rządowe ani platformy e-fakturowania.

Metody SaveAsPdfA i ConvertToPdfA firmy IronPDF zajmują się żmudnym procesem konwersji zapewniającej zgodność — osadzaniem czcionek, konwersją przestrzeni kolorów, usuwaniem niedozwolonych funkcji oraz zapisywaniem metadanych XMP. Jednak dla niezależnej weryfikacji wyniku powinieneś używać dedykowanych narzędzi zewnętrznych, takich jak veraPDF (standard branżowy open-source'owy walidator PDF/A) lub wbudowane narzędzie Preflight w Adobe Acrobat Pro. Integracja veraPDF w Twój pipeline CI/CD lub przepływ pracy przetwarzania dokumentów zapewnia autorytatywne, zewnętrzne potwierdzenie, że każdy wygenerowany plik spełnia deklarowany standard przed jego przechowywaniem lub dystrybucją.

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 źródłowy PDF odnosi się do czcionki po nazwie, ale nie osadza danych czcionki, wynik nie będzie zgodny z PDF/A. IronPDF próbuje automatycznie osadzić czcionki podczas konwersji, ale jeśli plik czcionki nie jest dostępny w systemie, na którym działa IronPDF, osadzanie nie powiedzie się. 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 konwertujesz plik PDF chroniony hasłem, musisz go najpierw odszyfrować. Rozwiązanie: 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 kod HTML zawiera tagi <script>, osadzone filmy lub interaktywne formularze, należy je usunąć, w przeciwnym razie zostaną one usunięte podczas konwersji. Rozwiązanie: Upewnij 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. Poprawka: Wybierz PDF/A-2 lub nowszą wersję, jeśli Twoje dokumenty wykorzystują przezroczystość, lub upewnij się, że CSS nie używa opacity, rgba ani przezroczystych plików PNG podczas tworzenia plikó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, PDF/A-2a i PDF/A-3a każdy znak musi mieć również mapowanie Unicode, co gwarantuje, że tekst można niezawodnie wyodrębnić i przeszukiwać.

Kiedy używasz renderowania HTML do PDF IronPDF, silnik Chromium automatycznie osadza czcionki dostępne w systemie. Aby zagwarantować spójność w różnych środowiskach wdrożeniowych (rozwojowym, testowym, produkcyjnym), rozważ użycie czcionek Google Fonts ładowanych za pomocą tagów <link> w kodzie HTML lub dołączenie plików czcionek do aplikacji i odwołanie 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ż podać niestandardową ścieżkę do pliku ICC, jeśli przepływ pracy wymaga konkretnego profilu. Jeśli jednak pracujesz z dokumentami przeznaczonymi do druku, które wymagają dokładności CMYK, upewnij się, że treść źródłowa wykorzystuje profile odpowiednie dla 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 wypełnia te pola automatycznie, ale można je również ustawić jawnie za pomocą właściwości MetaData, aby uzyskać większą kontrolę:

: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żesz przygotować grupę rekordów agencji do transferu NARA:

Wejscie

Folder dokumentacji agencji zawierający 5 plików 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

Zatwierdzony folder z przekonwertowanymi plikami PDF/A

Podczas przygotowywania rekordów do transferu NARA, kluczowe jest zweryfikowanie każdego pliku z osobna. Proces przyjmowania NARA odrzuci niezgodne pliki, a ponowne przetwarzanie dużej grupy jest kosztowne zarówno pod względem czasu, jak i wysiłku. Najbardziej niezawodnym podejściem jest wbudowanie walidacji bezpośrednio w proces konwersji — przy użyciu narzędzia takiego jak veraPDF po każdym wywołaniu SaveAsPdfA.

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 zazwyczaj akceptują PDF/A-1b jako minimalny standard, choć PDF/A-2b jest coraz częściej preferowany w przypadku 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ą umożliwiać wyszukiwanie tekstu (nie mogą być tylko zeskanowanymi obrazami), co oznacza stosowanie zgodności z PDF/A-1a lub PDF/A-2a, jeśli to możliwe, lub zapewnienie, że do zeskanowanych dokumentów zastosowano OCR. 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 związanych z prawem budujących systemy zarządzania dokumentami, integracja konwersji PDF/A w przepływie składania gwarantuje, że każdy dokument zarchiwizowany spełnia wymogi dotyczące długoterminowego przechowywania sądu — bez ręcznej interwencji prawników lub adwokatów.

Zatrzymywanie dokumentacji medycznej

Organizacje opieki zdrowotnej stoją przed rygorystycznymi wymogąmi 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 PDF/A dotycząca długoterminowej czytelności czyni go idealnym dla spełnienia tych wymagań bez obaw o przestarzałość formatu.

Dostępność — ADA i Sekcja 508 wymagają, aby elektroniczna dokumentacja medyczna była dostępna. Zastosowanie poziomów zgodności PDF/A-2a lub PDF/A-3a (obejmujących tagowanie strukturalne) pomaga spełnić te wymagania dotyczące dostępności.

Interoperacyjność — Dokumenty medyczne są często udostępniane pomiędzy dostawcami, ubezpieczycielami i pacjentami. Samodzielna natura PDF/A zapewnia, że dokumenty renderują się spójnie niezależnie od przeglądarki lub systemu, który ich używa do otwierania.

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ć skomplikowane. IronPDF daje programistom .NET kompletny zestaw narzędzi do tworzenia, konwertowania i wzbogacania dokumentów zgodnych z PDF/A — wszystko w znajomym ekosystemie C#. Czy generujesz dokumenty archiwalne z HTML, tworzysz dostępne PDF-y do dystrybucji rządowej i zdrowotnej, konwertujesz starsze PDF-y do długoterminowego przechowywania, czy integrujesz zewnętrzną walidację w pipeline o dużej wydajności, IronPDF obsługuje techniczne szczegóły, abyś mógł skoncentrować się na wymaganiach swojej aplikacji.

Od podstawowego standardu PDF/A-1 po nowoczesne możliwości PDF/A-3 i PDF/A-4, IronPDF obsługuje pełen zakres wersji archiwalnych i poziomów zgodności — w tym PDF/A-1a, PDF/A-1b, PDF/A-2a, PDF/A-2b, PDF/A-3a, PDF/A-3b, PDF/A-4, PDF/A-4e oraz PDF/A-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 za pomocą EmbedFileConfiguration oraz obsługą e-faktur ZUGFeRD/Factur-X 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 wyprobuj go z darmowa wersja probna. Jeśli masz pytania lub chcesz omówić swoją konkretną sytuację zgodności, skontaktuj się z naszym zespołem wsparcia inżynieryjnego — chętnie pomożemy Ci to zrobić dobrze.

Często Zadawane Pytania

Co to znaczy zgodność z PDF/A?

Zgodność z PDF/A odnosi się do standaryzowanej w ramach ISO wersji PDF, specjalnie zaprojektowanej do archiwizacji i długoterminowego przechowywania dokumentów elektronicznych. Zapewnia, że dokumenty mogą być odtwarzane w ten sam sposób przez lata.

Jak mogę tworzyć dokumenty zgodne z PDF/A przy użyciu C#?

Możesz tworzyć dokumenty zgodne z PDF/A używając C# dzięki bibliotece IronPDF, która dostarcza solidne narzędzia do generowania i konwertowania PDFów do różnych formatów PDF/A.

Jakie są różne wersje PDF/A wspierane przez IronPDF?

IronPDF wspiera wiele wersji PDF/A, w tym PDF/A-1, PDF/A-2 i PDF/A-3, każda odpowiadająca różnym wymaganiom archiwizacji i przechowywania dokumentów.

Czy IronPDF może pomóc w osadzaniu danych źródłowych dla standardów fakturowania elektronicznego, takich jak ZUGFeRD i Factur-X?

Tak, IronPDF może osadzać dane źródłowe dla standardów fakturowania elektronicznego, takich jak ZUGFeRD i Factur-X, aby ułatwić przetwarzanie faktur elektronicznych i zgodność.

Jak sprawdzić zgodność z PDF/A w C#?

Możesz sprawdzić zgodność z PDF/A przy użyciu IronPDF w C#, korzystając z wbudowanych narzędzi weryfikacji, aby upewnić się, że twoje dokumenty spełniają pożądane specyfikacje PDF/A.

Czy możliwe jest zajmowanie się scenariuszami archiwizacji rządowej za pomocą IronPDF?

Tak, IronPDF jest zdolny do zajmowania się różnymi scenariuszami archiwizacji rządowej, w tym zgodnością z wymaganiami potrzebnymi dla NARA, dokumentów sądowych i dokumentacji medycznej.

Jakie są korzyści z używania PDF/A do archiwizacji?

Korzyści z używania PDF/A do archiwizacji obejmują zapewnienie wierności dokumentu na przestrzeni czasu, dostarczenie znormalizowanego formatu dla długoterminowego przechowywania oraz spełnienie wymogów prawnych i organizacyjnych.

Czy IronPDF wspiera konwersję istniejących PDFów do formatu PDF/A?

IronPDF wspiera konwersję istniejących PDFów do formatu PDF/A, umożliwiając łatwą zgodność i długoterminowe przechowywanie dokumentów.

Jak IronPDF zapewnia wierność dokumentu w konwersjach PDF/A?

IronPDF zapewnia wierność dokumentu w konwersjach PDF/A, zachowując czcionki, obrazy i integralność układu, dzięki czemu archiwizowane dokumenty wyglądają dokładnie tak, jak zamierzono.

Czy mogę używać IronPDF do archiwizacji dokumentacji medycznej?

Tak, IronPDF można używać do archiwizacji dokumentacji medycznej, pomagając zapewnić zgodność ze standardami i regulacjami branżowymi dla przechowywania dokumentów.

Ahmad Sohail
Programista Full Stack

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,926,724 | Wersja: 2026.5 just released
Still Scrolling Icon

Wciąż przewijasz?

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