Przejdź do treści stopki
KORZYSTANIE Z IRONPDF

Eksport do formatu PDF jednym kliknięciem w języku C# dla pulpitów administracyjnych

Problem z zachowaniem treści HTML na dużą skalę

Strona główna IronPDF Kiedy organizacja wycofuje starszy CMS, intranet lub portal publiczny, zawartość na nim nie przestaje po prostu mieć znaczenia. Szpital wycofujący bazę artykułów o zdrowiu pacjentów nadal potrzebuje, aby te artykuły zostały zachowane: agencja rządowa projektująca ponownie swoją stronę internetową musi zachować publiczne ogłoszenia, które istniały w określonym momencie w czasie, kancelaria prawna zamykająca platformę badawczą dla przypadków musi każdą stronę przekonwertować na format, który utrzyma się w przypadku sądowym.

Skalowanie jest miejscem, gdzie każdy ręczny podejście zawodzi. Przeglądarka oparta na wydrukowaniu do PDF działa dla jednego dokumentu. To nie jest rozwiązanie dla 10 000. Skryptowanie przeglądarki bezgłowej działa, dopóki nie napotkasz uszkodzonego HTML, brakujących zasobów lub ściany uwierzytelniania, a starsza zawartość rzadko jest czysta.

Istniejące narzędzia do konwersji wsadowej mają podobny problem ze starym znacznikowaniem: stylami inline z 2005 roku, niestandardowymi układami tabel i odniesieniami do ścieżek obrazów, które już się nie rozwiązują. Albo zawodzą po cichu, produkują PDFy z uszkodzonych układów, albo wymagają ręcznej korekty dla każdej strony. Tymczasem zespoły IT nie mogą uzasadnić utrzymywania infrastruktury dziedzictwa online na czas nieokreślony, tylko po to, aby wspierać migrację, która powinna była zakończyć się miesiące temu.

Wynik musi być również spójny. Szpital archiwizujący artykuły o zdrowiu, instytucja finansowa zachowująca strony ujawnienia do zgodności regulacyjnej, kancelaria prawna budująca archiwum retencji, wszyscy potrzebują, aby wynikowe PDFy wyglądały, jakby pochodziły z tego samego systemu, a nie kolekcji jednorazowych eksportów przeglądarki. W tym samouczku przeprowadzimy Cię przez przykład IronPDF pokazujący, jak ta biblioteka może pomóc w podniesieniu twoich przepływów pracy projektowej.

Rozwiązanie: Zautomatyzowana konwersja HTML do PDF wsadowo z IronPDF

Własne IronPDF od Iron Software pozwala aplikacjom .NET konwertować wsadowo pliki HTML, ciągi HTML lub live URL na znormalizowane PDFy w jednym zautomatyzowanym uruchomieniu. Skrypt migracji czyta ze źródła: katalog plików HTML, bazę danych blobów HTML lub listę URLi do uchwycenia przed wyłączeniem starego serwera, wprowadza każdą stronę do ChromePdfRenderer i zapisuje wynik w miejscu docelowym archiwum.

Silnik renderowania oparty na Chromium obsługuje niespójne znaczniki, style inline i osadzone zasoby tak, jak zrobiłaby to przeglądarka, tworząc wierny wizualnie zrzut niezależnie od tego, jak napisano oryginalny HTML. Nie ma hacków automatyzacji przeglądarki do utrzymania i nie ma kosztów API na dokument, które sprawiają, że archiwum 50 000 stron stanie się nieprzyzwoicie drogie. Konwersja odbywa się w aplikacji konsolowej .NET lub serwisie w tle, jeden pakiet NuGet, żadnych zewnętrznych procesów.

Jak to działa w praktyce: Tworzenie dokumentu PDF w C

1. Skrypt migracji enumeruje źródłową zawartość

Skrypt jest zazwyczaj aplikacją konsolową zbudowaną do migracji, jednorazowego uruchomienia lub powtarzalnym zadaniem dla inkrementalnych zestawów zawartości. Zaczyna się od enumerowania źródła: katalog plików .html na dysku, tabela bazy danych z blobami HTML i metadanymi (oryginalny URL, data utworzenia, ID zawartości) lub listy płaskiej stron internetowych do uchwycenia przed wyłączeniem starego serwera.

Dla źródeł bazodanowych, zapytanie zwraca zarówno zawartość HTML, jak i metadane, które wypełnią manifest archiwum. Dla list URL, kolejność przetwarzania można sortować według priorytetu, strony o dużym ruchu lub prawnie wrażliwe zawartości ujmuje się najpierw.

2. Wstrzykiwanie arkusza stylów normalizuje wynik

Dziedziczny HTML ma z natury charakter niespójny. Strony z różnych epok tego samego CMS mogą mieć różne podstawowe rozmiary czcionek, konwencje marginesów i założenia układu. Przed renderowaniem skrypt opcjonalnie poprzedza każdy ciąg HTML znormalizowanym blokiem <style> — ustawiając jednolite marginesy, spójną czcionkę ciała i stałą szerokość strony — aby każdy archiwizowany dokument PDF miał tę samą wizualną podstawę, niezależnie od tego, jak wygląd oryginału.

Ten krok normalizacji stanowi różnicę między archiwum, które wygląda jak spójna kolekcja dokumentów, a takim, które wygląda jak przypadkowy zestaw zrzutów przeglądarki.

3. ChromePdfRenderer konwertuje każdą stronę na plik PDF

Dla pliki HTML na dysku lub ciągi HTML z bazy danych, RenderHtmlAsPdf() obsługuje konwersję. Parametr BaseUrlPath rozwiązuje względne odniesienia do obrazów i arkuszy stylów względem katalogu oryginalnego pliku, zachowując osadzone zasoby:

using IronPdf;

var renderer = new ChromePdfRenderer();

renderer.RenderingOptions.PaperSize = IronPdf.Rendering.PdfPaperSize.A4;

renderer.RenderingOptions.MarginTop = 20;

renderer.RenderingOptions.MarginBottom = 20;

string sourceDir = @"C:\LegacyContent\html";

string archiveDir = @"C:\Archive\pdf";

Directory.CreateDirectory(archiveDir);

foreach (string htmlFile in Directory.EnumerateFiles(sourceDir, "*.html"))
{
    string html = File.ReadAllText(htmlFile);
    PdfDocument pdf = renderer.RenderHtmlAsPdf(html, sourceDir);
    string outputPath = Path.Combine(archiveDir,
        Path.GetFileNameWithoutExtension(htmlFile) + ".pdf");

    pdf.SaveAs(outputPath);
    Console.WriteLine($"Archived: {outputPath}");
}
using IronPdf;

var renderer = new ChromePdfRenderer();

renderer.RenderingOptions.PaperSize = IronPdf.Rendering.PdfPaperSize.A4;

renderer.RenderingOptions.MarginTop = 20;

renderer.RenderingOptions.MarginBottom = 20;

string sourceDir = @"C:\LegacyContent\html";

string archiveDir = @"C:\Archive\pdf";

Directory.CreateDirectory(archiveDir);

foreach (string htmlFile in Directory.EnumerateFiles(sourceDir, "*.html"))
{
    string html = File.ReadAllText(htmlFile);
    PdfDocument pdf = renderer.RenderHtmlAsPdf(html, sourceDir);
    string outputPath = Path.Combine(archiveDir,
        Path.GetFileNameWithoutExtension(htmlFile) + ".pdf");

    pdf.SaveAs(outputPath);
    Console.WriteLine($"Archived: {outputPath}");
}
Imports IronPdf
Imports System.IO

Dim renderer As New ChromePdfRenderer()

renderer.RenderingOptions.PaperSize = IronPdf.Rendering.PdfPaperSize.A4

renderer.RenderingOptions.MarginTop = 20

renderer.RenderingOptions.MarginBottom = 20

Dim sourceDir As String = "C:\LegacyContent\html"

Dim archiveDir As String = "C:\Archive\pdf"

Directory.CreateDirectory(archiveDir)

For Each htmlFile As String In Directory.EnumerateFiles(sourceDir, "*.html")
    Dim html As String = File.ReadAllText(htmlFile)
    Dim pdf As PdfDocument = renderer.RenderHtmlAsPdf(html, sourceDir)
    Dim outputPath As String = Path.Combine(archiveDir, Path.GetFileNameWithoutExtension(htmlFile) & ".pdf")

    pdf.SaveAs(outputPath)
    Console.WriteLine($"Archived: {outputPath}")
Next
$vbLabelText   $csharpLabel

Pliki HTML przekonwertowane do formatu PDF

Pliki wyjściowe

Przykład wyjścia: Plik HTML kontra wyjście PDF

Przykład wynikowy IronPDF Dla live URL, stron, które nadal muszą być uchwycone z działającego serwera przed wycofaniem, RenderUrlAsPdf() obsługuje każde żądanie. Równoległe wsadowe przetwarzanie utrzymuje czas uruchomienia zarządzalny w dużych zestawach URL:

using IronPdf;

var renderer = new ChromePdfRenderer();

int completed = 0, failed = 0;

await Parallel.ForEachAsync(urlList,
    new ParallelOptions { MaxDegreeOfParallelism = 4 },
    async (url, _) =>
    {
        try
        {
            PdfDocument pdf = renderer.RenderUrlAsPdf(url);
            string filename = Uri.EscapeDataString(url).Replace("%", "_") + ".pdf";
            pdf.SaveAs(Path.Combine(@"C:\Archive\pdf", filename));
            Interlocked.Increment(ref completed);
        }
        catch (Exception ex)
        {
            Interlocked.Increment(ref failed);
            Console.Error.WriteLine($"Failed: {url} — {ex.Message}");
        }
        Console.WriteLine($"Progress: {completed} completed, {failed} failed");
    });
using IronPdf;

var renderer = new ChromePdfRenderer();

int completed = 0, failed = 0;

await Parallel.ForEachAsync(urlList,
    new ParallelOptions { MaxDegreeOfParallelism = 4 },
    async (url, _) =>
    {
        try
        {
            PdfDocument pdf = renderer.RenderUrlAsPdf(url);
            string filename = Uri.EscapeDataString(url).Replace("%", "_") + ".pdf";
            pdf.SaveAs(Path.Combine(@"C:\Archive\pdf", filename));
            Interlocked.Increment(ref completed);
        }
        catch (Exception ex)
        {
            Interlocked.Increment(ref failed);
            Console.Error.WriteLine($"Failed: {url} — {ex.Message}");
        }
        Console.WriteLine($"Progress: {completed} completed, {failed} failed");
    });
Imports IronPdf
Imports System.IO
Imports System.Threading
Imports System.Threading.Tasks

Dim renderer As New ChromePdfRenderer()

Dim completed As Integer = 0
Dim failed As Integer = 0

Await Parallel.ForEachAsync(urlList,
    New ParallelOptions With {.MaxDegreeOfParallelism = 4},
    Async Function(url, _) As Task
        Try
            Dim pdf As PdfDocument = renderer.RenderUrlAsPdf(url)
            Dim filename As String = Uri.EscapeDataString(url).Replace("%", "_") & ".pdf"
            pdf.SaveAs(Path.Combine("C:\Archive\pdf", filename))
            Interlocked.Increment(completed)
        Catch ex As Exception
            Interlocked.Increment(failed)
            Console.Error.WriteLine($"Failed: {url} — {ex.Message}")
        End Try
        Console.WriteLine($"Progress: {completed} completed, {failed} failed")
    End Function)
$vbLabelText   $csharpLabel

Pliki wygenerowane z URLi

Wygenerowane pliki z URL

Przykładowy wynik

Przykład wynikowy URL do PDF Każdy wyjściowy PDF jest zapisywany do struktury folderów odzwierciedlającej oryginalną hierarchię strony, z plikiem manifestu rejestrującym oryginalny URL, znacznik czasowy konwersji i ścieżkę wyjścia dla każdego przetwarzanego dokumentu.

Korzyści w praktyce

Przepustowość. IronPDF renderuje każdą stronę w milisekundy. Archiwum 10 000 stron z czterema równoległymi wątkami zazwyczaj kończy się w ciągu kilku godzin na standardowym sprzęcie serwera, żadnych okien wsadowych w nocy, żadnych ręcznych przekazań między uruchomieniami konwersji.

Wierność wizualna. Renderowanie oparte na Chromium oznacza, że tabele, układy CSS, osadzone obrazy i style inline są obsługiwane w ten sam sposób, jak w przeglądarce. Przechowywany PDF odpowiada temu, jak wyglądała oryginalna strona, a nie uproszczonemu estymatowi.

Wycofanie zgodne z harmonogramem. Po zakończeniu uruchomienia archiwizacji i zweryfikowaniu manifestu, serwery dziedzictwa, bazy danych i instalacje CMS można zamknąć. Zawartość istnieje jako trwałe, samodzielne kolekcje PDF, które nie zależą od niczego, co dostarczyła stara infrastruktura.

Compliance regulacyjne. Niemutowalne zrzuty PDF spełniają wymogi prawnego zatrzymania i przechowywania danych. IronPDF obsługuje wyjście PDF/A dla długoterminowej konserwacji archiwalnej, pojedyncza opcja renderowania konwertuje wynik na formę znormalizowaną przez ISO, akceptowaną dla zachowania regulowanych dokumentów.

Spójność między jakością zawartości. Wstrzyknięcie znormalizowanego arkusza stylów przed renderowaniem zapewnia, że każdy archiwizowany PDF dzieli jednolite marginesy, czcionki i wymiary strony, niezależnie od tego, czy oryginalny HTML został napisany przez dewelopera zgodnie ze standardami, czy autora treści kopiującego z Worda.

Brak kosztów za dokument. Konwersja odbywa się w procesie. Nie ma wywołań API do zewnętrznego dostawcy konwersji i brak modelu kosztów, który sprawia, że duże archiwum jest nieproporcjonalnie drogie. Konwersja 500 stron lub 50 000 kosztuje tyle samo w kategoriach infrastruktury.

Zakończenie

Migracja zawartości z terminem wycofania nie pozostawia czasu na ręczne przepływy pracy konwersji ani narzędzia, które zawodzą na śmieciowych HTML. Konwersja musi działać automatycznie, produkować spójne wyjście w wolumenie i zakończyć się przed wyłączeniem starych serwerów.

Skrypt migracji .NET zasilany przez IronPDF obejmuje tę całą powierzchnię, enumerując źródłową treść, normalizując style, renderując każdą stronę przez Chromium, zapisując do miejsca docelowego archiwum i rejestrując awarie do przeglądu. IronPDF obsługuje pełny cykl życia generowania PDF w C# na stronie ironpdf.com, od renderowania ciągów HTML i URL do zapisywania, strumieniowania i manipulowania dokumentami. Jeśli rozpatrujesz zakres migracji lub zaczynasz próbne uruchomienie, darmowy 30-dniowy okres próbny daje wystarczająco dużo czasu, aby przekonwertować reprezentatywną próbkę swojej zawartości dziedzictwa i zatwierdzić wynik przed zobowiązaniem się do pełnego archiwum.

Curtis Chau
Autor tekstów technicznych

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

Czytaj więcej

Zespół wsparcia Iron

Jesteśmy online 24 godziny, 5 dni w tygodniu.
Czat
E-mail
Zadzwoń do mnie