IRONSOFTWAREHOME
FILMY

Jak zapisywać i edytować historię zmian plików PDF w języku C#

Curtis Chau
Curtis Chau
Updated: 18 maja 2026

Przejście zMigraDocna IronPDF zmienia proces pracy z plikami PDF w środowisku .NET z rozbudowanego modelu programowego, wymagającego ręcznego tworzenia elementów, na nowoczesne podejście oparte na HTML/CSS, które wykorzystuje istniejące umiejętności w zakresie tworzenia stron internetowych. Niniejszy przewodnik zawiera kompleksową, szczegółową ścieżkę migracji, która eliminuje trudności związane z nauką obsługi zastrzeżonego modelu obiektowego dokumentówMigraDocdla profesjonalnych programistów .NET.

Dlaczego warto przejść zMigraDocna IronPDF

Wyzwania związane z MigraDoc

MigraDoc to silnik układu, który opiera się na PDFsharp — zależy od pakietu PDFsharp i renderuje do PDFsharp PdfDocument. Utrzymywany przez empira / Zespół PDFsharp na licencji MIT, jest potężny do generowania programowego, ale ma podstawowe ograniczenia wpływające na nowoczesne przepływy robocze:

  1. **Brak obsługi HTML:**MigraDocnie obsługuje bezpośrednio HTML. Należy ręcznie tworzyć dokumenty element po elemencie, używając obiektów Document, Section, Paragraph i Table — nie można wykorzystywać istniejących projektów HTML/CSS.

  2. **Zastrzeżony Model Dokumentu:**MigraDocwymaga nauki unikalnego modelu dokumentu z koncepcjami takimi jak AddSection(), AddParagraph(), AddTable(), AddRow() i AddCell(). Ta stroma krzywa uczenia się stanowi szczególne wyzwanie dla programistów z doświadczeniem w tworzeniu stron internetowych.

  3. Ograniczone opcje stylizacji: ChociażMigraDocoferuje solidne zarządzanie strukturą dokumentów, jego możliwości stylizacyjne są skromne w porównaniu z nowoczesnymi narzędziami internetowymi. Właściwości takie jak Format.Font.Size, Format.Font.Bold i Format.Alignment są ograniczone w porównaniu do pełnego CSS3.

  4. Rozbudowany kod: Tworzenie nawet prostych układów wymaga dziesiątek linii kodu. Prosta tabela z nagłówkami może wymagać 15–20 wierszy kodu MigraDoc.

  5. **Brak obsługi JavaScript:**MigraDocnie może renderować treści dynamicznych ani wykonywać kodu JavaScript, co ogranicza możliwości tworzenia nowoczesnych wykresów i elementów interaktywnych.

  6. Wykresy są podstawowe: Funkcjonalność wykresów wMigraDocjest ograniczona w porównaniu z nowoczesnymi bibliotekami wykresów JavaScript, takimi jak Chart.js czy D3.

PorównanieMigraDoci IronPDF

FunkcjaMigraDocIronPDF
Definicja treściProgramowe (dokument/sekcja/akapit)HTML/CSS
Krzywa uczenia sięSteep (zastrzeżony DOM)Łatwe (umiejętności internetowe)
StylizacjaOgraniczone właściwościPełny CSS3
JavaScriptNonePełne wykonanie w Chromium
TabeleRęczne definiowanie kolumn/wierszyHTML <table> z CSS
WykresyPodstawowe wykresyMigraDocDowolna biblioteka do tworzenia wykresów wJavaScript
ObrazyRęczne dopasowywanie rozmiaru/pozycjonowanieStandardowy HTML <img>
Responsywne układyNieobsługiwaneFlexbox, Grid
LicencjaOpen Source (MIT)Komercjalne

Dla zespołów celujących w nowoczesne .NET,IronPDF pozwala programistom wykorzystać znane umiejętności HTML/CSS, zamiast uczyć się proprietyjnego modelu dokumentu.


Ocena złożoności migracji

Szacowany nakład pracy według funkcji

FunkcjaZłożoność migracji
Prosty tekstBardzo niski
TabeleNiski
Nagłówki/stopkiNiski
StyleMedium
ObrazyNiski
WykresyMedium

Zmiana paradygmatu

Podstawową zmianą w tej migracjiMigraDocjest Shift od programowego tworzenia dokumentów do renderowania opartego na HTML:

MigraDoc:  Document → AddSection() → AddParagraph() → PdfDocumentRenderer → Save()
IronPDF:   ChromePdfRenderer → RenderHtmlAsPdf(html) → SaveAs()
Text

Ta zmiana paradygmatu radykalnie zmniejsza złożoność kodu, zapewniając jednocześnie nieograniczone możliwości stylizacji za pomocą CSS.


Zanim zaczniesz

Wymagania wstępne

  1. Środowisko .NET: .NET Framework 4.6.2+ lub .NET Core 3.1+ / .NET 5/6/7/8/9+
  2. Dostęp do NuGet: Możliwość instalowania pakietów NuGet
  3. Licencja IronPDF: Uzyskaj klucz licencyjny na stronie ironpdf.com

Zmiany w pakiecie NuGet

# RemoveMigraDocpackages (package IDs are case-sensitive on nuget.org)
dotnet remove package PDFsharp-MigraDoc
dotnet remove package PDFsharp-MigraDoc-GDI
dotnet remove package PDFsharp-MigraDoc-WPF

# Install IronPDF
dotnet add package IronPdf
SHELL

Konfiguracja licencji

// Add at application startup (Program.cs or Startup.cs)
IronPdf.License.LicenseKey = "YOUR-LICENSE-KEY";

Zidentyfikuj zastosowanie MigraDoc

# Find allMigraDocreferences
grep -r "using MigraDoc\|PdfDocumentRenderer\|AddSection\|AddParagraph" --include="*.cs" .
grep -r "AddTable\|AddRow\|AddColumn\|AddCell\|AddImage" --include="*.cs" .
SHELL

Kompletna dokumentacija API

Mapowania klas

KlasaMigraDocOdpowiednik IronPDF
DocumentChromePdfRenderer
SectionHTML <body> lub <div>
ParagraphHTML <p>, <h1>, itd.
FormattedTextHTML <span>, <strong>, itd.
TableHTML <table>
RowHTML <tr>
ColumnHTML <col> lub CSS
CellHTML <td>, <th>
PdfDocumentRendererChromePdfRenderer

Mapowanie metod

MetodaMigraDocOdpowiednik IronPDF
document.AddSection()Struktura HTML
section.AddParagraph(text)<p>text</p>
section.AddTable()<table>
table.AddColumn(width)CSS width property
table.AddRow()<tr>
row.Cells[n].AddParagraph()<td>content</td>
renderer.RenderDocument()RenderHtmlAsPdf(html)
pdfDocument.Save(path)pdf.SaveAs(path)

Mapowanie symboli zastępczych (nagłówki/stopki)

MetodaMigraDocIronPDF Placeholder
AddPageField(){page}
AddNumPagesField(){total-pages}
AddDateField(){date}

Przykłady migracji kodu

Przykład 1: Podstawowe konwersje z HTML do PDF (podstawowa różnica)

Przed (MigraDoc):

// NuGet: Install-Package PDFsharp-MigraDoc-GDI
using MigraDoc.DocumentObjectModel;
using MigraDoc.Rendering;
using System.Diagnostics;

class Program
{
    static void Main()
    {
        //MigraDocdoesn't support HTML directly
        // Must manually create document structure
        Document document = new Document();
        Section section = document.AddSection();
        
        Paragraph paragraph = section.AddParagraph();
        paragraph.AddFormattedText("Hello World", TextFormat.Bold);
        paragraph.Format.Font.Size = 16;
        
        PdfDocumentRenderer pdfRenderer = new PdfDocumentRenderer();
        pdfRenderer.Document = document;
        pdfRenderer.RenderDocument();
        pdfRenderer.PdfDocument.Save("output.pdf");
    }
}
C#

Po (IronPDF):

// NuGet: Install-Package IronPdf
using IronPdf;

class Program
{
    static void Main()
    {
        var renderer = new ChromePdfRenderer();
        var pdf = renderer.RenderHtmlAsPdf("<h1>Hello World</h1>");
        pdf.SaveAs("output.pdf");
    }
}

Ten przykład ilustruje zasadniczą różnicę międzyMigraDoca IronPdf.MigraDocwymaga utworzenia Document, dodania Section, dodania Paragraph, użycia AddFormattedText() z TextFormat.Bold, ustawienia Format.Font.Size, utworzenia PdfDocumentRenderer, przypisania dokumentu, wywołania RenderDocument(), a na koniec zapisania. To ponad 10 wierszy kodu z wieloma obiektami.

IronPDF osiąga ten sam rezultat w trzech krokach: utworzenie renderera, renderowanie HTML i zapisanie. Znacznik HTML <h1> naturalnie zapewnia styl pogrubienia, dużego nagłówka. Dodatkowe opcje renderowania można znaleźć w dokumentacji dotyczącej konwersji HTML do PDF.

Przykład 2: Tworzenie tabel

Przed (MigraDoc):

// NuGet: Install-Package PDFsharp-MigraDoc-GDI
using MigraDoc.DocumentObjectModel;
using MigraDoc.DocumentObjectModel.Tables;
using MigraDoc.Rendering;

class Program
{
    static void Main()
    {
        Document document = new Document();
        Section section = document.AddSection();
        
        Table table = section.AddTable();
        table.Borders.Width = 0.75;
        
        Column column1 = table.AddColumn("3cm");
        Column column2 = table.AddColumn("3cm");
        
        Row row1 = table.AddRow();
        row1.Cells[0].AddParagraph("Name");
        row1.Cells[1].AddParagraph("Age");
        
        Row row2 = table.AddRow();
        row2.Cells[0].AddParagraph("John");
        row2.Cells[1].AddParagraph("30");
        
        PdfDocumentRenderer pdfRenderer = new PdfDocumentRenderer();
        pdfRenderer.Document = document;
        pdfRenderer.RenderDocument();
        pdfRenderer.PdfDocument.Save("table.pdf");
    }
}
C#

Po (IronPDF):

// NuGet: Install-Package IronPdf
using IronPdf;

class Program
{
    static void Main()
    {
        var renderer = new ChromePdfRenderer();
        string htmlTable = @"
            <table border='1'>
                <tr><th>Name</th><th>Age</th></tr>
                <tr><td>John</td><td>30</td></tr>
            </table>";
        
        var pdf = renderer.RenderHtmlAsPdf(htmlTable);
        pdf.SaveAs("table.pdf");
    }
}

Tworzenie tabel wMigraDocwymaga zrozumienia hierarchii Table, Column, Row i Cell. Należy wyraźnie dodać kolumny za pomocą AddColumn(), utworzyć wiersze za pomocą AddRow(), uzyskać dostęp do komórek za pomocą indeksu z Cells[n] i dodać zawartość za pomocą AddParagraph(). Obramowanie jest ustawiane za pomocą table.Borders.Width.

IronPDF wykorzystuje standardową składnię tabel HTML, znaną każdemu programiście stron internetowych. Atrybut border='1' zapewnia obramowanie, elementy <th> tworzą komórki nagłówka, a elementy <td> tworzą komórki danych. Można dodać CSS w celu uzyskania zaawansowanych stylów, takich jak paski zebry, efekty najechania kursorem lub responsywne układy. Dowiedz się więcej o tworzeniu tabel w plikach PDF.

Przykład 3: Nagłówki i stopki z numerami stron

Przed (MigraDoc):

// NuGet: Install-Package PDFsharp-MigraDoc-GDI
using MigraDoc.DocumentObjectModel;
using MigraDoc.Rendering;

class Program
{
    static void Main()
    {
        Document document = new Document();
        Section section = document.AddSection();
        
        // Add header
        Paragraph headerPara = section.Headers.Primary.AddParagraph();
        headerPara.AddText("Document Header");
        headerPara.Format.Font.Size = 12;
        headerPara.Format.Alignment = ParagraphAlignment.Center;
        
        // Add footer
        Paragraph footerPara = section.Footers.Primary.AddParagraph();
        footerPara.AddText("Page ");
        footerPara.AddPageField();
        footerPara.Format.Alignment = ParagraphAlignment.Center;
        
        // Add content
        section.AddParagraph("Main content of the document");
        
        PdfDocumentRenderer pdfRenderer = new PdfDocumentRenderer();
        pdfRenderer.Document = document;
        pdfRenderer.RenderDocument();
        pdfRenderer.PdfDocument.Save("header-footer.pdf");
    }
}
C#

Po (IronPDF):

// NuGet: Install-Package IronPdf
using IronPdf;

class Program
{
    static void Main()
    {
        IronPdf.License.LicenseKey = "YOUR-LICENSE-KEY";
        var renderer = new ChromePdfRenderer();
        renderer.RenderingOptions.TextHeader = new TextHeaderFooter
        {
            CenterText = "Document Header"
        };
        renderer.RenderingOptions.TextFooter = new TextHeaderFooter
        {
            CenterText = "Page {page}"
        };

        var pdf = renderer.RenderHtmlAsPdf("<h1>Main content of the document</h1>");
        pdf.SaveAs("header-footer.pdf");
    }
}

Nagłówki i stopkiMigraDocwymagają dostępu do section.Headers.Primary i section.Footers.Primary, tworzenia akapitów w ich obrębie, dodawania tekstu za pomocą AddText() oraz używania specjalnych metod, takich jak AddPageField(), do dynamicznej zawartości. Wyrównanie wymaga ustawienia Format.Alignment.

IronPDF konfiguruje nagłówki i stopki w RenderingOptions.TextHeader / RenderingOptions.TextFooter za pomocą TextHeaderFooter, z regionami LeftText, CenterText i RightText. Ustawienie zastępcze {page} automatycznie wstawia bieżącą numerację strony. Do bogatszych układów używaj HtmlHeader / HtmlFooter z HtmlHeaderFooter dla pełnej obsługi HTML/CSS. Aby zapoznać się z opcjami zaawansowanymi, zapoznaj się z dokumentacją dotyczącą nagłówków i stopek.


Ważne uwagi dotyczące migracji

Składnia symbolu zastępczego numeru strony

Najważniejszą zmianą w nagłówkach i stopkach jest składnia symboli zastępczych:

//MigraDocfield methods:
footerPara.AddPageField();       // Current page
footerPara.AddNumPagesField();   // Total pages

//IronPDF placeholders:
"Page {page} of {total-pages}"
C#

Właściwości formatowania do CSS

WłaściwościMigraDocFormat odwzorowują się na CSS:

// MigraDoc:
paragraph.Format.Font.Size = 16;
paragraph.Format.Font.Bold = true;
paragraph.Format.Alignment = ParagraphAlignment.Center;

//IronPDF(CSS):
<p style="font-size: 16pt; font-weight: bold; text-align: center;">

Przeliczanie jednostek

MigraDoc wykorzystuje różne jednostki; W IronPDF marginesy są podawane w milimetrach:

  • "1 cm" = 10 mm
  • "1in" = 25,4mm
  • "72pt" = 25,4 mm
// MigraDoc:
table.AddColumn("3cm");

//IronPDF(CSS):
<th style="width: 3cm;">

Zmiana wzorca renderowania

Cały wzorzec renderowania ulega zmianie:

//MigraDocpattern (DELETE):
PdfDocumentRenderer pdfRenderer = new PdfDocumentRenderer();
pdfRenderer.Document = document;
pdfRenderer.RenderDocument();
pdfRenderer.PdfDocument.Save("output.pdf");

//IronPDF pattern:
var pdf = renderer.RenderHtmlAsPdf(html);
pdf.SaveAs("output.pdf");
C#

Rozwiązywanie problemów

Problem 1: Nie znaleziono dokumentu/sekcji

Problem: Klasy Document i Section nie istnieją w IronPDF.

Rozwiązanie: Zastąp strukturą HTML:

// MigraDoc
Document document = new Document();
Section section = document.AddSection();

// IronPDF
string html = "<html><body>...</body></html>";
var pdf = renderer.RenderHtmlAsPdf(html);

Problem 2: Nie znaleziono akapitu AddParagraph

Problem: Metoda AddParagraph() nie istnieje.

Rozwiązanie: Użyj elementów HTML:

// MigraDoc
section.AddParagraph("Hello World");

// IronPDF
"<p>Hello World</p>"

Problem 3: Nie znaleziono PdfDocumentRenderer

Problem: Klasa PdfDocumentRenderer nie istnieje.

Rozwiązanie: Użyj ChromePdfRenderer:

// MigraDoc
PdfDocumentRenderer pdfRenderer = new PdfDocumentRenderer();

// IronPDF
var renderer = new ChromePdfRenderer();

Problem 4: AddPageField nie działa

Problem: Metoda AddPageField() nie istnieje.

Rozwiązanie: Użyj składni symboli zastępczych IronPDF:

// MigraDoc
footerPara.AddPageField();

// IronPDF
renderer.RenderingOptions.TextFooter = new TextHeaderFooter
{
    CenterText = "Page {page}"
};

Lista kontrolna migracji

Przed migracją

  • Zidentyfikuj wszystkie instrukcje using MigraDoc
  • Struktury tabel w dokumentach (kolumny, wiersze, stylizacja)
  • Zwróć uwagę na zawartość nagłówków/stopek oraz wykorzystanie pól na stronie
  • Wymień niestandardowe style zdefiniowane za pomocą document.Styles
  • Uzyskaj klucz licencyjny IronPDF

Zmiany w pakiecie

  • Usuń pakiety PDFsharp-MigraDoc, PDFsharp-MigraDoc-GDI i PDFsharp-MigraDoc-WPF
  • Zainstaluj paczkę NuGet IronPdf: dotnet add package IronPdf
  • Zaktualizuj importy przestrzeni nazw

Zmiany w kodzie

  • Dodaj konfigurację klucza licencyjnego podczas uruchamiania
  • Zamień Section na strukturę HTML
  • Konwertuj AddParagraph() to HTML <p> elements
  • Konwertuj Cell na strukturę <table> HTML
  • Zamień AddPageField() na zastępstwo {page}
  • Zamień AddNumPagesField() na zastępstwo {total-pages}
  • Konwertuj właściwości Format na style CSS
  • Zamień PdfDocumentRenderer z ChromePdfRenderer

Testowanie

  • Porównaj wygląd starych i nowych plików PDF
  • Sprawdź, czy podziały stron działają poprawnie
  • Sprawdź renderowanie nagłówków/stopek oraz numerów stron
  • Sprawdź formatowanie tabeli i obramowania
  • Przetestuj na złożonych dokumentach wielostronicowych

Po migracji

  • Usuń dokumentację związaną z MigraDoc
  • Aktualizacja materiałów szkoleniowych dla zespołu
  • Dokumentowanie nowych lokalizacji szablonów HTML

Zwróć uwagę: MigraDoc oraz PDFSharp są zarejestrowanymi znakami towarowymi ich odpowiednich właścicieli. Ta strona nie jest powiązana, popierana ani sponsorowana przez empira Software GmbH. Wszystkie nazwy produktów, logo i marki są własnością ich odpowiednich właścicieli. Porównania mają charakter wyłącznie informacyjny i odzwierciedlają informacje dostępne publicznie w momencie pisania.
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ęczników.

...
Czytaj więcej

Powiązane artykuły

Key in blue circle

Uzyskaj natychmiast swój darmowy 30-dniowy Klucz Testowy.

Your trial license will be sent to your email address

Brak ograniczeń. 100% dostępności. Bez karty kredytowej.

bullet_checkedNie wymaga karty kredytowej ani tworzenia kontaBrak ograniczeń. 100% dostępności. Bez karty kredytowej.
  • Logo Aetna
  • Logo NASA
  • Logo GE
  • Logo Porsche
  • Logo USDA
  • Logo Qatar
Join Millions of Engineers who’ve tried IronPDF
Zarezerwuj swoje darmowe Demo na żywo
Booking Badge

Zaufane przez miliony inżynierów na całym świecie

Logotypy klientów Iron Software
Otrzymaj swoje Konsultacja Bez Zobowiązań
Wypełnij poniższy formularz lub wyślij e-mail na sales@ironsoftware.com
Twoje dane zawsze będą utrzymywane w tajemnicy.
Zaufane przez miliony inżynierów na całym świecie
Logotypy klientów Iron Software
Otrzymaj swój darmowy Klucz Próbny na 30 dni natychmiast.
Nie wymaga karty kredytowej ani tworzenia konta