using IronPdf;
// Disable local disk access or cross-origin requests
Installation.EnableWebSecurity = true;
// Instantiate Renderer
var renderer = new ChromePdfRenderer();
// Create a PDF from a HTML string using C#
var pdf = renderer.RenderHtmlAsPdf("<h1>Hello World</h1>");
// Export to a file or Stream
pdf.SaveAs("output.pdf");
// Advanced Example with HTML Assets
// Load external html assets: Images, CSS and JavaScript.
// An optional BasePath 'C:\site\assets\' is set as the file location to load assets from
var myAdvancedPdf = renderer.RenderHtmlAsPdf("<img src='icons/iron.png'>", @"C:\site\assets\");
myAdvancedPdf.SaveAs("html-with-assets.pdf");
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:
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.
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.
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.
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.
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.
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
Funkcja
MigraDoc
IronPDF
Definicja treści
Programowe (dokument/sekcja/akapit)
HTML/CSS
Krzywa uczenia się
Steep (zastrzeżony DOM)
Łatwe (umiejętności internetowe)
Stylizacja
Ograniczone właściwości
Pełny CSS3
JavaScript
None
Pełne wykonanie w Chromium
Tabele
Ręczne definiowanie kolumn/wierszy
HTML
z CSS
Wykresy
Podstawowe wykresyMigraDoc
Dowolna biblioteka do tworzenia wykresów wJavaScript
Obrazy
Ręczne dopasowywanie rozmiaru/pozycjonowanie
Standardowy HTML
Responsywne układy
Nieobsługiwane
Flexbox, Grid
Licencja
Open 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
Funkcja
Złożoność migracji
Prosty tekst
Bardzo niski
Tabele
Niski
Nagłówki/stopki
Niski
Style
Medium
Obrazy
Niski
Wykresy
Medium
Zmiana paradygmatu
Podstawową zmianą w tej migracjiMigraDocjest Shift od programowego tworzenia dokumentów do renderowania opartego na HTML:
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");
}
}
// 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");
}
}
Imports MigraDoc.DocumentObjectModel
Imports MigraDoc.Rendering
Imports System.Diagnostics
Class Program
Shared Sub Main()
'MigraDoc doesn't support HTML directly
' Must manually create document structure
Dim document As New Document()
Dim section As Section = document.AddSection()
Dim paragraph As Paragraph = section.AddParagraph()
paragraph.AddFormattedText("Hello World", TextFormat.Bold)
paragraph.Format.Font.Size = 16
Dim pdfRenderer As New PdfDocumentRenderer()
pdfRenderer.Document = document
pdfRenderer.RenderDocument()
pdfRenderer.PdfDocument.Save("output.pdf")
End Sub
End Class
$vbLabelText $csharpLabel
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");
}
}
// 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");
}
}
Imports IronPdf
Class Program
Shared Sub Main()
Dim renderer = New ChromePdfRenderer()
Dim pdf = renderer.RenderHtmlAsPdf("<h1>Hello World</h1>")
pdf.SaveAs("output.pdf")
End Sub
End Class
$vbLabelText $csharpLabel
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");
}
}
// 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");
}
}
Imports MigraDoc.DocumentObjectModel
Imports MigraDoc.DocumentObjectModel.Tables
Imports MigraDoc.Rendering
Class Program
Shared Sub Main()
Dim document As New Document()
Dim section As Section = document.AddSection()
Dim table As Table = section.AddTable()
table.Borders.Width = 0.75
Dim column1 As Column = table.AddColumn("3cm")
Dim column2 As Column = table.AddColumn("3cm")
Dim row1 As Row = table.AddRow()
row1.Cells(0).AddParagraph("Name")
row1.Cells(1).AddParagraph("Age")
Dim row2 As Row = table.AddRow()
row2.Cells(0).AddParagraph("John")
row2.Cells(1).AddParagraph("30")
Dim pdfRenderer As New PdfDocumentRenderer()
pdfRenderer.Document = document
pdfRenderer.RenderDocument()
pdfRenderer.PdfDocument.Save("table.pdf")
End Sub
End Class
$vbLabelText $csharpLabel
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");
}
}
// 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");
}
}
Imports IronPdf
Class Program
Shared Sub Main()
Dim renderer = New ChromePdfRenderer()
Dim htmlTable As String = "
<table border='1'>
<tr><th>Name</th><th>Age</th></tr>
<tr><td>John</td><td>30</td></tr>
</table>"
Dim pdf = renderer.RenderHtmlAsPdf(htmlTable)
pdf.SaveAs("table.pdf")
End Sub
End Class
$vbLabelText $csharpLabel
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
tworzą komórki nagłówka, a elementy
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");
}
}
// 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");
}
}
Imports MigraDoc.DocumentObjectModel
Imports MigraDoc.Rendering
Class Program
Shared Sub Main()
Dim document As New Document()
Dim section As Section = document.AddSection()
' Add header
Dim headerPara As Paragraph = section.Headers.Primary.AddParagraph()
headerPara.AddText("Document Header")
headerPara.Format.Font.Size = 12
headerPara.Format.Alignment = ParagraphAlignment.Center
' Add footer
Dim footerPara As Paragraph = section.Footers.Primary.AddParagraph()
footerPara.AddText("Page ")
footerPara.AddPageField()
footerPara.Format.Alignment = ParagraphAlignment.Center
' Add content
section.AddParagraph("Main content of the document")
Dim pdfRenderer As New PdfDocumentRenderer()
pdfRenderer.Document = document
pdfRenderer.RenderDocument()
pdfRenderer.PdfDocument.Save("header-footer.pdf")
End Sub
End Class
$vbLabelText $csharpLabel
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");
}
}
// 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");
}
}
Imports IronPdf
Class Program
Shared Sub Main()
IronPdf.License.LicenseKey = "YOUR-LICENSE-KEY"
Dim renderer As New ChromePdfRenderer()
renderer.RenderingOptions.TextHeader = New TextHeaderFooter With {
.CenterText = "Document Header"
}
renderer.RenderingOptions.TextFooter = New TextHeaderFooter With {
.CenterText = "Page {page}"
}
Dim pdf = renderer.RenderHtmlAsPdf("<h1>Main content of the document</h1>")
pdf.SaveAs("header-footer.pdf")
End Sub
End Class
$vbLabelText $csharpLabel
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}"
//MigraDocfield methods:
footerPara.AddPageField(); // Current page
footerPara.AddNumPagesField(); // Total pages
//IronPDF placeholders:
"Page {page} of {total-pages}"
' MigraDocfield methods:
footerPara.AddPageField() ' Current page
footerPara.AddNumPagesField() ' Total pages
' IronPDF placeholders:
"Page {page} of {total-pages}"
//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");
//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");
' MigraDoc pattern (DELETE):
Dim pdfRenderer As New PdfDocumentRenderer()
pdfRenderer.Document = document
pdfRenderer.RenderDocument()
pdfRenderer.PdfDocument.Save("output.pdf")
' IronPDF pattern:
Dim pdf = renderer.RenderHtmlAsPdf(html)
pdf.SaveAs("output.pdf")
$vbLabelText $csharpLabel
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);
// MigraDoc
Document document = new Document();
Section section = document.AddSection();
// IronPDF
string html = "<html><body>...</body></html>";
var pdf = renderer.RenderHtmlAsPdf(html);
Imports MigraDoc.DocumentObjectModel
Imports IronPdf
Dim document As New Document()
Dim section As Section = document.AddSection()
Dim html As String = "<html><body>...</body></html>"
Dim pdf = renderer.RenderHtmlAsPdf(html)
Dodaj konfigurację klucza licencyjnego podczas uruchamiania
Zamień Section na strukturę HTML
Konwertuj AddParagraph() to HTML elements
Konwertuj Cell na strukturę
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 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ę...