IronPDF vs GemBox.Pdf: Kompletny przewodnik porównawczy bibliotek PDF .NET do konwersji HTML na PDF
Podczas tworzenia aplikacji .NET, które wymagają generowania i edycji plików PDF, wybór odpowiedniej biblioteki C# do obsługi plików PDF może znacząco wpłynąć na sukces projektu. W tym kompleksowym porównaniu przeanalizowano IronPDF i GemBox.Pdf, dwie czołowe biblioteki PDF dla platformy .NET, aby pomóc programistom w podjęciu świadomej decyzji w oparciu o funkcje, wydajność, ceny i rzeczywiste przypadki użycia.
Szybki przegląd porównawczy
| Kategoria | Funkcja/Aspekt | IronPDF | GemBox.Pdf | Kluczowa zaleta |
|---|---|---|---|---|
| Podstawowa architektura | Design Philosophy | HTML-first, renderowanie w przeglądarce Chrome | Manipulacja plikami PDF | Context-dependent |
| API Complexity | Simple methods like RenderHtmlAsPdf() |
Obiekty PDF niskiego poziomu | IronPDF: Faster development | |
| Krzywa uczenia się | Zazwyczaj 1–2 dni | 3-5 days typical | IronPDF: Quicker adoption | |
| Obsługa platform | Wieloplatformowe | Windows, Linux, macOS, Docker | Windows, Linux, macOS, Android, iOS | GemBox: Obsługa urządzeń mobilnych |
| Wersje .NET | .NET 10, 9, 8, 7, 6, 5, Core 3.1+, Framework 4.6.2+ | .NET 6, .NET Standard 2.0, Framework 3.5+ | IronPDF: Najnowsza obsługa platformy .NET | |
| Platformy chmurowe | Zoptymalizowane pod kątem Azure/AWS | Standardowa obsługa chmury | IronPDF: Gotowy do pracy w chmurze | |
| HTML do PDF | Silnik renderujący | Pełny silnik Chrome V8 | Brak wbudowanej obsługi HTML* | IronPDF: Natywny konwerter HTML na PDF |
| Obsługa CSS3/HTML5 | Pełne wsparcie | Wymaga GemBox.Document | IronPDF: Nowoczesne standardy internetowe | |
| Wykonanie JavaScript | Pełna obsługa JavaScript | Brak obsługi JavaScript | IronPDF: Dynamiczna treść | |
| Szybkość renderowania | ~125 ms (typowo) | N/A (brak obsługi HTML) | IronPDF: Szybkie renderowanie | |
| Doświadczenie programisty | Przykłady kodu | 100+ ready-to-run samples | Dostępnych jest ponad 100 przykładów | Oba: Obszerne zasoby |
| Dokumentacja | Samouczki, instrukcje, filmy | Dokumentacja API | IronPDF: Wiele ścieżek nauki | |
| Manipulacja treścią | Łączenie/dzielenie plików PDF | Wbudowane metody | Wbudowane metody | Oba: Standardowe funkcje |
| Wyodrębnianie tekstu | Obsługa Unicode, integracja OCR | Obsługa Unicode, wbudowany OCR | GemBox: Wbudowany moduł OCR | |
| Obsługa formularzy | Formularze HTML do formularzy PDF | Tworzenie, wypełnianie i spłaszczanie formularzy | Context-dependent | |
| Wskaźniki wydajności | Wykorzystanie pamięci | Zazwyczaj poniżej 10 MB | Niewielkie obciążenie pamięci | Oba: Efektywne |
| Obsługa wątków | Zoptymalizowane pod kątem natywnego async/await | Operacje bezpieczne dla wątków | IronPDF: Better async support | |
| Security & Encryption | Poziomy szyfrowania | AES-256, niestandardowe procedury obsługi | Standard AES-256 | Oba: Standard branżowy |
| Podpisy cyfrowe | Integrated, visual signatures | Obsługa podpisu cyfrowego | Oba: Obsługa podpisów | |
| Licensing & Pricing | Entry Level | Lite: $799 (1 dev, 1 project) | Pojedynczy programista: 890 USD (1 programista, nieograniczona liczba projektów) | IronPDF: Niższy koszt wejścia |
| Redistribution | +$1,999 royalty-free | W cenie, nieograniczona liczba wdrożeń | GemBox: Lepsze warunki wdrożenia | |
| Suite Option | Iron Suite: $1,498 (9 products) | Pakiet GemBox: 2200 USD (7 produktów) | IronPDF: lepszy zestaw funkcji | |
| Wsparcie | Wsparcie techniczne w cenie | Yes, 24/5 engineering support | Tak, 1 rok profesjonalnego wsparcia | Oba: Dobre wsparcie |
| Czas odpowiedzi | 24-48 hours typical | W ciągu 1 dnia roboczego | Oba: Szybka odpowiedź | |
| Najlepsze dla | Przykłady zastosowań | HTML do PDF, aplikacje internetowe, raporty | Manipulacja plikami PDF, formularze, OCR | Context-dependent |
Czym jest biblioteka IronPDF?
IronPDF wyróżnia się jako kompleksowa biblioteka .NET do obsługi plików PDF, zaprojektowana specjalnie po to, aby konwersja HTML do PDF przebiegała płynnie dla programistów. Oparty na silniku renderującym Chrome, IronPDF zmienia sposób, w jaki programiści podchodzą do generowania plików PDF w aplikacjach napisanych w językach C#, F# i VB.NET.
Filozofia biblioteki koncentruje się na wykorzystaniu istniejących umiejętności w zakresie tworzenia stron internetowych. Zamiast uczyć się skomplikowanych interfejsów API plików PDF, programiści mogą używać znanego im HTML, CSS i JavaScript do tworzenia zaawansowanych dokumentów PDF. Takie podejście znacznie skraca czas tworzenia oprogramowania, zapewniając jednocześnie idealne odwzorowanie graficzne zgodne z nowoczesnymi standardami internetowymi.
Podstawowe funkcje IronPDF
IronPDF oferuje szeroki zestaw funkcji, który obejmuje praktycznie każde zadanie związane z plikami PDF, z jakim mogą spotkać się programiści:
Doskonała konwersja HTML do PDF
- Silnik Chrome V8: renderuje HTML przy użyciu tego samego silnika co Google Chrome, zapewniając ponad 98% zgodności z przeglądarką
- Pełna obsługa CSS3/HTML5: Pełna obsługa nowoczesnych standardów internetowych, w tym flexbox, grid i animacji
- Wykonanie JavaScript: Przetwarza JavaScript przed renderowaniem, doskonale przechwytując treści dynamiczne
- Responsywny projekt: Obsługuje responsywne układy z konfigurowalnymi ustawieniami okna wyświetlania
- Obsługa czcionek internetowych: Dokładne renderowanie czcionek Google, czcionek niestandardowych i czcionek ikonowych
Zaawansowana obróbka plików PDF
- Łączenie i dzielenie plików PDF: Łączenie wielu plików PDF lub wyodrębnianie określonych stron za pomocą prostych wywołań metod
- Podpisy cyfrowe: stosowanie podpisów kryptograficznych z obsługą certyfikatów
- Zarządzanie formularzami: Tworzenie formularzy do wypełnienia na podstawie kodu HTML lub edycja istniejących formularzy PDF
- Znak wodny i pieczątki: Dodawaj tekstowe lub graficzne znaki wodne z kontrolą przezroczystości
- Nagłówki i stopki: dynamiczne nagłówki/stopki z numeracją stron
Bezpieczeństwo i zgodność z przepisami
- Szyfrowanie: szyfrowanie AES-256 z niestandardowymi ustawieniami uprawnień
- Zgodność z PDF/A: Generuj pliki PDF o jakości archiwalnej do długoterminowego przechowywania
- Redakcja: Trwałe usunięcie treści wrażliwych
- Ochrona hasłem: Obsługa haseł użytkownika i właściciela z precyzyjnymi uprawnieniami
Przykład kodu IronPDF: HTML do PDF z zaawansowanymi funkcjami
using IronPdf;
using IronPdf.Rendering;
// Configure the Chrome renderer with advanced options
var renderer = new ChromePdfRenderer
{
RenderingOptions = new ChromePdfRenderOptions
{
// Set paper orientation and size
PaperOrientation = PdfPaperOrientation.Portrait,
PaperSize = PdfPaperSize.A4,
// Configure margins (in millimeters)
MarginTop = 25,
MarginBottom = 25,
MarginLeft = 20,
MarginRight = 20,
// Enable JavaScript execution
EnableJavaScript = true,
RenderDelay = 1000, // Wait 1 second for JS to complete
// Print background colors and images
PrintHtmlBackgrounds = true,
// Create PDF forms from HTML form elements
CreatePdfFormsFromHtml = true,
// Custom header and footer
HtmlHeader = new HtmlHeaderFooter
{
Height = 20,
HtmlFragment = "<div style='text-align: center; font-size: 12px;'>Company Report - {page} of {total-pages}</div>",
DrawDividerLine = true
},
HtmlFooter = new HtmlHeaderFooter
{
Height = 15,
HtmlFragment = "<div style='text-align: center; font-size: 10px;'>© 2025 Company Name. Confidential.</div>"
}
}
};
// Convert complex HTML with CSS and JavaScript
string htmlContent = @"
<!DOCTYPE html>
<html>
<head>
<style>
body { font-family: 'Segoe UI', Arial, sans-serif; line-height: 1.6; }
.invoice-header {
background: linear-gradient(135deg, #667eea 0%, #764ba2 100%);
color: white;
padding: 30px;
border-radius: 10px;
margin-bottom: 30px;
}
.data-table {
width: 100%;
border-collapse: collapse;
margin-top: 20px;
}
.data-table th {
background-color: #f8f9fa;
padding: 12px;
text-align: left;
border-bottom: 2px solid #dee2e6;
}
.data-table td {
padding: 10px;
border-bottom: 1px solid #dee2e6;
}
.total-section {
margin-top: 30px;
text-align: right;
font-size: 18px;
font-weight: bold;
}
@media print {
.no-print { display: none; }
}
</style>
</head>
<body>
<div class='invoice-header'>
<h1>Invoice #INV-2025-001</h1>
<p>Date: <span id='current-date'></span></p>
</div>
<table class='data-table'>
<thead>
<tr>
<th>Item Description</th>
<th>Quantity</th>
<th>Unit Price</th>
<th>Total</th>
</tr>
</thead>
<tbody>
<tr>
<td>Professional PDF Library License</td>
<td>1</td>
<td>$799.00</td>
<td>$799.00</td>
</tr>
<tr>
<td>Priority Support (1 Year)</td>
<td>1</td>
<td>$299.00</td>
<td>$299.00</td>
</tr>
</tbody>
</table>
<div class='total-section'>
<p>Subtotal: $1,048.00</p>
<p>Tax (8%): $83.84</p>
<p style='color: #667eea; font-size: 24px;'>Total: $1,131.84</p>
</div>
<script>
// Dynamic date insertion
document.getElementById('current-date').textContent = new Date().toLocaleDateString('en-US', {
year: 'numeric',
month: 'long',
day: 'numeric'
});
</script>
</body>
</html>";
// Render the HTML to PDF
PdfDocument pdf = renderer.RenderHtmlAsPdf(htmlContent);
// Apply additional security settings
pdf.SecuritySettings.OwnerPassword = "admin123";
pdf.SecuritySettings.UserPassword = "user123";
pdf.SecuritySettings.AllowUserPrinting = PdfPrintSecurity.NoPrint;
pdf.SecuritySettings.AllowUserCopyPasteContent = false;
pdf.SecuritySettings.AllowUserAnnotations = false;
pdf.SecuritySettings.AllowUserFormData = true;
// Add metadata
pdf.MetaData.Author = "Invoice System";
pdf.MetaData.Title = "Invoice INV-2025-001";
pdf.MetaData.Subject = "Customer Invoice";
pdf.MetaData.Keywords = "invoice, payment, 2025";
pdf.MetaData.CreationDate = DateTime.Now;
// Save the PDF
pdf.SaveAs("invoice-2025-001.pdf");
// Optional: Save as PDF/A for archival
pdf.SaveAsPdfA("invoice-2025-001-archive.pdf", PdfAVersions.PdfA3);
using IronPdf;
using IronPdf.Rendering;
// Configure the Chrome renderer with advanced options
var renderer = new ChromePdfRenderer
{
RenderingOptions = new ChromePdfRenderOptions
{
// Set paper orientation and size
PaperOrientation = PdfPaperOrientation.Portrait,
PaperSize = PdfPaperSize.A4,
// Configure margins (in millimeters)
MarginTop = 25,
MarginBottom = 25,
MarginLeft = 20,
MarginRight = 20,
// Enable JavaScript execution
EnableJavaScript = true,
RenderDelay = 1000, // Wait 1 second for JS to complete
// Print background colors and images
PrintHtmlBackgrounds = true,
// Create PDF forms from HTML form elements
CreatePdfFormsFromHtml = true,
// Custom header and footer
HtmlHeader = new HtmlHeaderFooter
{
Height = 20,
HtmlFragment = "<div style='text-align: center; font-size: 12px;'>Company Report - {page} of {total-pages}</div>",
DrawDividerLine = true
},
HtmlFooter = new HtmlHeaderFooter
{
Height = 15,
HtmlFragment = "<div style='text-align: center; font-size: 10px;'>© 2025 Company Name. Confidential.</div>"
}
}
};
// Convert complex HTML with CSS and JavaScript
string htmlContent = @"
<!DOCTYPE html>
<html>
<head>
<style>
body { font-family: 'Segoe UI', Arial, sans-serif; line-height: 1.6; }
.invoice-header {
background: linear-gradient(135deg, #667eea 0%, #764ba2 100%);
color: white;
padding: 30px;
border-radius: 10px;
margin-bottom: 30px;
}
.data-table {
width: 100%;
border-collapse: collapse;
margin-top: 20px;
}
.data-table th {
background-color: #f8f9fa;
padding: 12px;
text-align: left;
border-bottom: 2px solid #dee2e6;
}
.data-table td {
padding: 10px;
border-bottom: 1px solid #dee2e6;
}
.total-section {
margin-top: 30px;
text-align: right;
font-size: 18px;
font-weight: bold;
}
@media print {
.no-print { display: none; }
}
</style>
</head>
<body>
<div class='invoice-header'>
<h1>Invoice #INV-2025-001</h1>
<p>Date: <span id='current-date'></span></p>
</div>
<table class='data-table'>
<thead>
<tr>
<th>Item Description</th>
<th>Quantity</th>
<th>Unit Price</th>
<th>Total</th>
</tr>
</thead>
<tbody>
<tr>
<td>Professional PDF Library License</td>
<td>1</td>
<td>$799.00</td>
<td>$799.00</td>
</tr>
<tr>
<td>Priority Support (1 Year)</td>
<td>1</td>
<td>$299.00</td>
<td>$299.00</td>
</tr>
</tbody>
</table>
<div class='total-section'>
<p>Subtotal: $1,048.00</p>
<p>Tax (8%): $83.84</p>
<p style='color: #667eea; font-size: 24px;'>Total: $1,131.84</p>
</div>
<script>
// Dynamic date insertion
document.getElementById('current-date').textContent = new Date().toLocaleDateString('en-US', {
year: 'numeric',
month: 'long',
day: 'numeric'
});
</script>
</body>
</html>";
// Render the HTML to PDF
PdfDocument pdf = renderer.RenderHtmlAsPdf(htmlContent);
// Apply additional security settings
pdf.SecuritySettings.OwnerPassword = "admin123";
pdf.SecuritySettings.UserPassword = "user123";
pdf.SecuritySettings.AllowUserPrinting = PdfPrintSecurity.NoPrint;
pdf.SecuritySettings.AllowUserCopyPasteContent = false;
pdf.SecuritySettings.AllowUserAnnotations = false;
pdf.SecuritySettings.AllowUserFormData = true;
// Add metadata
pdf.MetaData.Author = "Invoice System";
pdf.MetaData.Title = "Invoice INV-2025-001";
pdf.MetaData.Subject = "Customer Invoice";
pdf.MetaData.Keywords = "invoice, payment, 2025";
pdf.MetaData.CreationDate = DateTime.Now;
// Save the PDF
pdf.SaveAs("invoice-2025-001.pdf");
// Optional: Save as PDF/A for archival
pdf.SaveAsPdfA("invoice-2025-001-archive.pdf", PdfAVersions.PdfA3);
Imports IronPdf
Imports IronPdf.Rendering
' Configure the Chrome renderer with advanced options
Dim renderer As New ChromePdfRenderer With {
.RenderingOptions = New ChromePdfRenderOptions With {
' Set paper orientation and size
.PaperOrientation = PdfPaperOrientation.Portrait,
.PaperSize = PdfPaperSize.A4,
' Configure margins (in millimeters)
.MarginTop = 25,
.MarginBottom = 25,
.MarginLeft = 20,
.MarginRight = 20,
' Enable JavaScript execution
.EnableJavaScript = True,
.RenderDelay = 1000, ' Wait 1 second for JS to complete
' Print background colors and images
.PrintHtmlBackgrounds = True,
' Create PDF forms from HTML form elements
.CreatePdfFormsFromHtml = True,
' Custom header and footer
.HtmlHeader = New HtmlHeaderFooter With {
.Height = 20,
.HtmlFragment = "<div style='text-align: center; font-size: 12px;'>Company Report - {page} of {total-pages}</div>",
.DrawDividerLine = True
},
.HtmlFooter = New HtmlHeaderFooter With {
.Height = 15,
.HtmlFragment = "<div style='text-align: center; font-size: 10px;'>© 2025 Company Name. Confidential.</div>"
}
}
}
' Convert complex HTML with CSS and JavaScript
Dim htmlContent As String = "
<!DOCTYPE html>
<html>
<head>
<style>
body { font-family: 'Segoe UI', Arial, sans-serif; line-height: 1.6; }
.invoice-header {
background: linear-gradient(135deg, #667eea 0%, #764ba2 100%);
color: white;
padding: 30px;
border-radius: 10px;
margin-bottom: 30px;
}
.data-table {
width: 100%;
border-collapse: collapse;
margin-top: 20px;
}
.data-table th {
background-color: #f8f9fa;
padding: 12px;
text-align: left;
border-bottom: 2px solid #dee2e6;
}
.data-table td {
padding: 10px;
border-bottom: 1px solid #dee2e6;
}
.total-section {
margin-top: 30px;
text-align: right;
font-size: 18px;
font-weight: bold;
}
@media print {
.no-print { display: none; }
}
</style>
</head>
<body>
<div class='invoice-header'>
<h1>Invoice #INV-2025-001</h1>
<p>Date: <span id='current-date'></span></p>
</div>
<table class='data-table'>
<thead>
<tr>
<th>Item Description</th>
<th>Quantity</th>
<th>Unit Price</th>
<th>Total</th>
</tr>
</thead>
<tbody>
<tr>
<td>Professional PDF Library License</td>
<td>1</td>
<td>$799.00</td>
<td>$799.00</td>
</tr>
<tr>
<td>Priority Support (1 Year)</td>
<td>1</td>
<td>$299.00</td>
<td>$299.00</td>
</tr>
</tbody>
</table>
<div class='total-section'>
<p>Subtotal: $1,048.00</p>
<p>Tax (8%): $83.84</p>
<p style='color: #667eea; font-size: 24px;'>Total: $1,131.84</p>
</div>
<script>
// Dynamic date insertion
document.getElementById('current-date').textContent = new Date().toLocaleDateString('en-US', {
year: 'numeric',
month: 'long',
day: 'numeric'
});
</script>
</body>
</html>"
' Render the HTML to PDF
Dim pdf As PdfDocument = renderer.RenderHtmlAsPdf(htmlContent)
' Apply additional security settings
pdf.SecuritySettings.OwnerPassword = "admin123"
pdf.SecuritySettings.UserPassword = "user123"
pdf.SecuritySettings.AllowUserPrinting = PdfPrintSecurity.NoPrint
pdf.SecuritySettings.AllowUserCopyPasteContent = False
pdf.SecuritySettings.AllowUserAnnotations = False
pdf.SecuritySettings.AllowUserFormData = True
' Add metadata
pdf.MetaData.Author = "Invoice System"
pdf.MetaData.Title = "Invoice INV-2025-001"
pdf.MetaData.Subject = "Customer Invoice"
pdf.MetaData.Keywords = "invoice, payment, 2025"
pdf.MetaData.CreationDate = DateTime.Now
' Save the PDF
pdf.SaveAs("invoice-2025-001.pdf")
' Optional: Save as PDF/A for archival
pdf.SaveAsPdfA("invoice-2025-001-archive.pdf", PdfAVersions.PdfA3)
Ten przykład pokazuje, jak IronPDF radzi sobie ze złożonymi układami HTML z gradientami, tabelami, dynamiczną zawartością JavaScript oraz zaawansowanymi funkcjami PDF, takimi jak ustawienia zabezpieczeń i metadane. Biblioteka przetwarza wszystko płynnie, tworząc profesjonalny plik PDF, który dokładnie odpowiada projektowi HTML.
Czym jest biblioteka GemBox.PDF?
GemBox.Pdf stanowi inne podejście do manipulacji plikami PDF w środowisku .NET. Zamiast skupiać się na konwersji HTML do PDF, GemBox.Pdf specjalizuje się w operacjach na plikach PDF na niskim poziomie oraz bezpośredniej manipulacji plikami PDF. Dzięki temu rozwiązanie to szczególnie sprawdza się w sytuacjach, w których programiści potrzebują precyzyjnej kontroli nad strukturą i treścią plików PDF.
Biblioteka doskonale radzi sobie z istniejącymi dokumentami PDF, oferując rozbudowane funkcje do odczytu, edycji i manipulacji plikami PDF na poziomie szczegółowym. GemBox.PDF działa bez zależności od programu Adobe Acrobat, co ułatwia wdrażanie w różnych środowiskach.
Podstawowe funkcje GemBox.PDF
GemBox.Pdf zapewnia kompleksowe możliwości manipulacji plikami PDF:
Operacje na dokumentach PDF
- Odczyt i zapis plików PDF: bezpośredni dostęp do struktury i treści plików PDF
- Łączenie i dzielenie: łączenie wielu plików PDF lub wyodrębnianie określonych stron
- Klonowanie stron: importowanie stron między różnymi dokumentami PDF
- Zarządzanie stronami: programowe dodawanie, usuwanie lub zmiana kolejności stron
Pobieranie i przetwarzanie treści
- Wyodrębnianie tekstu: Wyodrębnianie tekstu Unicode wraz z informacjami o położeniu
- Wyodrębnianie obrazów: Pobieranie obrazów osadzonych w dokumentach PDF
- Obsługa OCR: wbudowane optyczne rozpoznawanie znaków dla zeskanowanych dokumentów
- Redagowanie treści: Trwałe usuwanie informacji wrażliwych
Formularze i interaktywność
- Formularze interaktywne: Twórz, wypełniaj, spłaszczaj i eksportuj formularze PDF
- Zarządzanie polami formularzy: programowy dostęp do wszystkich typów pól formularzy
- Adnotacje: Dodaj hiperłącza i inne adnotacje do pliku PDF
Grafika i elementy wizualne
- Operacje rysowania: dodawanie tekstu, obrazów i grafiki wektorowej
- Kształty i ścieżki: Twórz złożone rysunki wektorowe
- Znaki wodne: Dodawanie tekstowych i graficznych znaków wodnych
- Grupy treści: Organizuj treści w logiczne grupy
GemBox.Pdf Przykład kodu: Manipulacja plikami PDF i formularzami
using GemBox.Pdf;
using GemBox.Pdf.Content;
using GemBox.Pdf.Forms;
using GemBox.Pdf.Security;
// Set license (use FREE-LIMITED-KEY for evaluation)
ComponentInfo.SetLicense("FREE-LIMITED-KEY");
// Create a new PDF document from scratch
using (var document = new PdfDocument())
{
// Add a page with custom size
var page = document.Pages.Add();
// Create formatted text with multiple styles
using (var formattedText = new PdfFormattedText())
{
formattedText.FontSize = 24;
formattedText.FontFamily = new PdfFontFamily("Arial");
formattedText.Color = PdfColor.FromRgb(0.2, 0.2, 0.6);
formattedText.AppendLine("GemBox.Pdf Document Example");
formattedText.FontSize = 12;
formattedText.Color = PdfColor.FromRgb(0, 0, 0);
formattedText.AppendLine("This document demonstrates PDF creation and manipulation features.");
// Draw text to the page
page.Content.DrawText(formattedText, new PdfPoint(50, 700));
}
// Add a form to the document
var form = document.Form;
// Create text field
var textField = form.Fields.AddText(page, 50, 600, 200, 30);
textField.Name = "CustomerName";
textField.Value = "Enter your name";
textField.Format.Fill.Color = PdfColor.FromRgb(0.95, 0.95, 0.95);
// Create checkbox
var checkBox = form.Fields.AddCheck(page, 50, 550, 20, 20);
checkBox.Name = "Agreement";
checkBox.Checked = false;
// Add descriptive text next to checkbox
using (var checkboxLabel = new PdfFormattedText())
{
checkboxLabel.Append("I agree to the terms and conditions");
page.Content.DrawText(checkboxLabel, new PdfPoint(80, 555));
}
// Create submit button
var submitButton = form.Fields.AddButton(page, 50, 500, 100, 30);
submitButton.Name = "Submit";
submitButton.Actions.Activate = PdfActionType.Named;
// Add button appearance
using (var buttonText = new PdfFormattedText())
{
buttonText.Append("Submit Form");
buttonText.FontSize = 14;
buttonText.Color = PdfColor.FromRgb(1, 1, 1);
// Create button appearance stream
var appearance = submitButton.Appearance.Normal;
appearance.Fill.Color = PdfColor.FromRgb(0.2, 0.4, 0.8);
appearance.Stroke.Color = PdfColor.FromRgb(0.1, 0.2, 0.4);
appearance.Stroke.Width = 1;
// Draw button background
appearance.DrawRectangle(new PdfPoint(0, 0), new PdfSize(100, 30), true, true);
// Draw button text
appearance.DrawText(buttonText, new PdfPoint(20, 10));
}
// Add a table using low-level graphics
var tableTop = 400;
var tableLeft = 50;
var cellWidth = 150;
var cellHeight = 30;
// Draw table headers
page.Content.DrawRectangle(new PdfPoint(tableLeft, tableTop),
new PdfSize(cellWidth * 3, cellHeight), true, true);
using (var headerText = new PdfFormattedText())
{
headerText.FontSize = 12;
headerText.Color = PdfColor.FromRgb(1, 1, 1);
headerText.Append("Product");
page.Content.DrawText(headerText, new PdfPoint(tableLeft + 10, tableTop + 10));
headerText.Clear();
headerText.Append("Quantity");
page.Content.DrawText(headerText, new PdfPoint(tableLeft + cellWidth + 10, tableTop + 10));
headerText.Clear();
headerText.Append("Price");
page.Content.DrawText(headerText, new PdfPoint(tableLeft + cellWidth * 2 + 10, tableTop + 10));
}
// Draw table data rows
var rowData = new[]
{
new { Product = "PDF Library", Quantity = "1", Price = "$890" },
new { Product = "Support Plan", Quantity = "1", Price = "$299" },
new { Product = "Training", Quantity = "2", Price = "$500" }
};
var currentY = tableTop - cellHeight;
foreach (var row in rowData)
{
// Draw cell borders
page.Content.DrawRectangle(new PdfPoint(tableLeft, currentY),
new PdfSize(cellWidth, cellHeight), false, true);
page.Content.DrawRectangle(new PdfPoint(tableLeft + cellWidth, currentY),
new PdfSize(cellWidth, cellHeight), false, true);
page.Content.DrawRectangle(new PdfPoint(tableLeft + cellWidth * 2, currentY),
new PdfSize(cellWidth, cellHeight), false, true);
// Draw cell content
using (var cellText = new PdfFormattedText())
{
cellText.FontSize = 11;
cellText.Append(row.Product);
page.Content.DrawText(cellText, new PdfPoint(tableLeft + 10, currentY + 10));
cellText.Clear();
cellText.Append(row.Quantity);
page.Content.DrawText(cellText, new PdfPoint(tableLeft + cellWidth + 10, currentY + 10));
cellText.Clear();
cellText.Append(row.Price);
page.Content.DrawText(cellText, new PdfPoint(tableLeft + cellWidth * 2 + 10, currentY + 10));
}
currentY -= cellHeight;
}
// Apply security settings
var securitySettings = document.SecuritySettings;
securitySettings.DocumentOpenPassword = "user123";
securitySettings.PermissionsPassword = "owner123";
securitySettings.Permissions = PdfPermissions.AllowPrint | PdfPermissions.AllowFormFill;
// Save the document
document.Save("gembox-example.pdf");
}
// Example: Manipulating existing PDF
using (var existingDoc = PdfDocument.Load("existing-document.pdf"))
{
// Extract text from first page
var page = existingDoc.Pages[0];
var text = page.Content.GetText();
Console.WriteLine($"Extracted text: {text}");
// Add watermark to all pages
foreach (var p in existingDoc.Pages)
{
using (var watermark = new PdfFormattedText())
{
watermark.Append("CONFIDENTIAL");
watermark.FontSize = 50;
watermark.Color = PdfColor.FromRgb(0.5, 0.5, 0.5);
watermark.Opacity = 0.3;
// Calculate center position
var pageWidth = p.MediaBox.Width;
var pageHeight = p.MediaBox.Height;
var textWidth = watermark.Width;
var textHeight = watermark.Height;
var x = (pageWidth - textWidth) / 2;
var y = (pageHeight - textHeight) / 2;
// Draw watermark diagonally
p.Content.SaveGraphicsState();
p.Content.SetTransform(1, 0, 0, 1, x, y);
p.Content.SetTransform(0.7071, 0.7071, -0.7071, 0.7071, 0, 0);
p.Content.DrawText(watermark, new PdfPoint(0, 0));
p.Content.RestoreGraphicsState();
}
}
existingDoc.Save("watermarked-document.pdf");
}
using GemBox.Pdf;
using GemBox.Pdf.Content;
using GemBox.Pdf.Forms;
using GemBox.Pdf.Security;
// Set license (use FREE-LIMITED-KEY for evaluation)
ComponentInfo.SetLicense("FREE-LIMITED-KEY");
// Create a new PDF document from scratch
using (var document = new PdfDocument())
{
// Add a page with custom size
var page = document.Pages.Add();
// Create formatted text with multiple styles
using (var formattedText = new PdfFormattedText())
{
formattedText.FontSize = 24;
formattedText.FontFamily = new PdfFontFamily("Arial");
formattedText.Color = PdfColor.FromRgb(0.2, 0.2, 0.6);
formattedText.AppendLine("GemBox.Pdf Document Example");
formattedText.FontSize = 12;
formattedText.Color = PdfColor.FromRgb(0, 0, 0);
formattedText.AppendLine("This document demonstrates PDF creation and manipulation features.");
// Draw text to the page
page.Content.DrawText(formattedText, new PdfPoint(50, 700));
}
// Add a form to the document
var form = document.Form;
// Create text field
var textField = form.Fields.AddText(page, 50, 600, 200, 30);
textField.Name = "CustomerName";
textField.Value = "Enter your name";
textField.Format.Fill.Color = PdfColor.FromRgb(0.95, 0.95, 0.95);
// Create checkbox
var checkBox = form.Fields.AddCheck(page, 50, 550, 20, 20);
checkBox.Name = "Agreement";
checkBox.Checked = false;
// Add descriptive text next to checkbox
using (var checkboxLabel = new PdfFormattedText())
{
checkboxLabel.Append("I agree to the terms and conditions");
page.Content.DrawText(checkboxLabel, new PdfPoint(80, 555));
}
// Create submit button
var submitButton = form.Fields.AddButton(page, 50, 500, 100, 30);
submitButton.Name = "Submit";
submitButton.Actions.Activate = PdfActionType.Named;
// Add button appearance
using (var buttonText = new PdfFormattedText())
{
buttonText.Append("Submit Form");
buttonText.FontSize = 14;
buttonText.Color = PdfColor.FromRgb(1, 1, 1);
// Create button appearance stream
var appearance = submitButton.Appearance.Normal;
appearance.Fill.Color = PdfColor.FromRgb(0.2, 0.4, 0.8);
appearance.Stroke.Color = PdfColor.FromRgb(0.1, 0.2, 0.4);
appearance.Stroke.Width = 1;
// Draw button background
appearance.DrawRectangle(new PdfPoint(0, 0), new PdfSize(100, 30), true, true);
// Draw button text
appearance.DrawText(buttonText, new PdfPoint(20, 10));
}
// Add a table using low-level graphics
var tableTop = 400;
var tableLeft = 50;
var cellWidth = 150;
var cellHeight = 30;
// Draw table headers
page.Content.DrawRectangle(new PdfPoint(tableLeft, tableTop),
new PdfSize(cellWidth * 3, cellHeight), true, true);
using (var headerText = new PdfFormattedText())
{
headerText.FontSize = 12;
headerText.Color = PdfColor.FromRgb(1, 1, 1);
headerText.Append("Product");
page.Content.DrawText(headerText, new PdfPoint(tableLeft + 10, tableTop + 10));
headerText.Clear();
headerText.Append("Quantity");
page.Content.DrawText(headerText, new PdfPoint(tableLeft + cellWidth + 10, tableTop + 10));
headerText.Clear();
headerText.Append("Price");
page.Content.DrawText(headerText, new PdfPoint(tableLeft + cellWidth * 2 + 10, tableTop + 10));
}
// Draw table data rows
var rowData = new[]
{
new { Product = "PDF Library", Quantity = "1", Price = "$890" },
new { Product = "Support Plan", Quantity = "1", Price = "$299" },
new { Product = "Training", Quantity = "2", Price = "$500" }
};
var currentY = tableTop - cellHeight;
foreach (var row in rowData)
{
// Draw cell borders
page.Content.DrawRectangle(new PdfPoint(tableLeft, currentY),
new PdfSize(cellWidth, cellHeight), false, true);
page.Content.DrawRectangle(new PdfPoint(tableLeft + cellWidth, currentY),
new PdfSize(cellWidth, cellHeight), false, true);
page.Content.DrawRectangle(new PdfPoint(tableLeft + cellWidth * 2, currentY),
new PdfSize(cellWidth, cellHeight), false, true);
// Draw cell content
using (var cellText = new PdfFormattedText())
{
cellText.FontSize = 11;
cellText.Append(row.Product);
page.Content.DrawText(cellText, new PdfPoint(tableLeft + 10, currentY + 10));
cellText.Clear();
cellText.Append(row.Quantity);
page.Content.DrawText(cellText, new PdfPoint(tableLeft + cellWidth + 10, currentY + 10));
cellText.Clear();
cellText.Append(row.Price);
page.Content.DrawText(cellText, new PdfPoint(tableLeft + cellWidth * 2 + 10, currentY + 10));
}
currentY -= cellHeight;
}
// Apply security settings
var securitySettings = document.SecuritySettings;
securitySettings.DocumentOpenPassword = "user123";
securitySettings.PermissionsPassword = "owner123";
securitySettings.Permissions = PdfPermissions.AllowPrint | PdfPermissions.AllowFormFill;
// Save the document
document.Save("gembox-example.pdf");
}
// Example: Manipulating existing PDF
using (var existingDoc = PdfDocument.Load("existing-document.pdf"))
{
// Extract text from first page
var page = existingDoc.Pages[0];
var text = page.Content.GetText();
Console.WriteLine($"Extracted text: {text}");
// Add watermark to all pages
foreach (var p in existingDoc.Pages)
{
using (var watermark = new PdfFormattedText())
{
watermark.Append("CONFIDENTIAL");
watermark.FontSize = 50;
watermark.Color = PdfColor.FromRgb(0.5, 0.5, 0.5);
watermark.Opacity = 0.3;
// Calculate center position
var pageWidth = p.MediaBox.Width;
var pageHeight = p.MediaBox.Height;
var textWidth = watermark.Width;
var textHeight = watermark.Height;
var x = (pageWidth - textWidth) / 2;
var y = (pageHeight - textHeight) / 2;
// Draw watermark diagonally
p.Content.SaveGraphicsState();
p.Content.SetTransform(1, 0, 0, 1, x, y);
p.Content.SetTransform(0.7071, 0.7071, -0.7071, 0.7071, 0, 0);
p.Content.DrawText(watermark, new PdfPoint(0, 0));
p.Content.RestoreGraphicsState();
}
}
existingDoc.Save("watermarked-document.pdf");
}
Imports GemBox.Pdf
Imports GemBox.Pdf.Content
Imports GemBox.Pdf.Forms
Imports GemBox.Pdf.Security
' Set license (use FREE-LIMITED-KEY for evaluation)
ComponentInfo.SetLicense("FREE-LIMITED-KEY")
' Create a new PDF document from scratch
Using document = New PdfDocument()
' Add a page with custom size
Dim page = document.Pages.Add()
' Create formatted text with multiple styles
Using formattedText = New PdfFormattedText()
formattedText.FontSize = 24
formattedText.FontFamily = New PdfFontFamily("Arial")
formattedText.Color = PdfColor.FromRgb(0.2, 0.2, 0.6)
formattedText.AppendLine("GemBox.Pdf Document Example")
formattedText.FontSize = 12
formattedText.Color = PdfColor.FromRgb(0, 0, 0)
formattedText.AppendLine("This document demonstrates PDF creation and manipulation features.")
' Draw text to the page
page.Content.DrawText(formattedText, New PdfPoint(50, 700))
End Using
' Add a form to the document
Dim form = document.Form
' Create text field
Dim textField = form.Fields.AddText(page, 50, 600, 200, 30)
textField.Name = "CustomerName"
textField.Value = "Enter your name"
textField.Format.Fill.Color = PdfColor.FromRgb(0.95, 0.95, 0.95)
' Create checkbox
Dim checkBox = form.Fields.AddCheck(page, 50, 550, 20, 20)
checkBox.Name = "Agreement"
checkBox.Checked = False
' Add descriptive text next to checkbox
Using checkboxLabel = New PdfFormattedText()
checkboxLabel.Append("I agree to the terms and conditions")
page.Content.DrawText(checkboxLabel, New PdfPoint(80, 555))
End Using
' Create submit button
Dim submitButton = form.Fields.AddButton(page, 50, 500, 100, 30)
submitButton.Name = "Submit"
submitButton.Actions.Activate = PdfActionType.Named
' Add button appearance
Using buttonText = New PdfFormattedText()
buttonText.Append("Submit Form")
buttonText.FontSize = 14
buttonText.Color = PdfColor.FromRgb(1, 1, 1)
' Create button appearance stream
Dim appearance = submitButton.Appearance.Normal
appearance.Fill.Color = PdfColor.FromRgb(0.2, 0.4, 0.8)
appearance.Stroke.Color = PdfColor.FromRgb(0.1, 0.2, 0.4)
appearance.Stroke.Width = 1
' Draw button background
appearance.DrawRectangle(New PdfPoint(0, 0), New PdfSize(100, 30), True, True)
' Draw button text
appearance.DrawText(buttonText, New PdfPoint(20, 10))
End Using
' Add a table using low-level graphics
Dim tableTop = 400
Dim tableLeft = 50
Dim cellWidth = 150
Dim cellHeight = 30
' Draw table headers
page.Content.DrawRectangle(New PdfPoint(tableLeft, tableTop), New PdfSize(cellWidth * 3, cellHeight), True, True)
Using headerText = New PdfFormattedText()
headerText.FontSize = 12
headerText.Color = PdfColor.FromRgb(1, 1, 1)
headerText.Append("Product")
page.Content.DrawText(headerText, New PdfPoint(tableLeft + 10, tableTop + 10))
headerText.Clear()
headerText.Append("Quantity")
page.Content.DrawText(headerText, New PdfPoint(tableLeft + cellWidth + 10, tableTop + 10))
headerText.Clear()
headerText.Append("Price")
page.Content.DrawText(headerText, New PdfPoint(tableLeft + cellWidth * 2 + 10, tableTop + 10))
End Using
' Draw table data rows
Dim rowData = {
New With {
Key .Product = "PDF Library",
Key .Quantity = "1",
Key .Price = "$890"
},
New With {
Key .Product = "Support Plan",
Key .Quantity = "1",
Key .Price = "$299"
},
New With {
Key .Product = "Training",
Key .Quantity = "2",
Key .Price = "$500"
}
}
Dim currentY = tableTop - cellHeight
For Each row In rowData
' Draw cell borders
page.Content.DrawRectangle(New PdfPoint(tableLeft, currentY), New PdfSize(cellWidth, cellHeight), False, True)
page.Content.DrawRectangle(New PdfPoint(tableLeft + cellWidth, currentY), New PdfSize(cellWidth, cellHeight), False, True)
page.Content.DrawRectangle(New PdfPoint(tableLeft + cellWidth * 2, currentY), New PdfSize(cellWidth, cellHeight), False, True)
' Draw cell content
Using cellText = New PdfFormattedText()
cellText.FontSize = 11
cellText.Append(row.Product)
page.Content.DrawText(cellText, New PdfPoint(tableLeft + 10, currentY + 10))
cellText.Clear()
cellText.Append(row.Quantity)
page.Content.DrawText(cellText, New PdfPoint(tableLeft + cellWidth + 10, currentY + 10))
cellText.Clear()
cellText.Append(row.Price)
page.Content.DrawText(cellText, New PdfPoint(tableLeft + cellWidth * 2 + 10, currentY + 10))
End Using
currentY -= cellHeight
Next row
' Apply security settings
Dim securitySettings = document.SecuritySettings
securitySettings.DocumentOpenPassword = "user123"
securitySettings.PermissionsPassword = "owner123"
securitySettings.Permissions = PdfPermissions.AllowPrint Or PdfPermissions.AllowFormFill
' Save the document
document.Save("gembox-example.pdf")
End Using
' Example: Manipulating existing PDF
Using existingDoc = PdfDocument.Load("existing-document.pdf")
' Extract text from first page
Dim page = existingDoc.Pages(0)
Dim text = page.Content.GetText()
Console.WriteLine($"Extracted text: {text}")
' Add watermark to all pages
For Each p In existingDoc.Pages
Using watermark = New PdfFormattedText()
watermark.Append("CONFIDENTIAL")
watermark.FontSize = 50
watermark.Color = PdfColor.FromRgb(0.5, 0.5, 0.5)
watermark.Opacity = 0.3
' Calculate center position
Dim pageWidth = p.MediaBox.Width
Dim pageHeight = p.MediaBox.Height
Dim textWidth = watermark.Width
Dim textHeight = watermark.Height
Dim x = (pageWidth - textWidth) \ 2
Dim y = (pageHeight - textHeight) \ 2
' Draw watermark diagonally
p.Content.SaveGraphicsState()
p.Content.SetTransform(1, 0, 0, 1, x, y)
p.Content.SetTransform(0.7071, 0.7071, -0.7071, 0.7071, 0, 0)
p.Content.DrawText(watermark, New PdfPoint(0, 0))
p.Content.RestoreGraphicsState()
End Using
Next p
existingDoc.Save("watermarked-document.pdf")
End Using
Ten przykład pokazuje mocne strony GemBox.Pdf w zakresie niskopoziomowej manipulacji plikami PDF, demonstrując tworzenie formularzy, rysowanie grafiki oraz funkcje zabezpieczeń dokumentów. Chociaż kod jest bardziej rozbudowany niż podejście HTML stosowane w IronPDF, zapewnia precyzyjną kontrolę nad każdym aspektem pliku PDF.
How Do These Libraries Handle HTML to PDF Conversion?
Podejście do konwersji HTML na PDF stanowi jedną z najważniejszych różnic między IronPDF a GemBox.Pdf.
Podejście IronPDF do konwersji HTML na PDF
IronPDF został stworzony od podstaw z myślą przede wszystkim o konwersji HTML do PDF. Biblioteka zawiera pełny silnik renderujący Chrome, który przetwarza HTML, CSS i JavaScript dokładnie tak, jak robiłaby to przeglądarka internetowa. Oznacza to, że:
- Prawdziwe renderowanie przeglądarki: Wykorzystuje ten sam silnik Blink, co przeglądarka Google Chrome
- Pełna zgodność ze standardami internetowymi: pełna obsługa CSS3, HTML5, flexbox, grid oraz nowoczesnego JavaScript
- Dynamiczna zawartość: Wykonuje kod JavaScript przed renderowaniem, przechwytując zawartość AJAX i elementy dynamiczne
- Responsywny projekt: Obsługuje zapytania o media i responsywne układy
- Zasoby zewnętrzne: automatycznie pobiera obrazy, arkusze stylów i czcionki z adresów URL
Ograniczona obsługa HTML przez GemBox
Sam program GemBox.Pdf nie obsługuje konwersji plików HTML do formatu PDF. Aby przekonwertować HTML na PDF za pomocą GemBox, programiści muszą:
- Zakup GemBox.Document osobno (dodatkowy koszt 890 USD)
- Użyj GemBox.Document do konwersji HTML na DOCX
- Następnie przekonwertuj plik DOCX na PDF
Takie podejście ma istotne ograniczenia:
- Brak obsługi JavaScript: nie można przetwarzać treści dynamicznych
- Ograniczona obsługa CSS: Wiele nowoczesnych funkcji CSS nie jest obsługiwanych
- Kwestie stylistyczne: znane problemy z obramowaniami i złożonymi układami, o których mowa w dyskusjach na Stack Overflow
- Tylko wersja zoptymalizowana do druku: Wymaga kodu HTML sformatowanego specjalnie do druku
- Dodatkowy koszt: Wymaga zakupu dwóch oddzielnych bibliotek
Obsługa nowoczesnych frameworków CSS: kluczowa różnica
Jedna z najważniejszych zalet renderowania opartego na przeglądarce Chrome w IronPDF staje się widoczna podczas pracy z nowoczesnymi frameworkami CSS, takimi jak Bootstrap, Tailwind CSS i Foundation. Frameworki te stały się podstawą nowoczesnych aplikacji internetowych, a ich zdolność do prawidłowego renderowania w plikach PDF jest niezbędna w wielu przypadkach użycia.
IronPDF: Pełna obsługa nowoczesnych frameworków
Silnik renderujący IronPDF dla przeglądarki Chrome zapewnia pełną, natywną obsługę wszystkich nowoczesnych frameworków CSS:
- Bootstrap 5: Full flexbox and CSS Grid support for responsive layouts
- Tailwind CSS: Pełna obsługa frameworka CSS opartego na podejściu "utility-first"
- Przykłady z życia wzięte: renderuje stronę główną Bootstrap oraz szablony Bootstrap z idealną dokładnością pikselową
- Nowoczesne funkcje CSS3: animacje, transformacje, przejścia, właściwości niestandardowe
- Responsywne projekty: zapytania o media i układy oparte na oknie wyświetlania działają płynnie
Przykład kodu: Formularz Bootstrap do pliku PDF
using IronPdf;
var renderer = new ChromePdfRenderer();
string bootstrapForm = @"
<!DOCTYPE html>
<html>
<head>
<link href='https://cdn.jsdelivr.net/npm/bootstrap@5.3.0/dist/css/bootstrap.min.css' rel='stylesheet'>
</head>
<body>
<div class='container mt-5'>
<h1 class='mb-4'>Customer Registration</h1>
<form class='needs-validation'>
<div class='row g-3'>
<div class='col-md-6'>
<label class='form-label'>First Name</label>
<input type='text' class='form-control' value='John'>
</div>
<div class='col-md-6'>
<label class='form-label'>Last Name</label>
<input type='text' class='form-control' value='Smith'>
</div>
</div>
<div class='mt-4'>
<button class='btn btn-primary' type='submit'>Submit</button>
</div>
</form>
</div>
</body>
</html>";
var pdf = renderer.RenderHtmlAsPdf(bootstrapForm);
pdf.SaveAs("bootstrap-form.pdf");
using IronPdf;
var renderer = new ChromePdfRenderer();
string bootstrapForm = @"
<!DOCTYPE html>
<html>
<head>
<link href='https://cdn.jsdelivr.net/npm/bootstrap@5.3.0/dist/css/bootstrap.min.css' rel='stylesheet'>
</head>
<body>
<div class='container mt-5'>
<h1 class='mb-4'>Customer Registration</h1>
<form class='needs-validation'>
<div class='row g-3'>
<div class='col-md-6'>
<label class='form-label'>First Name</label>
<input type='text' class='form-control' value='John'>
</div>
<div class='col-md-6'>
<label class='form-label'>Last Name</label>
<input type='text' class='form-control' value='Smith'>
</div>
</div>
<div class='mt-4'>
<button class='btn btn-primary' type='submit'>Submit</button>
</div>
</form>
</div>
</body>
</html>";
var pdf = renderer.RenderHtmlAsPdf(bootstrapForm);
pdf.SaveAs("bootstrap-form.pdf");
Imports IronPdf
Dim renderer As New ChromePdfRenderer()
Dim bootstrapForm As String = "
<!DOCTYPE html>
<html>
<head>
<link href='https://cdn.jsdelivr.net/npm/bootstrap@5.3.0/dist/css/bootstrap.min.css' rel='stylesheet'>
</head>
<body>
<div class='container mt-5'>
<h1 class='mb-4'>Customer Registration</h1>
<form class='needs-validation'>
<div class='row g-3'>
<div class='col-md-6'>
<label class='form-label'>First Name</label>
<input type='text' class='form-control' value='John'>
</div>
<div class='col-md-6'>
<label class='form-label'>Last Name</label>
<input type='text' class='form-control' value='Smith'>
</div>
</div>
<div class='mt-4'>
<button class='btn btn-primary' type='submit'>Submit</button>
</div>
</form>
</div>
</body>
</html>"
Dim pdf = renderer.RenderHtmlAsPdf(bootstrapForm)
pdf.SaveAs("bootstrap-form.pdf")
GemBox: Brak obsługi nowoczesnych frameworków
Ponieważ GemBox.PDF nie obsługuje natywnego renderowania HTML i musi polegać na GemBox.Document w zakresie konwersji HTML, nowoczesne frameworki CSS napotykają poważne ograniczenia:
- Brak obsługi Bootstrap: funkcje Flexbox i CSS Grid nie będą wyświetlane poprawnie
- Brak Tailwind CSS: klasy użytkowe i nowoczesne układy nie są obsługiwane
- Wymagane ręczne obejścia: Należy utworzyć wersje HTML zoptymalizowane do druku
- Ograniczone możliwości CSS3: Wiele nowoczesnych funkcji CSS po prostu nie będzie działać
- Dodatkowa złożoność: dwuetapowy proces konwersji (HTML → DOCX → PDF) powoduje niespójności
Zgodnie z dyskusjami programistów nawet podstawowe funkcje CSS, takie jak obramowania i układy, mogą stanowić problem przy podejściu GemBox do konwersji HTML.
Wpływ na praktyczne zastosowanie: Jeśli Twoja aplikacja wykorzystuje Bootstrap do obsługi interfejsu użytkownika i potrzebujesz generować raporty PDF lub eksporty zgodne z interfejsem internetowym, IronPDF zapewnia proste rozwiązanie, podczas gdy GemBox wymagałby znacznego przeprojektowania lub ręcznych obejść.
For more details on CSS framework compatibility, see the Bootstrap & Flexbox CSS Guide.
Która biblioteka najlepiej sprawdza się w różnych zadaniach związanych z plikami PDF?
Zrozumienie, w czym każda biblioteka się wyróżnia, pomaga programistom wybrać odpowiednie narzędzie do ich konkretnych potrzeb.
W czym IronPDF się wyróżnia
IronPDF wykazuje doskonałą wydajność w następujących scenariuszach:
1. Generowanie plików PDF w aplikacjach internetowych
Idealny do aplikacji SaaS, portali internetowych i wszelkich systemów, które wymagają konwersji treści internetowych do formatu PDF. Silnik renderujący Chrome zapewnia idealne wyświetlanie złożonych układów stron internetowych, w tym tych wykorzystujących Bootstrap, Tailwind CSS lub niestandardowe frameworki.
2. Dynamiczne generowanie raportów
Gdy raporty zawierają wykresy (Chart.js, D3.js), dynamiczną wizualizację danych lub treści renderowane w JavaScript, IronPDF dokładnie je przechwytuje. Dzięki temu idealnie nadaje się do pulpitów analitycznych i aplikacji opartych na danych.
3. Szablony faktur i dokumentów
Korzystanie z szablonów HTML/CSS do tworzenia faktur, paragonów i dokumentów biznesowych pozwala projektantom tworzyć szablony bez konieczności nauki API specyficznych dla formatu PDF. Zmiany można wprowadzać szybko, korzystając ze znanych technologii internetowych.
4. Projekty szybkiego rozwoju
Proste API i podejście oparte na HTML znacznie skracają czas programowania. Programista może stworzyć złożony plik PDF w ciągu kilku minut, a nie godzin.
5. Wdrażanie wieloplatformowe
Dzięki natywnej obsłudze systemów Windows, Linux, macOS, Docker oraz platform chmurowych, IronPDF ułatwia wdrażanie w różnych środowiskach.
W czym GemBox.PDF się wyróżnia
GemBox.PDF wykazuje swoje mocne strony w następujących obszarach:
1. Manipulacja plikami PDF na niskim poziomie
Gdy wymagana jest precyzyjna kontrola nad strukturą pliku PDF, obiektowe podejście GemBox.Pdf zapewnia bezpośredni dostęp do elementów, strumieni i słowników PDF.
2. Aplikacje z dużą ilością formularzy
W przypadku aplikacji, które intensywnie wykorzystują formularze PDF, GemBox.Pdf oferuje kompleksową obsługę pól formularzy, w tym programowe tworzenie złożonych formularzy interaktywnych.
3. Wymagania dotyczące OCR
Dzięki wbudowanym funkcjom OCR GemBox.PDF może wyodrębniać tekst ze skanowanych dokumentów bez konieczności korzystania z dodatkowych bibliotek, co sprawia, że nadaje się do projektów digitalizacji dokumentów.
4. Tworzenie aplikacji mobilnych
Natywna obsługa platform Android i iOS sprawia, że GemBox.Pdf jest dobrym wyborem dla aplikacji mobilnych, które wymagają funkcjonalności PDF.
5. Modyfikacja istniejącego pliku PDF
W przypadku pracy głównie z istniejącymi plikami PDF, a nie tworzenia nowych, narzędzia GemBox.Pdf do wyodrębniania, manipulowania i modyfikowania doskonale nadają się do tego zadania.
Jak wygląda porównanie instalacji i konfiguracji?
Obie biblioteki oferują prostą instalację za pośrednictwem NuGet, ale o różnym stopniu złożoności.
Instalacja IronPDF
Instalacja IronPDF jest niezwykle prosta:
Install-Package IronPdf
Lub za pomocą interfejsu CLI platformy .NET:
dotnet add package IronPdf
Pakiet zawiera wszystko, co jest potrzebne, w tym silnik renderujący Chrome. W większości przypadków nie są wymagane żadne dodatkowe konfiguracje ani zależności.
W konkretnych scenariuszach wdrożeniowych IronPDF oferuje:
IronPdf.Slim: Lightweight package that downloads platform-specific components at runtimeIronPdf.Linux: Pre-configured for Linux deploymentsIronPdf.MacOs: Optimized for macOS environments
Instalacja GemBox.PDF
Instalacja GemBox.Pdf jest równie prosta, jeśli chodzi o podstawową obsługę plików PDF:
Install-Package GemBox.Pdf
Jednak w przypadku konwersji HTML do PDF potrzebne będą:
Install-Package GemBox.Document
Obie biblioteki wymagają konfiguracji klucza licencyjnego:
// IronPDF
License.LicenseKey = "YOUR-LICENSE-KEY";
// GemBox.Pdf
ComponentInfo.SetLicense("YOUR-LICENSE-KEY");
// IronPDF
License.LicenseKey = "YOUR-LICENSE-KEY";
// GemBox.Pdf
ComponentInfo.SetLicense("YOUR-LICENSE-KEY");
' IronPDF
License.LicenseKey = "YOUR-LICENSE-KEY"
' GemBox.Pdf
ComponentInfo.SetLicense("YOUR-LICENSE-KEY")
Jakie są różnice w licencjonowaniu i cenach?
Zrozumienie modeli licencyjnych pomaga określić całkowity koszt posiadania każdego rozwiązania.
Licencjonowanie IronPDF
IronPDF oferuje przejrzysty, wielopoziomowy system licencjonowania (ceny na rok 2025):
-
Lite License: $799
- 1 programista
- 1 project
- 1 rok wsparcia i aktualizacji
-
Plus License: $1,199
- 3 programistów
- 3 projekty
- 1 rok wsparcia i aktualizacji
- Professional License: $2,399
- 10 programistów
- 10 projektów
- 1 rok wsparcia i aktualizacji
Dodatkowe opcje:
- Royalty-free redistribution: +$2,399
- Dostępne licencje SaaS/Licencjonowanie OEM
- Iron Suite bundle: $1,498 for 9 products
Kluczowe zalety:
- 30-dniowa gwarancja zwrotu pieniędzy
- Licencje wieczyste (jednorazowy zakup)
- Bezpłatne tworzenie i testowanie
- Wdrożenie w środowisku dev/staging/produkcyjnym w cenie
Licencjonowanie GemBox.PDF
GemBox oferuje licencje indywidualne dla programistów:
- Pojedynczy programista: 890 USD
- 1 programista
- Nieograniczona liczba projektów
- 1 rok wsparcia i aktualizacji
- Wliczone w cenę wdrożenie bez opłat licencyjnych
Ważne uwagi:
- Konwersja HTML do PDF wymaga GemBox.Document: dodatkowe 890 USD
- Całkowity koszt konwersji z HTML do PDF: minimum 1780 USD
- 40% zniżki na przedłużenie (60%, jeśli przedłużysz przed upływem terminu)
- Pakiet GemBox: 2200 USD za 7 produktów
Kluczowe zalety:
- 30-dniowa gwarancja zwrotu pieniędzy
- Licencje wieczyste
- W cenie nieograniczona liczba wdrożeń
- Nie są wymagane żadne licencje serwerowe ani OEM
Porównanie kosztów dla typowych scenariuszy
| Scenariusz | Koszt IronPDF | Koszt GemBox |
|---|---|---|
| Pojedynczy programista, HTML do PDF | $799 | $1,780 |
| 3 programistów, wyłącznie obróbka plików PDF | $1,499 | $2,670 |
| 3 programistów, HTML do PDF | $1,199 | $5,340 |
| Enterprise (10 programistów), pełen zestaw funkcji | $2,399 | 8 900 USD+ |
Którą bibliotekę wybrać?
Wybór między IronPDF a GemBox.Pdf zależy od konkretnych wymagań:
Kiedy wybrać IronPDF:
- Konwersja HTML do PDF jest podstawowym wymogiem: renderowanie IronPDF oparte na przeglądarce Chrome nie ma sobie równych
- Potrzebujesz nowoczesnej obsługi sieci: pełne możliwości CSS3, HTML5 i JavaScript
- Szybki rozwój ma znaczenie: proste API skraca czas wprowadzenia produktu na rynek
- Pracujesz z treścią dynamiczną: wykonywanie kodu JavaScript pozwala na pobieranie danych w czasie rzeczywistym
- Wymagane jest wdrażanie wieloplatformowe: doskonała obsługa środowisk chmurowych i kontenerowych
- Budżet ma znaczenie: niższy koszt początkowy i lepszy stosunek jakości do ceny w scenariuszach konwersji HTML do PDF
Kiedy wybrać GemBox.PDF:
- Niezbędna jest kontrola nad plikami PDF na niskim poziomie: bezpośredni dostęp do obiektów i struktury plików PDF
- Wymagana jest obsługa platform mobilnych: natywna kompatybilność z systemami Android i iOS
- OCR jest podstawowym wymogiem: wbudowany OCR bez dodatkowych zależności
- Pracujesz głównie z istniejącymi plikami PDF: zaawansowane funkcje manipulacji i ekstrakcji
- Konwersja HTML do PDF nie jest potrzebna: unikaj płacenia za nieużywany GemBox.Document
- Ważna jest nieograniczona możliwość wdrażania: Redystrybucja bez opłat licencyjnych
Rozważ użycie obu bibliotek, gdy:
Niektóre organizacje dostrzegają wartość w wykorzystaniu obu bibliotek w różnych częściach swojej aplikacji:
- IronPDF do generowania raportów i konwersji HTML do PDF
- GemBox.Pdf do przetwarzania formularzy i manipulacji plikami PDF
Pierwsze kroki z wybraną biblioteką
Obie biblioteki oferują bezpłatne wersje próbne, które pozwalają ocenić ich możliwości:
Wypróbuj IronPDF
- Zainstaluj pakiet NuGet
- Do programowania nie jest wymagany klucz licencyjny
- W trybie próbnym na plikach PDF pojawiają się znaki wodne
- Pełny dostęp do funkcji podczas okresu próbnego
Wypróbuj GemBox.PDF
- Zainstaluj pakiet NuGet
- Use
ComponentInfo.SetLicense("FREE-LIMITED-KEY") - Ograniczone do 2 stron w trybie darmowym
- Aktualizacja w celu usunięcia ograniczeń
Wizualny przewodnik instalacji
Dla programistów preferujących interfejs graficzny Visual Studio przygotowaliśmy przewodnik krok po kroku dotyczący instalacji obu bibliotek:
Tworzenie nowego projektu ASP.NET
Okno dialogowe "Nowy projekt" programu Visual Studio służące do tworzenia aplikacji internetowych ASP.NET — podstawa projektów związanych z generowaniem plików PDF
Wybór Web Forms jako szablonu projektu — odpowiedniego zarówno dla implementacji IronPDF, jak i GemBox.Pdf
Instalowanie bibliotek PDF za pośrednictwem NuGet
Kliknij prawym przyciskiem myszy swój projekt w Eksploratorze rozwiązań, aby uzyskać dostęp do Menedżera pakietów NuGet w celu zainstalowania biblioteki
Alternatywny dostęp do menedżera pakietów NuGet poprzez menu Projekt w Visual Studio
Instalacja IronPDF za pomocą menedżera pakietów NuGet — zwróć uwagę na obszerny opis funkcji i liczbę pobrań
Alternatywne metody instalacji
Witryna internetowa IronPDF oferuje bezpośrednie pobieranie bibliotek DLL w sytuacjach, w których instalacja za pomocą NuGet nie jest odpowiednia.
Wnioski
Zarówno IronPDF, jak i GemBox.Pdf to wysokiej jakości biblioteki PDF dla programistów .NET, z których każda ma swoje mocne strony. IronPDF wyróżnia się w konwersji HTML do PDF dzięki silnikowi renderowania Chrome, co czyni go idealnym rozwiązaniem dla nowoczesnych aplikacji internetowych i generowania treści dynamicznych. GemBox.Pdf wyróżnia się możliwościami niskopoziomowej manipulacji plikami PDF oraz obsługą urządzeń mobilnych, co czyni go idealnym rozwiązaniem dla aplikacji wymagających precyzyjnej kontroli nad plikami PDF.
Dla większości programistów internetowych i zespołów tworzących nowoczesne aplikacje IronPDF oferuje najlepsze połączenie funkcji, łatwości użytkowania i wartości. Możliwość renderowania plików PDF o idealnej rozdzielczości z kodu HTML przy użyciu znanych technologii internetowych znacznie skraca czas tworzenia oprogramowania i zmniejsza jego złożoność.
Jednak GemBox.Pdf pozostaje solidnym wyborem w specjalistycznych scenariuszach, zwłaszcza w tworzeniu aplikacji mobilnych i aplikacji skupionych na przetwarzaniu formularzy PDF lub wymaganiach OCR.
Chcesz przekształcić swoje treści HTML w profesjonalne pliki PDF? Zacznij korzystać z bezpłatnej wersji próbnej IronPDF i przekonaj się o mocy renderowania na poziomie przeglądarki Chrome w swoich aplikacjach .NET. Dzięki obszernej dokumentacji, licznym przykładom kodu i responsywnemu wsparciu technicznemu będziesz generować pliki PDF w ciągu kilku minut, a nie godzin.
Często Zadawane Pytania
Jak mogę przekonwertować HTML na PDF w języku C#?
Możesz użyć metody RenderHtmlAsPdf biblioteki IronPDF do konwersji ciągów HTML na pliki PDF. Możesz również konwertować pliki HTML na pliki PDF za pomocą metody RenderHtmlFileAsPdf.
Czy mogę manipulować istniejącymi plikami PDF za pomocą tych bibliotek?
Tak, zarówno IronPDF, jak i GemBox.Pdf mogą służyć do manipulacji istniejącymi plikami PDF. IronPDF upraszcza typowe zadania, takie jak scalanie, dzielenie i dodawanie znaków wodnych. GemBox.Pdf oferuje bardziej szczegółową kontrolę nad obiektami PDF, co jest przydatne przy skomplikowanych zadaniach manipulacji.
Jakie są zalety używania IronPDF do konwersji HTML do PDF?
IronPDF oferuje doskonałą jakość konwersji HTML do PDF dzięki silnikowi renderującemu Chrome V8, osiągając ponad 98% zgodności z przeglądarką. Obsługuje nowoczesny CSS3, HTML5, wykonywanie JavaScript, czcionki internetowe i responsywne projekty.
Która biblioteka jest bardziej opłacalna dla małego zespołu deweloperskiego?
Dla zespołu 3 deweloperów potrzebującego konwersji HTML do PDF, IronPDF kosztuje 1 499 USD za licencję Plus, podczas gdy GemBox kosztowałby 5 340 USD za 3 licencje GemBox.Pdf i 3 licencje GemBox.Document. IronPDF oferuje znacznie lepszą wartość dla zespołów.
Czy IronPDF nadaje się do generowania dużej ilości plików PDF?
Tak, IronPDF zapewnia doskonałą wydajność, z czasem renderowania HTML do PDF około 125 ms, zoptymalizowanym wsparciem async/await i efektywnym zużyciem pamięci poniżej 10 MB. Jest doskonale dostosowany do webowego generowania PDF w dużej skali.
Jakie wsparcie jest wliczone w IronPDF?
IronPDF obejmuje wsparcie inżynieryjne 24/5 z bezpośrednim dostępem do zespołu deweloperskiego i typowym czasem odpowiedzi 24-48 godzin, wraz z kompleksową dokumentacją i przykładami kodu.
Czy mogę tworzyć dokumenty zgodne z PDF/A za pośrednictwem tych bibliotek?
Tak, IronPDF może generować dokumenty zgodne z PDF/A za pomocą prostego wywołania metody, takiej jak SaveAsPdfA(), obsługując wiele wersji PDF/A. GemBox.Pdf może odczytywać dokumenty PDF/A i utrzymywać zgodność podczas ich modyfikacji.
Czy te biblioteki są kompatybilne z nowoczesnymi frameworkami .NET?
Tak, obie biblioteki wspierają nowoczesne wersje .NET. IronPDF wspiera .NET Framework 4.6.2+, .NET Core 3.1+ i .NET 5 do 10. GemBox.Pdf wspiera .NET Framework 3.5+, .NET Standard 2.0 i .NET 6+.
Która biblioteka jest zoptymalizowana do wdrażania w chmurze?
IronPDF jest zoptymalizowany do wdrażania w chmurze z wsparciem dla Azure, AWS, kontenerów Docker i środowisk bezserwerowych. Jego podejście oparte na HTML doskonale współgra z aplikacjami internetowymi, czyniąc go lepszym wyborem dla aplikacji SaaS.
Czy jest dostępna darmowa wersja do testowania IronPDF?
IronPDF oferuje darmową opcję testową umożliwiającą nieograniczone rozwijanie i testowanie bez klucza licencyjnego, chociaż na wyjściu pojawią się znaki wodne. Zapewnia to wystarczającą funkcjonalność do oceny produktu przed zakupem.



