Porównanie IronPDF i HiQPdf C#
Szukasz odpowiedniej biblioteki PDF dla swojego projektu .NET? Porównanie między IronPDF a PDFTron (obecnie Apryse) analizuje funkcje, ceny, wydajność i doświadczenia programisty, aby pomóc Ci dokonać świadomego wyboru. Niezależnie od tego, czy budujesz aplikacje webowe, oprogramowanie desktopowe, czy usługi w chmurze, wybór odpowiedniego zestawu narzędzi do PDF może znacznie wpłynąć na szybkość rozwoju i sukces projektu.
Szybkie podsumowanie porównawcze
| Kategoria | Funkcja/aspekt | IronPDF | PDFTron (Apryse) | Kluczowa zaleta |
|---|---|---|---|---|
| Podstawowa architektura | Filozofia projektowania | Prostota na pierwszym miejscu, silnik Chrome V8 | Skoncentrowany na enterprise, niestandardowy silnik | IronPDF: Szybsze tworzenie |
| Złożoność API | Simple methods like RenderHtmlAsPdf() | IronPDF: Znacząco mniej kodu boilerplate | ||
| Krzywa uczenia się | Zazwyczaj 1–2 dni | Zazwyczaj 1–2 tygodnie | IronPDF: Szybsze przyswajanie | |
| Obsługa platform | Wielopłatformowe | Natywne wsparcie, pojedynczy pakiet | Wiele pakietów/modułów wymaganych | IronPDF: Łatwiejsze wdrożenie |
| Wersje .NET | .NET 10, 9, 8, 7, 6, 5, Core 3.1+, Framework 4.6.2+ | Podobne wsparcie z dodatkowymi ustawieniami | Oba: Wsparcie nowoczesnego frameworka | |
| HTML do PDF | Silnik renderujący | Pełny silnik Chrome V8 | Niestandardowy silnik (przez moduł HTML2PDF) | IronPDF: zgodność z przeglądarkami na poziomie ponad 98% |
| Obsługa JavaScript | Pełna obsługa opóźnień renderowania | Ograniczone wsparcie | IronPDF: Gotowość na dynamiczną treść | |
| Obsługa pakietu MS Office | DOCX do PDF | Wbudowany DocxToPdfRenderer | PDFTron: Lepsza wierność dokumentów Office | |
| Wsparcie CAD | Niedostępne | DWG, DXF, DGN do PDF | PDFTron: procesy CAD | |
| Wydajność | Szybkość renderowania HTML | Renderowanie przez silnik Chrome; różni się w zależności od złożoności treści | Renderowanie przez niestandardowy silnik; skontaktuj się z Apryse po benchmarki | Różni się w zależności od przypadku użycia |
| Wykorzystanie pamięci | Wyższe z powodu osadzonego procesu Chrome; wspiera asynchroniczne/równoległe renderowanie | Niższe narzuty dla prostych konwersji (niestandardowy silnik) | Apryse: Niższe zużycie pamięci dla podstawowego użytku | |
| Licensing & Pricing | Poziom początkowy | Lite: $999 (1 deweloper, 1 projekt) | Skontaktuj się z działem sprzedaży, aby uzyskać informacje o cenach | IronPDF: Przejrzyste ceny |
| Enterprise | Professional: $2,999 (10 devs) | Skontaktuj się z działem sprzedaży, aby uzyskać informacje o cenach | IronPDF: Przejrzyste opublikowane cenniki | |
| Wsparcie | Wsparcie techniczne w cenie | Tak, wsparcie inżynierskie 24/5 | Różni się w zależności od poziomu licencji | IronPDF: Wsparcie w cenie |
| Najlepsze dla | Przykłady zastosowań | Nowoczesne aplikacje internetowe, raporty HTML, szybkie tworzenie oprogramowania | Procesy wymagające dużej ilości dokumentów, konwersja plików CAD/Office | Zależy od kontekstu |
Czym są IronPDF i PDFTron (Apryse)?
Przegląd IronPDF
IronPDF to kompleksowa biblioteka .NET do obsługi plików PDF, która ułatwia programistom tworzenie, edycję i obróbkę plików PDF. Oparty na silniku renderującym Chrome, doskonale radzi sobie z konwersją HTML, CSS i JavaScript na dokumenty PDF o idealnej rozdzielczości. Prosta konstrukcja API biblioteki pozwala programistom na integrację funkcji PDF przy użyciu minimalnej ilości kodu, co czyni ją idealną do zastosowania w aplikacjach internetowych, systemach raportowania oraz automatyzacji dokumentów.
Przegląd PDFTron (Apryse)
PDFTron, przemianowany w lutym 2023 r. na Apryse, to SDK do obsługi plików PDF przeznaczony dla Enterprise, który zapewnia szerokie możliwości przetwarzania dokumentów. Pierwotnie opracowany z myślą o złożonych procesach obiegu dokumentów, oferuje solidną obsługę różnych formatów plików, w tym Microsoft Office, rysunków CAD i specjalistycznych typów dokumentów. PDFTron Systems Inc., światowy lider w dziedzinie technologii przetwarzania dokumentów, ogłosił zmianę nazwy na Apryse; zrzeszająca 13 firm, w tym iText, Windward, Eversign i inne.
Jak utworzyć projekt ASP.NET do generowania plików PDF?
Skonfigurowanie projektu ASP.NET do generowania plików PDF wymaga odpowiedniej konfiguracji, niezależnie od tego, którą bibliotekę wybierzesz. Wykonaj poniższe kroki, aby stworzyć podstawę do integracji z IronPDF lub PDFTron:
- Otwórz program Visual Studio 2022 lub nowszą wersję
- Kliknij "Utwórz nowy projekt"
- Wybierz "Aplikacja internetowa ASP.NET Core" (zalecane .NET Core 6.0 lub nowsze)
- Wybierz nazwę projektu i lokalizację
- Wybierz "Aplikacja internetowa (Model-View-Controller)" lub "Web API" w zależności od potrzeb
- Upewnij się, że wybrano wersję ".NET 8.0" lub nowszą, aby zapewnić optymalną kompatybilność
Okno dialogowe "Nowy projekt" programu Visual Studio wyświetlające szablony projektów ASP.NET do integracji biblioteki PDF
W przypadku aplikacji Web Forms:
- Wybierz "Aplikacja internetowa ASP.NET (.NET Framework)"
- Wybierz "Web Forms" spośród opcji szablonów
- Kliknij "Utwórz", aby wygenerować strukturę projektu
Wybór szablonu Web Forms dla tradycyjnych aplikacji ASP.NET z obsługą plików PDF
Jak zainstalować IronPDF w moim projekcie w C#?
IronPDF oferuje wiele metod instalacji dostosowanych do różnych procesów programistycznych. W programie Visual Studio kliknij prawym przyciskiem myszy swój projekt w Eksploratorze rozwiązań i wybierz opcję "Zarządzaj pakietami NuGet...". Następnie wystarczy wyszukać IronPDF i zainstalować najnowszą wersję.
Metoda 1: Korzystanie z menedżera pakietów Visual Studio
Najprostszym podejściem jest użycie wbudowanego w Visual Studio menedżera pakietów NuGet:
- Kliknij prawym przyciskiem myszy swój projekt w Eksploratorze rozwiązań
- Wybierz "Zarządzaj pakietami NuGet"
- Kliknij "Przeglądarki" i wyszukaj "IronPDF"
- Kliknij "Zainstaluj" w pakiecie IronPDF
Dostęp do menedżera pakietów NuGet za pośrednictwem Eksploratora rozwiązań programu Visual Studio w celu instalacji IronPDF
Alternatywny dostęp do menedżera pakietów NuGet poprzez menu Projekt w programie Visual Studio
Instalacja IronPDF za pomocą menedżera pakietów NuGet wraz z informacjami o wersji i zależnościach
Metoda 2: Korzystanie z konsoli menedżera pakietów
Dla deweloperów preferujących narzędzia wiersza polecenia:
# Open Package Manager Console in Visual Studio
# Tools > NuGet Package Manager > Package Manager Console
Install-Package IronPdf
# For specific version installation
Install-Package IronPdf -Version 2025.7.0
# Open Package Manager Console in Visual Studio
# Tools > NuGet Package Manager > Package Manager Console
Install-Package IronPdf
# For specific version installation
Install-Package IronPdf -Version 2025.7.0
Metoda 3: Instalacja poprzez bezpośrednie pobranie
W środowiskach bez dostępu do NuGet:
- Pobierz z oficjalnej strony IronPDF
- Rozpakuj plik ZIP do katalogu projektu
- W programie Visual Studio kliknij prawym przyciskiem myszy "Odwołania" → "Dodaj odwołanie"
- Przejdź do i wybierz
IronPdf.dll
Metoda 4: Korzystanie z .NET CLI
Dla entuzjastów wiersza poleceń i potoków CI/CD:
# Navigate to your project directory
cd MyProject
# Install IronPDF
dotnet add package IronPdf
# Restore packages
dotnet restore
# Navigate to your project directory
cd MyProject
# Install IronPDF
dotnet add package IronPdf
# Restore packages
dotnet restore
Jak zainstalować SDK PDFTron (Apryse)?
Instalacja PDFTron wymaga wykonania większej liczby kroków ze względu na jego modułową architekturę i ukierunkowanie na Enterprise. Proces różni się w zależności od platformy docelowej i wymaganych funkcji.
Wymagania wstępne
- Visual Studio 2019 lub nowsze
- Obciążenie związane z tworzeniem aplikacji desktopowych w środowisku .NET
- Narzędzia programistyczne .NET Framework 4.5.1+
- Pobierz PDFTron SDK
Ręczne kroki integracji
-
Wyodrębnij SDK
# Example extraction path PDFNET_BASE = C:/PDFTron/PDFNetDotNet4/# Example extraction path PDFNET_BASE = C:/PDFTron/PDFNetDotNet4/SHELL -
Inicjalizacja za pomocą klucza licencyjnego
// Initialize PDFTron with your license key pdftron.PDFNet.Initialize("your-license-key-here"); // Note: Demo keys expire after evaluation period // Contact Apryse sales for production licenses// Initialize PDFTron with your license key pdftron.PDFNet.Initialize("your-license-key-here"); // Note: Demo keys expire after evaluation period // Contact Apryse sales for production licenses' Initialize PDFTron with your license key pdftron.PDFNet.Initialize("your-license-key-here") ' Note: Demo keys expire after evaluation period ' Contact Apryse sales for production licenses$vbLabelText $csharpLabel -
Skopiuj wymagane biblioteki
- Skopiuj folder
LibzPDFNET_BASEdo katalogu projektu - Dodaj odniesienia do obu
PDFNetLoader.dlli platformowo-specyficznychPDFNet.dll
- Skopiuj folder
- Skonfiguruj właściwość Copy Local
Ustawienie właściwości Copy Local biblioteki PDFNet.dll na False w celu prawidłowego wdrożenia PDFTron
-
Zaktualizuj plik App.config
<configuration> <runtime> <loadFromRemoteSources enabled="true" /> </runtime> </configuration><configuration> <runtime> <loadFromRemoteSources enabled="true" /> </runtime> </configuration>XML -
Konfiguracja zdarzeń po kompilacji
xcopy $(ProjectDir)Lib\PDFNet $(TargetDir)PDFNet /S /I /Yxcopy $(ProjectDir)Lib\PDFNet $(TargetDir)PDFNet /S /I /YSHELL
Instalacja NuGet (uproszczona)
Aby uzyskać bardziej zwięzłe podejście:
- Otwórz menedżera pakietów NuGet
- Wyszukaj "PDFTron.NET.x64" lub pakiet przeznaczony dla konkretnej platformy
- Zainstaluj odpowiedni pakiet dla swojej architektury
Instalacja PDFTron za pomocą menedżera pakietów NuGet z pakietami specyficznymi dla platformy
PDFTron oferuje szerszy wybór ponad 30 typów adnotacji w porównaniu z ponad 10 typami dostępnymi w ComPDFKit. Jednak ten rozbudowany zestaw funkcji wymaga starannego doboru modułów podczas instalacji.
Jak przekonwertować adres URL na plik PDF przy użyciu tych bibliotek?
Obie biblioteki umożliwiają konwersję adresów URL do formatu PDF, ale mają różne podejścia i możliwości. Przyjrzyjmy się szczegółom implementacji i charakterystyce wydajnościowej każdego z nich.
URL do pliku PDF za pomocą IronPDF
Silnik renderujący IronPDF dla przeglądarki Chrome zapewnia wyjątkową obsługę nowoczesnych standardów internetowych:
using IronPdf;
// Initialize the Chrome renderer with advanced options
var renderer = new ChromePdfRenderer();
// Configure rendering for optimal results
renderer.RenderingOptions.PaperSize = PdfPaperSize.A4;
renderer.RenderingOptions.MarginTop = 20;
renderer.RenderingOptions.MarginBottom = 20;
renderer.RenderingOptions.CssMediaType = PdfCssMediaType.Print;
renderer.RenderingOptions.EnableJavaScript = true;
renderer.RenderingOptions.RenderDelay = 1000; // Wait for JS execution
// Handle authentication if needed
renderer.LoginCredentials = new ChromeHttpLoginCredentials() {
Username = "user@domain.com",
Password = "secure_password"
};
// Render URL to PDF with full browser capabilities
var pdf = renderer.RenderUrlAsPdf("https://ironpdf.com/");
// Add metadata for document management
pdf.MetaData.Author = "Development Team";
pdf.MetaData.Title = "Website Export - " + DateTime.Now.ToString("yyyy-MM-dd");
// Save with compression
pdf.CompressImages(90);
pdf.SaveAs("website-export.pdf");
using IronPdf;
// Initialize the Chrome renderer with advanced options
var renderer = new ChromePdfRenderer();
// Configure rendering for optimal results
renderer.RenderingOptions.PaperSize = PdfPaperSize.A4;
renderer.RenderingOptions.MarginTop = 20;
renderer.RenderingOptions.MarginBottom = 20;
renderer.RenderingOptions.CssMediaType = PdfCssMediaType.Print;
renderer.RenderingOptions.EnableJavaScript = true;
renderer.RenderingOptions.RenderDelay = 1000; // Wait for JS execution
// Handle authentication if needed
renderer.LoginCredentials = new ChromeHttpLoginCredentials() {
Username = "user@domain.com",
Password = "secure_password"
};
// Render URL to PDF with full browser capabilities
var pdf = renderer.RenderUrlAsPdf("https://ironpdf.com/");
// Add metadata for document management
pdf.MetaData.Author = "Development Team";
pdf.MetaData.Title = "Website Export - " + DateTime.Now.ToString("yyyy-MM-dd");
// Save with compression
pdf.CompressImages(90);
pdf.SaveAs("website-export.pdf");
Imports IronPdf
' Initialize the Chrome renderer with advanced options
Private renderer = New ChromePdfRenderer()
' Configure rendering for optimal results
renderer.RenderingOptions.PaperSize = PdfPaperSize.A4
renderer.RenderingOptions.MarginTop = 20
renderer.RenderingOptions.MarginBottom = 20
renderer.RenderingOptions.CssMediaType = PdfCssMediaType.Print
renderer.RenderingOptions.EnableJavaScript = True
renderer.RenderingOptions.RenderDelay = 1000 ' Wait for JS execution
' Handle authentication if needed
renderer.LoginCredentials = New ChromeHttpLoginCredentials() With {
.Username = "user@domain.com",
.Password = "secure_password"
}
' Render URL to PDF with full browser capabilities
Dim pdf = renderer.RenderUrlAsPdf("https://ironpdf.com/")
' Add metadata for document management
pdf.MetaData.Author = "Development Team"
pdf.MetaData.Title = "Website Export - " & DateTime.Now.ToString("yyyy-MM-dd")
' Save with compression
pdf.CompressImages(90)
pdf.SaveAs("website-export.pdf")
Renderer Chrome w IronPDF obsługuje złożone scenariusze, w tym:
- Aplikacje jednostronicowe (SPA) z intensywnym wykorzystaniem JavaScript
- Responsywne projekty z wykorzystaniem zapytań o media
- Czcionki internetowe i zewnętrzne arkusze stylów
- Ładowanie treści AJAX
- Animacje i przejścia CSS
IronPDF obsługuje te scenariusze renderowania od razu: nuget.org/packages/IronPdf. Ostatnie usprawnienia wydajności poprawiły szybkość renderowania, zwłaszcza dla złożonych aplikacji webowych.
URL do pliku PDF za pomocą PDFTron (Apryse)
PDFTron wymaga modułu HTML2PDF do konwersji treści internetowych:
using pdftron;
using pdftron.PDF;
using pdftron.SDF;
class UrlToPdfConverter
{
public static void ConvertUrlToPdf(string url, string outputPath)
{
// Initialize PDFTron with license
PDFNet.Initialize("your-license-key");
// Create a new PDF document
using (PDFDoc doc = new PDFDoc())
{
// Initialize HTML2PDF converter
HTML2PDF converter = new HTML2PDF();
// Configure conversion settings
HTML2PDF.WebPageSettings settings = new HTML2PDF.WebPageSettings();
settings.SetPrintBackground(true);
settings.SetLoadImages(true);
// Set page dimensions
converter.SetPaperSize(PrinterMode.PaperSize.e_letter);
converter.SetMargins(0.5, 0.5, 0.5, 0.5);
// Insert URL content
converter.InsertFromURL(url);
// Perform conversion
if (converter.Convert(doc))
{
// Save the resulting PDF
doc.Save(outputPath, SDFDoc.SaveOptions.e_linearized);
Console.WriteLine($"Successfully converted {url} to {outputPath}");
}
else
{
Console.WriteLine("Conversion failed");
}
}
}
}
using pdftron;
using pdftron.PDF;
using pdftron.SDF;
class UrlToPdfConverter
{
public static void ConvertUrlToPdf(string url, string outputPath)
{
// Initialize PDFTron with license
PDFNet.Initialize("your-license-key");
// Create a new PDF document
using (PDFDoc doc = new PDFDoc())
{
// Initialize HTML2PDF converter
HTML2PDF converter = new HTML2PDF();
// Configure conversion settings
HTML2PDF.WebPageSettings settings = new HTML2PDF.WebPageSettings();
settings.SetPrintBackground(true);
settings.SetLoadImages(true);
// Set page dimensions
converter.SetPaperSize(PrinterMode.PaperSize.e_letter);
converter.SetMargins(0.5, 0.5, 0.5, 0.5);
// Insert URL content
converter.InsertFromURL(url);
// Perform conversion
if (converter.Convert(doc))
{
// Save the resulting PDF
doc.Save(outputPath, SDFDoc.SaveOptions.e_linearized);
Console.WriteLine($"Successfully converted {url} to {outputPath}");
}
else
{
Console.WriteLine("Conversion failed");
}
}
}
}
Imports pdftron
Imports pdftron.PDF
Imports pdftron.SDF
Friend Class UrlToPdfConverter
Public Shared Sub ConvertUrlToPdf(ByVal url As String, ByVal outputPath As String)
' Initialize PDFTron with license
PDFNet.Initialize("your-license-key")
' Create a new PDF document
Using doc As New PDFDoc()
' Initialize HTML2PDF converter
Dim converter As New HTML2PDF()
' Configure conversion settings
Dim settings As New HTML2PDF.WebPageSettings()
settings.SetPrintBackground(True)
settings.SetLoadImages(True)
' Set page dimensions
converter.SetPaperSize(PrinterMode.PaperSize.e_letter)
converter.SetMargins(0.5, 0.5, 0.5, 0.5)
' Insert URL content
converter.InsertFromURL(url)
' Perform conversion
If converter.Convert(doc) Then
' Save the resulting PDF
doc.Save(outputPath, SDFDoc.SaveOptions.e_linearized)
Console.WriteLine($"Successfully converted {url} to {outputPath}")
Else
Console.WriteLine("Conversion failed")
End If
End Using
End Sub
End Class
Ważne uwagi dotyczące PDFTron HTML2PDF:
- Wycena pakietu SDK firmy PDFTron opiera się na zakresie technologii (interfejsy API, funkcje) oraz zasięgu dystrybucji (użytkownicy zewnętrzni lub wewnętrzni).
- Ograniczona obsługa JavaScript w porównaniu z silnikami przeglądarek
- Może wymagać dodatkowej konfiguracji w przypadku złożonych układów
- Bardziej odpowiednie dla prostszych dokumentów HTML
Jak tworzyć pliki PDF z ciągów znaków HTML?
Tworzenie plików PDF na podstawie ciągów znaków HTML jest niezbędne do generowania dynamicznych raportów, faktur i dokumentów. Obie biblioteki obsługują to w różny sposób.
Przekształcanie ciągów znaków HTML do formatu PDF za pomocą IronPDF
IronPDF doskonale radzi sobie z renderowaniem złożonego kodu HTML z pełną obsługą CSS3 i JavaScript:
using IronPdf;
using System.Text;
public class HtmlStringToPdfConverter
{
public static PdfDocument GenerateInvoice(InvoiceData data)
{
// Build dynamic HTML with modern CSS
var html = new StringBuilder();
html.Append(@"
<!DOCTYPE html>
<html>
<head>
<meta charset='UTF-8'>
<style>
@import url('https://fonts.googleapis.com/css2?family=Roboto:wght@300;400;700&display=swap');
body {
font-family: 'Roboto', sans-serif;
margin: 0;
padding: 20px;
color: #333;
}
.invoice-header {
display: flex;
justify-content: space-between;
border-bottom: 2px solid #007bff;
padding-bottom: 20px;
margin-bottom: 30px;
}
.company-logo {
width: 150px;
height: auto;
}
.invoice-details {
text-align: right;
}
.invoice-number {
font-size: 24px;
font-weight: 700;
color: #007bff;
}
table {
width: 100%;
border-collapse: collapse;
margin-top: 20px;
}
th {
background-color: #f8f9fa;
padding: 12px;
text-align: left;
border-bottom: 2px solid #dee2e6;
}
td {
padding: 12px;
border-bottom: 1px solid #dee2e6;
}
.total-row {
font-weight: 700;
font-size: 18px;
background-color: #e9ecef;
}
@media print {
body { margin: 0; }
.no-print { display: none; }
}
</style>
</head>
<body>
");
// Add invoice header
html.Append($@"
<div class='invoice-header'>
<div>
<img src='data:image/png;base64,{data.CompanyLogoBase64}' class='company-logo' alt='Company Logo'>
<h2>{data.CompanyName}</h2>
<p>{data.CompanyAddress}</p>
</div>
<div class='invoice-details'>
<div class='invoice-number'>Invoice #{data.InvoiceNumber}</div>
<p>Date: {data.InvoiceDate:yyyy-MM-dd}</p>
<p>Due: {data.DueDate:yyyy-MM-dd}</p>
</div>
</div>
");
// Add line items table
html.Append(@"
<table>
<thead>
<tr>
<th>Description</th>
<th>Quantity</th>
<th>Unit Price</th>
<th>Total</th>
</tr>
</thead>
<tbody>
");
foreach (var item in data.LineItems)
{
html.Append($@"
<tr>
<td>{item.Description}</td>
<td>{item.Quantity}</td>
<td>${item.UnitPrice:F2}</td>
<td>${item.Total:F2}</td>
</tr>
");
}
html.Append($@"
</tbody>
<tfoot>
<tr class='total-row'>
<td colspan='3'>Total</td>
<td>${data.Total:F2}</td>
</tr>
</tfoot>
</table>
</body>
</html>
");
// Configure renderer for optimal output
var renderer = new ChromePdfRenderer();
renderer.RenderingOptions.CssMediaType = PdfCssMediaType.Print;
renderer.RenderingOptions.EnableJavaScript = true;
renderer.RenderingOptions.CreatePdfFormsFromHtml = true;
// Generate PDF with proper base path for assets
var pdf = renderer.RenderHtmlAsPdf(html.ToString());
// Add security if needed
pdf.SecuritySettings.UserPassword = data.CustomerEmail;
pdf.SecuritySettings.AllowUserPrinting = true;
pdf.SecuritySettings.AllowUserCopyPasteContent = false;
return pdf;
}
}
using IronPdf;
using System.Text;
public class HtmlStringToPdfConverter
{
public static PdfDocument GenerateInvoice(InvoiceData data)
{
// Build dynamic HTML with modern CSS
var html = new StringBuilder();
html.Append(@"
<!DOCTYPE html>
<html>
<head>
<meta charset='UTF-8'>
<style>
@import url('https://fonts.googleapis.com/css2?family=Roboto:wght@300;400;700&display=swap');
body {
font-family: 'Roboto', sans-serif;
margin: 0;
padding: 20px;
color: #333;
}
.invoice-header {
display: flex;
justify-content: space-between;
border-bottom: 2px solid #007bff;
padding-bottom: 20px;
margin-bottom: 30px;
}
.company-logo {
width: 150px;
height: auto;
}
.invoice-details {
text-align: right;
}
.invoice-number {
font-size: 24px;
font-weight: 700;
color: #007bff;
}
table {
width: 100%;
border-collapse: collapse;
margin-top: 20px;
}
th {
background-color: #f8f9fa;
padding: 12px;
text-align: left;
border-bottom: 2px solid #dee2e6;
}
td {
padding: 12px;
border-bottom: 1px solid #dee2e6;
}
.total-row {
font-weight: 700;
font-size: 18px;
background-color: #e9ecef;
}
@media print {
body { margin: 0; }
.no-print { display: none; }
}
</style>
</head>
<body>
");
// Add invoice header
html.Append($@"
<div class='invoice-header'>
<div>
<img src='data:image/png;base64,{data.CompanyLogoBase64}' class='company-logo' alt='Company Logo'>
<h2>{data.CompanyName}</h2>
<p>{data.CompanyAddress}</p>
</div>
<div class='invoice-details'>
<div class='invoice-number'>Invoice #{data.InvoiceNumber}</div>
<p>Date: {data.InvoiceDate:yyyy-MM-dd}</p>
<p>Due: {data.DueDate:yyyy-MM-dd}</p>
</div>
</div>
");
// Add line items table
html.Append(@"
<table>
<thead>
<tr>
<th>Description</th>
<th>Quantity</th>
<th>Unit Price</th>
<th>Total</th>
</tr>
</thead>
<tbody>
");
foreach (var item in data.LineItems)
{
html.Append($@"
<tr>
<td>{item.Description}</td>
<td>{item.Quantity}</td>
<td>${item.UnitPrice:F2}</td>
<td>${item.Total:F2}</td>
</tr>
");
}
html.Append($@"
</tbody>
<tfoot>
<tr class='total-row'>
<td colspan='3'>Total</td>
<td>${data.Total:F2}</td>
</tr>
</tfoot>
</table>
</body>
</html>
");
// Configure renderer for optimal output
var renderer = new ChromePdfRenderer();
renderer.RenderingOptions.CssMediaType = PdfCssMediaType.Print;
renderer.RenderingOptions.EnableJavaScript = true;
renderer.RenderingOptions.CreatePdfFormsFromHtml = true;
// Generate PDF with proper base path for assets
var pdf = renderer.RenderHtmlAsPdf(html.ToString());
// Add security if needed
pdf.SecuritySettings.UserPassword = data.CustomerEmail;
pdf.SecuritySettings.AllowUserPrinting = true;
pdf.SecuritySettings.AllowUserCopyPasteContent = false;
return pdf;
}
}
Imports IronPdf
Imports System.Text
Public Class HtmlStringToPdfConverter
Public Shared Function GenerateInvoice(ByVal data As InvoiceData) As PdfDocument
' Build dynamic HTML with modern CSS
Dim html = New StringBuilder()
html.Append("
<!DOCTYPE html>
<html>
<head>
<meta charset='UTF-8'>
<style>
@import url('https://fonts.googleapis.com/css2?family=Roboto:wght@300;400;700&display=swap');
body {
font-family: 'Roboto', sans-serif;
margin: 0;
padding: 20px;
color: #333;
}
.invoice-header {
display: flex;
justify-content: space-between;
border-bottom: 2px solid #007bff;
padding-bottom: 20px;
margin-bottom: 30px;
}
.company-logo {
width: 150px;
height: auto;
}
.invoice-details {
text-align: right;
}
.invoice-number {
font-size: 24px;
font-weight: 700;
color: #007bff;
}
table {
width: 100%;
border-collapse: collapse;
margin-top: 20px;
}
th {
background-color: #f8f9fa;
padding: 12px;
text-align: left;
border-bottom: 2px solid #dee2e6;
}
td {
padding: 12px;
border-bottom: 1px solid #dee2e6;
}
.total-row {
font-weight: 700;
font-size: 18px;
background-color: #e9ecef;
}
@media print {
body { margin: 0; }
.no-print { display: none; }
}
</style>
</head>
<body>
")
' Add invoice header
html.Append($"
<div class='invoice-header'>
<div>
<img src='data:image/png;base64,{data.CompanyLogoBase64}' class='company-logo' alt='Company Logo'>
<h2>{data.CompanyName}</h2>
<p>{data.CompanyAddress}</p>
</div>
<div class='invoice-details'>
<div class='invoice-number'>Invoice #{data.InvoiceNumber}</div>
<p>Date: {data.InvoiceDate:yyyy-MM-dd}</p>
<p>Due: {data.DueDate:yyyy-MM-dd}</p>
</div>
</div>
")
' Add line items table
html.Append("
<table>
<thead>
<tr>
<th>Description</th>
<th>Quantity</th>
<th>Unit Price</th>
<th>Total</th>
</tr>
</thead>
<tbody>
")
For Each item In data.LineItems
html.Append($"
<tr>
<td>{item.Description}</td>
<td>{item.Quantity}</td>
<td>${item.UnitPrice:F2}</td>
<td>${item.Total:F2}</td>
</tr>
")
Next item
html.Append($"
</tbody>
<tfoot>
<tr class='total-row'>
<td colspan='3'>Total</td>
<td>${data.Total:F2}</td>
</tr>
</tfoot>
</table>
</body>
</html>
")
' Configure renderer for optimal output
Dim renderer = New ChromePdfRenderer()
renderer.RenderingOptions.CssMediaType = PdfCssMediaType.Print
renderer.RenderingOptions.EnableJavaScript = True
renderer.RenderingOptions.CreatePdfFormsFromHtml = True
' Generate PDF with proper base path for assets
Dim pdf = renderer.RenderHtmlAsPdf(html.ToString())
' Add security if needed
pdf.SecuritySettings.UserPassword = data.CustomerEmail
pdf.SecuritySettings.AllowUserPrinting = True
pdf.SecuritySettings.AllowUserCopyPasteContent = False
Return pdf
End Function
End Class
Główne zalety renderowania HTML w IronPDF:
- Pełna obsługa CSS3, w tym układy flexbox i grid
- Google Fonts i integracja czcionek internetowych
- Biblioteki wykresów JavaScript (Chart.js, D3.js) renderują się idealnie
- Obsługa responsywnego projektowania z kontrolą okna wyświetlania
- Osadzanie obrazów w formacie Base64 w dokumentach samodzielnych
Przekształcanie ciągów znaków HTML do formatu PDF za pomocą PDFTron (Apryse)
Podejście PDFTron do konwersji ciągów znaków HTML:
using pdftron;
using pdftron.PDF;
using pdftron.SDF;
public class PdfTronHtmlConverter
{
public static void ConvertHtmlString(string htmlContent, string outputPath)
{
PDFNet.Initialize("your-license-key");
using (PDFDoc doc = new PDFDoc())
{
// Create HTML2PDF converter instance
HTML2PDF converter = new HTML2PDF();
// Configure page settings
converter.SetPaperSize(PrinterMode.PaperSize.e_letter);
converter.SetLandscape(false);
converter.SetMargins(1.0, 1.0, 1.0, 1.0, HTML2PDF.e_inches);
// Enable images and backgrounds
HTML2PDF.WebPageSettings settings = new HTML2PDF.WebPageSettings();
settings.SetPrintBackground(true);
settings.SetLoadImages(true);
settings.SetJavaScriptDelay(1000); // Limited JS support
// Insert HTML content
converter.InsertFromHtmlString(htmlContent);
// Convert to PDF
if (converter.Convert(doc))
{
// Post-processing options
doc.Save(outputPath, SDFDoc.SaveOptions.e_linearized);
}
}
}
}
using pdftron;
using pdftron.PDF;
using pdftron.SDF;
public class PdfTronHtmlConverter
{
public static void ConvertHtmlString(string htmlContent, string outputPath)
{
PDFNet.Initialize("your-license-key");
using (PDFDoc doc = new PDFDoc())
{
// Create HTML2PDF converter instance
HTML2PDF converter = new HTML2PDF();
// Configure page settings
converter.SetPaperSize(PrinterMode.PaperSize.e_letter);
converter.SetLandscape(false);
converter.SetMargins(1.0, 1.0, 1.0, 1.0, HTML2PDF.e_inches);
// Enable images and backgrounds
HTML2PDF.WebPageSettings settings = new HTML2PDF.WebPageSettings();
settings.SetPrintBackground(true);
settings.SetLoadImages(true);
settings.SetJavaScriptDelay(1000); // Limited JS support
// Insert HTML content
converter.InsertFromHtmlString(htmlContent);
// Convert to PDF
if (converter.Convert(doc))
{
// Post-processing options
doc.Save(outputPath, SDFDoc.SaveOptions.e_linearized);
}
}
}
}
Imports pdftron
Imports pdftron.PDF
Imports pdftron.SDF
Public Class PdfTronHtmlConverter
Public Shared Sub ConvertHtmlString(ByVal htmlContent As String, ByVal outputPath As String)
PDFNet.Initialize("your-license-key")
Using doc As New PDFDoc()
' Create HTML2PDF converter instance
Dim converter As New HTML2PDF()
' Configure page settings
converter.SetPaperSize(PrinterMode.PaperSize.e_letter)
converter.SetLandscape(False)
converter.SetMargins(1.0, 1.0, 1.0, 1.0, HTML2PDF.e_inches)
' Enable images and backgrounds
Dim settings As New HTML2PDF.WebPageSettings()
settings.SetPrintBackground(True)
settings.SetLoadImages(True)
settings.SetJavaScriptDelay(1000) ' Limited JS support
' Insert HTML content
converter.InsertFromHtmlString(htmlContent)
' Convert to PDF
If converter.Convert(doc) Then
' Post-processing options
doc.Save(outputPath, SDFDoc.SaveOptions.e_linearized)
End If
End Using
End Sub
End Class
Ograniczenia PDFTron HTML, które należy wziąć pod uwagę:
- Podstawowa obsługa CSS (bez zaawansowanych układów)
- Ograniczone wykonywanie kodu JavaScript
- Osadzanie czcionek wymaga dodatkowej konfiguracji
- Bardziej odpowiednie dla prostych układów dokumentów
Jak mogę przekonwertować strony ASPX do formatu PDF?
Konwersja stron ASPX do formatu PDF jest częstym wymaganiem w aplikacjach ASP.NET. IronPDF zapewnia natywną obsługę, podczas gdy PDFTron wymaga zastosowania rozwiązań alternatywnych.
ASPX do PDF z IronPDF
IronPDF oferuje płynną konwersję ASPX za pomocą jednej linii kodu:
using IronPdf;
public partial class InvoicePage : System.Web.UI.Page
{
protected void Page_Load(object sender, EventArgs e)
{
// Render the current ASPX page as PDF on page load
if (Request.QueryString["pdf"] == "true")
{
// Configure PDF output options
AspxToPdf.RenderThisPageAsPdf(
AspxToPdf.FileBehavior.InBrowser,
"Invoice_" + DateTime.Now.ToString("yyyyMMdd") + ".pdf");
}
}
protected void ExportToPdfButton_Click(object sender, EventArgs e)
{
// Advanced configuration for ASPX to PDF
IronPdf.AspxToPdf.RenderThisPageAsPdf(
IronPdf.AspxToPdf.FileBehavior.Attachment,
"Invoice.pdf",
new ChromePdfRenderOptions()
{
PaperSize = PdfPaperSize.A4,
MarginTop = 20,
MarginBottom = 20,
CssMediaType = PdfCssMediaType.Print,
EnableJavaScript = true,
CreatePdfFormsFromHtml = true,
FitToPaper = true
});
}
}
using IronPdf;
public partial class InvoicePage : System.Web.UI.Page
{
protected void Page_Load(object sender, EventArgs e)
{
// Render the current ASPX page as PDF on page load
if (Request.QueryString["pdf"] == "true")
{
// Configure PDF output options
AspxToPdf.RenderThisPageAsPdf(
AspxToPdf.FileBehavior.InBrowser,
"Invoice_" + DateTime.Now.ToString("yyyyMMdd") + ".pdf");
}
}
protected void ExportToPdfButton_Click(object sender, EventArgs e)
{
// Advanced configuration for ASPX to PDF
IronPdf.AspxToPdf.RenderThisPageAsPdf(
IronPdf.AspxToPdf.FileBehavior.Attachment,
"Invoice.pdf",
new ChromePdfRenderOptions()
{
PaperSize = PdfPaperSize.A4,
MarginTop = 20,
MarginBottom = 20,
CssMediaType = PdfCssMediaType.Print,
EnableJavaScript = true,
CreatePdfFormsFromHtml = true,
FitToPaper = true
});
}
}
Imports IronPdf
Partial Public Class InvoicePage
Inherits System.Web.UI.Page
Protected Sub Page_Load(ByVal sender As Object, ByVal e As EventArgs)
' Render the current ASPX page as PDF on page load
If Request.QueryString("pdf") = "true" Then
' Configure PDF output options
AspxToPdf.RenderThisPageAsPdf(AspxToPdf.FileBehavior.InBrowser, "Invoice_" & DateTime.Now.ToString("yyyyMMdd") & ".pdf")
End If
End Sub
Protected Sub ExportToPdfButton_Click(ByVal sender As Object, ByVal e As EventArgs)
' Advanced configuration for ASPX to PDF
IronPdf.AspxToPdf.RenderThisPageAsPdf(IronPdf.AspxToPdf.FileBehavior.Attachment, "Invoice.pdf", New ChromePdfRenderOptions() With {
.PaperSize = PdfPaperSize.A4,
.MarginTop = 20,
.MarginBottom = 20,
.CssMediaType = PdfCssMediaType.Print,
.EnableJavaScript = True,
.CreatePdfFormsFromHtml = True,
.FitToPaper = True
})
End Sub
End Class
Aby uzyskać większą kontrolę nad procesem renderowania:
// In Global.asax.cs or Startup.cs
public static void ConfigureAspxToPdf()
{
// Set global defaults for all ASPX to PDF conversions
AspxToPdf.GlobalSettings.PaperSize = PdfPaperSize.A4;
AspxToPdf.GlobalSettings.PrintHtmlBackgrounds = true;
AspxToPdf.GlobalSettings.EnableJavaScript = true;
AspxToPdf.GlobalSettings.CssMediaType = PdfCssMediaType.Screen;
// Custom headers and footers
AspxToPdf.GlobalSettings.HtmlHeader = new HtmlHeaderFooter()
{
HtmlFragment = "<div style='text-align: center; font-size: 12px;'>{page} of {total-pages}</div>",
Height = 25
};
}
// In Global.asax.cs or Startup.cs
public static void ConfigureAspxToPdf()
{
// Set global defaults for all ASPX to PDF conversions
AspxToPdf.GlobalSettings.PaperSize = PdfPaperSize.A4;
AspxToPdf.GlobalSettings.PrintHtmlBackgrounds = true;
AspxToPdf.GlobalSettings.EnableJavaScript = true;
AspxToPdf.GlobalSettings.CssMediaType = PdfCssMediaType.Screen;
// Custom headers and footers
AspxToPdf.GlobalSettings.HtmlHeader = new HtmlHeaderFooter()
{
HtmlFragment = "<div style='text-align: center; font-size: 12px;'>{page} of {total-pages}</div>",
Height = 25
};
}
' In Global.asax.cs or Startup.cs
Public Shared Sub ConfigureAspxToPdf()
' Set global defaults for all ASPX to PDF conversions
AspxToPdf.GlobalSettings.PaperSize = PdfPaperSize.A4
AspxToPdf.GlobalSettings.PrintHtmlBackgrounds = True
AspxToPdf.GlobalSettings.EnableJavaScript = True
AspxToPdf.GlobalSettings.CssMediaType = PdfCssMediaType.Screen
' Custom headers and footers
AspxToPdf.GlobalSettings.HtmlHeader = New HtmlHeaderFooter() With {
.HtmlFragment = "<div style='text-align: center; font-size: 12px;'>{page} of {total-pages}</div>",
.Height = 25
}
End Sub
Funkcja ASPX do PDF firmy IronPDF zachowuje:
ViewStatei wartości formularza- Dane stanu sesji
- Stylizacja CSS i układy
- Treści renderowane w JavaScript
- Układy stron głównych
Alternatywa dla ASPX z PDFTron
Apryse (PDFTron) nie oferuje wbudowanego renderer'a ASPX-to-PDF równoważnego z klasą AspxToPdf w IronPDF. Programiści zwykle rozwiązują to, przechwytując wynik strony ASPX jako ciąg HTML najpierw:
// Capture ASPX output as HTML, then convert
public void ConvertAspxWithPdfTron()
{
// Render ASPX to string first
StringWriter sw = new StringWriter();
HtmlTextWriter hw = new HtmlTextWriter(sw);
// Render the page to HTML
this.RenderControl(hw);
string htmlContent = sw.ToString();
// Then use PDFTron's HTML2PDF
PDFNet.Initialize("your-license-key");
using (PDFDoc doc = new PDFDoc())
{
HTML2PDF converter = new HTML2PDF();
converter.InsertFromHtmlString(htmlContent);
converter.Convert(doc);
// Send to browser
byte[] pdfBytes = doc.Save(SDFDoc.SaveOptions.e_linearized);
Response.ContentType = "application/pdf";
Response.BinaryWrite(pdfBytes);
Response.End();
}
}
// Capture ASPX output as HTML, then convert
public void ConvertAspxWithPdfTron()
{
// Render ASPX to string first
StringWriter sw = new StringWriter();
HtmlTextWriter hw = new HtmlTextWriter(sw);
// Render the page to HTML
this.RenderControl(hw);
string htmlContent = sw.ToString();
// Then use PDFTron's HTML2PDF
PDFNet.Initialize("your-license-key");
using (PDFDoc doc = new PDFDoc())
{
HTML2PDF converter = new HTML2PDF();
converter.InsertFromHtmlString(htmlContent);
converter.Convert(doc);
// Send to browser
byte[] pdfBytes = doc.Save(SDFDoc.SaveOptions.e_linearized);
Response.ContentType = "application/pdf";
Response.BinaryWrite(pdfBytes);
Response.End();
}
}
' Capture ASPX output as HTML, then convert
Public Sub ConvertAspxWithPdfTron()
' Render ASPX to string first
Dim sw As New StringWriter()
Dim hw As New HtmlTextWriter(sw)
' Render the page to HTML
Me.RenderControl(hw)
Dim htmlContent As String = sw.ToString()
' Then use PDFTron's HTML2PDF
PDFNet.Initialize("your-license-key")
Using doc As New PDFDoc()
Dim converter As New HTML2PDF()
converter.InsertFromHtmlString(htmlContent)
converter.Convert(doc)
' Send to browser
Dim pdfBytes() As Byte = doc.Save(SDFDoc.SaveOptions.e_linearized)
Response.ContentType = "application/pdf"
Response.BinaryWrite(pdfBytes)
Response.End()
End Using
End Sub
Jak Konwertować Obrazy na PDF?
Konwersja obrazów do formatu PDF jest niezbędna do archiwizacji dokumentów i tworzenia portfolio. Obie biblioteki oferują tę funkcjonalność, stosując różne podejścia.
Obraz do pliku PDF za pomocą IronPDF
IronPDF dostarcza dedykowaną klasę ImageToPdfConverter dla efektywnego przetwarzania wsadowego:
using IronPdf;
using System.IO;
using System.Linq;
public class ImagePdfGenerator
{
public static void CreatePhotoAlbum(string imageFolder, string outputPath)
{
// Get all supported image files
var supportedExtensions = new[] { ".jpg", ".jpeg", ".png", ".gif", ".bmp", ".tiff", ".svg" };
var imageFiles = Directory.GetFiles(imageFolder)
.Where(f => supportedExtensions.Contains(Path.GetExtension(f).ToLower()))
.OrderBy(f => f);
// Convert images to PDF with options
var pdf = ImageToPdfConverter.ImageToPdf(imageFiles, ImageBehavior.FitToPage);
// Add metadata
pdf.MetaData.Title = "Photo Album";
pdf.MetaData.Author = "Photography Department";
pdf.MetaData.CreationDate = DateTime.Now;
// Apply compression for smaller file size
pdf.CompressImages(80); // 80% quality
// Save the PDF
pdf.SaveAs(outputPath);
}
public static void CreateThumbnailCatalog(List<ProductImage> images)
{
var renderer = new ChromePdfRenderer();
// Build HTML with image grid
var html = @"
<html>
<head>
<style>
.image-grid {
display: grid;
grid-template-columns: repeat(3, 1fr);
gap: 20px;
padding: 20px;
}
.image-item {
text-align: center;
}
.image-item img {
max-width: 100%;
height: 200px;
object-fit: cover;
border: 1px solid #ddd;
}
.image-caption {
margin-top: 10px;
font-size: 12px;
}
</style>
</head>
<body>
<h1>Product Catalog</h1>
<div class='image-grid'>";
foreach (var image in images)
{
html += $@"
<div class='image-item'>
<img src='data:image/jpeg;base64,{image.Base64Data}' />
<div class='image-caption'>{image.ProductName}</div>
</div>";
}
html += "</div></body></html>";
// Render with optimal settings for images
renderer.RenderingOptions.CssMediaType = PdfCssMediaType.Print;
var pdf = renderer.RenderHtmlAsPdf(html);
pdf.SaveAs("product-catalog.pdf");
}
}
using IronPdf;
using System.IO;
using System.Linq;
public class ImagePdfGenerator
{
public static void CreatePhotoAlbum(string imageFolder, string outputPath)
{
// Get all supported image files
var supportedExtensions = new[] { ".jpg", ".jpeg", ".png", ".gif", ".bmp", ".tiff", ".svg" };
var imageFiles = Directory.GetFiles(imageFolder)
.Where(f => supportedExtensions.Contains(Path.GetExtension(f).ToLower()))
.OrderBy(f => f);
// Convert images to PDF with options
var pdf = ImageToPdfConverter.ImageToPdf(imageFiles, ImageBehavior.FitToPage);
// Add metadata
pdf.MetaData.Title = "Photo Album";
pdf.MetaData.Author = "Photography Department";
pdf.MetaData.CreationDate = DateTime.Now;
// Apply compression for smaller file size
pdf.CompressImages(80); // 80% quality
// Save the PDF
pdf.SaveAs(outputPath);
}
public static void CreateThumbnailCatalog(List<ProductImage> images)
{
var renderer = new ChromePdfRenderer();
// Build HTML with image grid
var html = @"
<html>
<head>
<style>
.image-grid {
display: grid;
grid-template-columns: repeat(3, 1fr);
gap: 20px;
padding: 20px;
}
.image-item {
text-align: center;
}
.image-item img {
max-width: 100%;
height: 200px;
object-fit: cover;
border: 1px solid #ddd;
}
.image-caption {
margin-top: 10px;
font-size: 12px;
}
</style>
</head>
<body>
<h1>Product Catalog</h1>
<div class='image-grid'>";
foreach (var image in images)
{
html += $@"
<div class='image-item'>
<img src='data:image/jpeg;base64,{image.Base64Data}' />
<div class='image-caption'>{image.ProductName}</div>
</div>";
}
html += "</div></body></html>";
// Render with optimal settings for images
renderer.RenderingOptions.CssMediaType = PdfCssMediaType.Print;
var pdf = renderer.RenderHtmlAsPdf(html);
pdf.SaveAs("product-catalog.pdf");
}
}
Imports IronPdf
Imports System.IO
Imports System.Linq
Public Class ImagePdfGenerator
Public Shared Sub CreatePhotoAlbum(ByVal imageFolder As String, ByVal outputPath As String)
' Get all supported image files
Dim supportedExtensions = { ".jpg", ".jpeg", ".png", ".gif", ".bmp", ".tiff", ".svg" }
Dim imageFiles = Directory.GetFiles(imageFolder).Where(Function(f) supportedExtensions.Contains(Path.GetExtension(f).ToLower())).OrderBy(Function(f) f)
' Convert images to PDF with options
Dim pdf = ImageToPdfConverter.ImageToPdf(imageFiles, ImageBehavior.FitToPage)
' Add metadata
pdf.MetaData.Title = "Photo Album"
pdf.MetaData.Author = "Photography Department"
pdf.MetaData.CreationDate = DateTime.Now
' Apply compression for smaller file size
pdf.CompressImages(80) ' 80% quality
' Save the PDF
pdf.SaveAs(outputPath)
End Sub
Public Shared Sub CreateThumbnailCatalog(ByVal images As List(Of ProductImage))
Dim renderer = New ChromePdfRenderer()
' Build HTML with image grid
Dim html = "
<html>
<head>
<style>
.image-grid {
display: grid;
grid-template-columns: repeat(3, 1fr);
gap: 20px;
padding: 20px;
}
.image-item {
text-align: center;
}
.image-item img {
max-width: 100%;
height: 200px;
object-fit: cover;
border: 1px solid #ddd;
}
.image-caption {
margin-top: 10px;
font-size: 12px;
}
</style>
</head>
<body>
<h1>Product Catalog</h1>
<div class='image-grid'>"
For Each image In images
html &= $"
<div class='image-item'>
<img src='data:image/jpeg;base64,{image.Base64Data}' />
<div class='image-caption'>{image.ProductName}</div>
</div>"
Next image
html &= "</div></body></html>"
' Render with optimal settings for images
renderer.RenderingOptions.CssMediaType = PdfCssMediaType.Print
Dim pdf = renderer.RenderHtmlAsPdf(html)
pdf.SaveAs("product-catalog.pdf")
End Sub
End Class
Zaawansowane funkcje obsługi obrazów:
- Konwersja SVG do PDF z zachowaniem jakości wektorowej
- Przetwarzanie wsadowe z optymalizacją pamięci
- Opcje dostosowywania rozmiaru i położenia
- Zachowanie danych EXIF
Obraz do PDF za pomocą PDFTron (Apryse)
PDFTron wykorzystuje swoje API konwersji do obsługi obrazów:
using pdftron;
using pdftron.PDF;
using pdftron.SDF;
public class PdfTronImageConverter
{
public static void ConvertImageToPdf(string imagePath, string outputPath)
{
PDFNet.Initialize("your-license-key");
using (PDFDoc doc = new PDFDoc())
{
// Use Convert API for image to PDF
pdftron.PDF.Convert.ToPdf(doc, imagePath);
// Additional image processing
PageIterator itr = doc.GetPageIterator();
while (itr.HasNext())
{
Page page = itr.Current();
// Adjust page size to image
Rect crop_box = page.GetCropBox();
page.SetMediaBox(crop_box);
itr.Next();
}
// Save optimized PDF
doc.Save(outputPath, SDFDoc.SaveOptions.e_linearized);
}
}
public static void CreateMultiPageImagePdf(string[] imagePaths, string outputPath)
{
PDFNet.Initialize("your-license-key");
using (PDFDoc doc = new PDFDoc())
{
ElementBuilder builder = new ElementBuilder();
ElementWriter writer = new ElementWriter();
foreach (string imagePath in imagePaths)
{
// Create a new page for each image
Page page = doc.PageCreate();
writer.Begin(page);
// Add image to page
Image img = Image.Create(doc, imagePath);
Element element = builder.CreateImage(img, 0, 0, 612, 792);
writer.WritePlacedElement(element);
writer.End();
doc.PagePushBack(page);
}
doc.Save(outputPath, SDFDoc.SaveOptions.e_linearized);
}
}
}
using pdftron;
using pdftron.PDF;
using pdftron.SDF;
public class PdfTronImageConverter
{
public static void ConvertImageToPdf(string imagePath, string outputPath)
{
PDFNet.Initialize("your-license-key");
using (PDFDoc doc = new PDFDoc())
{
// Use Convert API for image to PDF
pdftron.PDF.Convert.ToPdf(doc, imagePath);
// Additional image processing
PageIterator itr = doc.GetPageIterator();
while (itr.HasNext())
{
Page page = itr.Current();
// Adjust page size to image
Rect crop_box = page.GetCropBox();
page.SetMediaBox(crop_box);
itr.Next();
}
// Save optimized PDF
doc.Save(outputPath, SDFDoc.SaveOptions.e_linearized);
}
}
public static void CreateMultiPageImagePdf(string[] imagePaths, string outputPath)
{
PDFNet.Initialize("your-license-key");
using (PDFDoc doc = new PDFDoc())
{
ElementBuilder builder = new ElementBuilder();
ElementWriter writer = new ElementWriter();
foreach (string imagePath in imagePaths)
{
// Create a new page for each image
Page page = doc.PageCreate();
writer.Begin(page);
// Add image to page
Image img = Image.Create(doc, imagePath);
Element element = builder.CreateImage(img, 0, 0, 612, 792);
writer.WritePlacedElement(element);
writer.End();
doc.PagePushBack(page);
}
doc.Save(outputPath, SDFDoc.SaveOptions.e_linearized);
}
}
}
Imports pdftron
Imports pdftron.PDF
Imports pdftron.SDF
Public Class PdfTronImageConverter
Public Shared Sub ConvertImageToPdf(ByVal imagePath As String, ByVal outputPath As String)
PDFNet.Initialize("your-license-key")
Using doc As New PDFDoc()
' Use Convert API for image to PDF
pdftron.PDF.Convert.ToPdf(doc, imagePath)
' Additional image processing
Dim itr As PageIterator = doc.GetPageIterator()
Do While itr.HasNext()
Dim page As Page = itr.Current()
' Adjust page size to image
Dim crop_box As Rect = page.GetCropBox()
page.SetMediaBox(crop_box)
itr.Next()
Loop
' Save optimized PDF
doc.Save(outputPath, SDFDoc.SaveOptions.e_linearized)
End Using
End Sub
Public Shared Sub CreateMultiPageImagePdf(ByVal imagePaths() As String, ByVal outputPath As String)
PDFNet.Initialize("your-license-key")
Using doc As New PDFDoc()
Dim builder As New ElementBuilder()
Dim writer As New ElementWriter()
For Each imagePath As String In imagePaths
' Create a new page for each image
Dim page As Page = doc.PageCreate()
writer.Begin(page)
' Add image to page
Dim img As Image = Image.Create(doc, imagePath)
Dim element As Element = builder.CreateImage(img, 0, 0, 612, 792)
writer.WritePlacedElement(element)
writer.End()
doc.PagePushBack(page)
Next imagePath
doc.Save(outputPath, SDFDoc.SaveOptions.e_linearized)
End Using
End Sub
End Class
Jakie są opcje licencyjne i koszty?
Zrozumienie zasad licencjonowania ma kluczowe znaczenie dla planowania budżetu i zapewnienia zgodności z przepisami. Te dwie biblioteki mają zupełnie różne modele cenowe.
Licencjonowanie IronPDF
IronPDF oferuje 3 edycje cenowe, od $999 do $2,999. Dostępna jest również bezpłatna wersja próbna IronPDF. IronPDF oferuje przejrzyste, opublikowane cenniki (stan na kwiecień 2026):
Poziomy licencji:
-
Lite License: $999
- 1 programista
- 1 lokalizacja
- 1 projekt
- Idealne rozwiązanie dla indywidualnych programistów lub małych projektów
-
Plus License: $1,499
- 3 programistów
- 3 lokalizacje
- 3 projekty
- Idealne rozwiązanie dla małych zespołów
- Professional License: $2,999
- 10 programistów
- 10 lokalizacji
- 10 projektów
-
Odpowiednia dla większych zespołów
- Unlimited License: $5,999
- Nieograniczona liczba programistów
- Nieograniczona liczba lokalizacji
- Nieograniczona liczba projektów
Dodatkowe opcje:
- Redystrybucja bez opłat licencyjnych: +$2,999 (jednorazowo)
- Dostępne licencje SaaS/Licencjonowanie OEM
- Pakiet Iron Suite: 10 produktów w cenie 2
All Team Licenses are non-transferable, and sharing of licenses outside an organization or agency/client relationship is prohibited.
Licencjonowanie PDFTron (Apryse)
Licencjonowanie Apryse (dawniej PDFTron) opiera się na wycenie na zamówienie, bez opublikowanych cen. Skontaktuj się bezpośrednio z działem sprzedaży Apryse, aby uzyskać wycenę na apryse.com/pricing.
Kluczowe cechy licencyjne:
- Wszystkie ceny wymagają bezpośredniego zaangażowania działu sprzedaży — brak samodzielnych zakupów
- Dodatkowe moduły (np. HTML2PDF, konwersja biurowa) mogą wymagać osobnego licencjonowania
- Złożone negocjacje licencyjne są zazwyczaj wymagane przy wdrożeniach korporacyjnych
- Ceny za moduł mogą zwiększać całkowity koszt posiadania
Kluczowe różnice:
- IronPDF: Licencje wieczyste, płatność jednorazowa
- PDFTron: Często oparty na subskrypcji lub opłatach rocznych
- IronPDF: Wszystkie funkcje zawarte w licencji podstawowej
- PDFTron: Podstawowe funkcje z płatnymi dodatkami
Jak wypadają opcje wsparcia w porównaniu?
Wsparcie dla programistów może zadecydować o sukcesie lub porażce projektu. Oto, jak poszczególni dostawcy podchodzą do kwestii pomocy dla klientów.
Wsparcie techniczne IronPDF
IronPDF zapewnia profesjonalne wsparcie techniczne dla wszystkich licencji:
- Wsparcie techniczne przez e-mail 24 godziny na dobę, 5 dni w tygodniu
- Bezpośredni dostęp do zespołu deweloperskiego
- Typowy czas realizacji: 24–48 godzin
- Kompleksowa dokumentacja
- Samouczki wideo i przykłady kodu
Biblioteka IronPDF działa w Azure WebApps, Functions i WebJobs. Działa zarówno w wersjach Linux, jak i Windows, chociaż zalecam wersje Functions i WebApps dla Windows jako znacznie lepiej przetestowane i łatwiejsze do zainstalowania.
Wsparcie dla PDFTron (Apryse)
Wsparcie PDFTron różni się w zależności od poziomu licencji:
- Koszt PDFTron jest wysoki. Znaczenie dla naszego biznesu uzasadnia koszt, ale zdecydowanie było to przeszkodą przy porównywaniu tego produktu z innymi rozwiązaniami PDF dla sieci.
- Wsparcie oparte na forach dla podstawowych licencji
- Dostępne płatne plany wsparcia
- Czasami wsparcie może być niewystarczające i deweloperzy muszą sobie radzić sami.
- Czas odpowiedzi różni się w zależności od poziomu wsparcia
Jakie są cechy wydajności?
Wydajność wpływa na doświadczenie użytkownika i koszty serwera. Przeanalizujmy dane dotyczące wydajności w rzeczywistych środowiskach.
Wydajność IronPDF
Najnowsze udoskonalenia znacznie poprawiły wydajność IronPDF:
// Optimized batch processing example
public async Task BatchConvertWithPerformanceMonitoring()
{
var renderer = new ChromePdfRenderer();
// Configure for performance
renderer.RenderingOptions.CssMediaType = PdfCssMediaType.Screen;
renderer.RenderingOptions.RenderDelay = 0; // No delay for static content
renderer.RenderingOptions.Timeout = 30; // 30 second timeout
// Enable parallel processing
var tasks = new List<Task<PdfDocument>>();
var urls = GetUrlsToConvert();
// Process in parallel with throttling
using (var semaphore = new SemaphoreSlim(4)) // Max 4 concurrent
{
foreach (var url in urls)
{
await semaphore.WaitAsync();
tasks.Add(Task.Run(async () =>
{
try
{
return await renderer.RenderUrlAsPdfAsync(url);
}
finally
{
semaphore.Release();
}
}));
}
var results = await Task.WhenAll(tasks);
// Merge results if needed
var merged = PdfDocument.Merge(results);
merged.SaveAs("batch-output.pdf");
}
}
// Optimized batch processing example
public async Task BatchConvertWithPerformanceMonitoring()
{
var renderer = new ChromePdfRenderer();
// Configure for performance
renderer.RenderingOptions.CssMediaType = PdfCssMediaType.Screen;
renderer.RenderingOptions.RenderDelay = 0; // No delay for static content
renderer.RenderingOptions.Timeout = 30; // 30 second timeout
// Enable parallel processing
var tasks = new List<Task<PdfDocument>>();
var urls = GetUrlsToConvert();
// Process in parallel with throttling
using (var semaphore = new SemaphoreSlim(4)) // Max 4 concurrent
{
foreach (var url in urls)
{
await semaphore.WaitAsync();
tasks.Add(Task.Run(async () =>
{
try
{
return await renderer.RenderUrlAsPdfAsync(url);
}
finally
{
semaphore.Release();
}
}));
}
var results = await Task.WhenAll(tasks);
// Merge results if needed
var merged = PdfDocument.Merge(results);
merged.SaveAs("batch-output.pdf");
}
}
' Optimized batch processing example
Public Async Function BatchConvertWithPerformanceMonitoring() As Task
Dim renderer = New ChromePdfRenderer()
' Configure for performance
renderer.RenderingOptions.CssMediaType = PdfCssMediaType.Screen
renderer.RenderingOptions.RenderDelay = 0 ' No delay for static content
renderer.RenderingOptions.Timeout = 30 ' 30 second timeout
' Enable parallel processing
Dim tasks = New List(Of Task(Of PdfDocument))()
Dim urls = GetUrlsToConvert()
' Process in parallel with throttling
Using semaphore = New SemaphoreSlim(4) ' Max 4 concurrent
For Each url In urls
Await semaphore.WaitAsync()
tasks.Add(Task.Run(Async Function()
Try
Return Await renderer.RenderUrlAsPdfAsync(url)
Finally
semaphore.Release()
End Try
End Function))
Next url
Dim results = Await Task.WhenAll(tasks)
' Merge results if needed
Dim merged = PdfDocument.Merge(results)
merged.SaveAs("batch-output.pdf")
End Using
End Function
Cechy wydajności:
- Proste HTML renderuje się szybciej niż złożone strony z wieloma zasobami zewnętrznymi
- Złożony HTML z CSS/JS wymaga więcej czasu z powodu pełnego renderowania w Chrome
- IronPDF ma asynchroniczne warianty metod renderowania, jak opisano tutaj ironpdf.com/examples/async. Użycie
Parallel.ForEachbyło najwydajniejszą strategią do wsadowego renderowania HTML do PDF dla mojego przypadku użycia
Wydajność PDFTron (Apryse)
Silnik dostosowany Apryse ma zazwyczaj niższe przeciążenia dla prostych konwersji dokumentów:
- Szybciej dla podstawowego HTML z ograniczonym CSS (brak pełnego renderowania przeglądarki wymaganego)
- Efektywny dla konwersji dokumentów biurowych
- Mniejsze zużycie pamięci w porównaniu do renderowania opartego na Chrome
- Dobrze nadaje się do dużych wolumenów prostych przepływów pracy z dokumentami
Jednak użytkownicy zgłaszają problemy z złożonymi scenariuszami:
- Błędy pojawiają się od czasu do czasu. Czasami są one na tyle szkodliwe, że powinny być zauważone w testach QA. Może zająć trochę czasu, zanim zostaną one naprawione.
Wsparcie dla nowoczesnego CSS i Bootstrap
W miarę jak aplikacje korporacyjne coraz częściej przyjmują nowoczesne frameworki CSS, takie jak Bootstrap, Tailwind i Foundation, zdolność do dokładnego konwertowania tych frameworków na PDF staje się krytycznym kryterium wyboru dla bibliotek PDF.
IronPDF: Pełne wsparcie dla frameworków opartych na Chromium
Silnik renderujący Chrome V8 IronPDF zapewnia kompleksowe wsparcie dla wszystkich nowoczesnych frameworków CSS i standardów webowych:
- Bootstrap 5: Pełne wsparcie dla flexbox i CSS Grid z wszystkimi narzędziami do responsywności
- Bootstrap 4: Pełna kompatybilność z komponentami kart, systemami nawigacji i układami formularzy
- Tailwind CSS: Wszystkie klasy użytkowe, modyfikatory responsywne i wzorce kompilacji JIT
- Foundation: Kompletny system siatki i wsparcie dla biblioteki komponentów
- Nowoczesny CSS3: Flexbox, CSS Grid, zmienne CSS, animacje, przekształcenia i przejścia
- Frameworki JavaScript: Renderowanie komponentów React, Vue, Angular z pełnym wsparciem dla interaktywności
Walidacja produkcji: Strona główna Bootstrap i oficjalne szablony przekształcają się z wiernością przeglądarki na poziomie 98%+.
Przykład kodu: Pulpit korporacyjny z tabelami danych
using IronPdf;
var renderer = new ChromePdfRenderer();
string bootstrapDashboard = @"
<!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-fluid py-4'>
<div class='d-flex justify-content-between align-items-center mb-4'>
<h1>Sales Dashboard - Q1 2025</h1>
<span class='badge bg-success fs-5'>+15.3% YoY</span>
</div>
<div class='row g-4 mb-4'>
<div class='col-md-3'>
<div class='card text-center'>
<div class='card-body'>
<h6 class='text-muted'>Total Revenue</h6>
<h2 class='text-primary'>$1.2M</h2>
<small class='text-success'>↑ 12%</small>
</div>
</div>
</div>
<div class='col-md-3'>
<div class='card text-center'>
<div class='card-body'>
<h6 class='text-muted'>New Customers</h6>
<h2 class='text-info'>1,847</h2>
<small class='text-success'>↑ 8%</small>
</div>
</div>
</div>
<div class='col-md-3'>
<div class='card text-center'>
<div class='card-body'>
<h6 class='text-muted'>Avg Order Value</h6>
<h2 class='text-warning'>$649</h2>
<small class='text-danger'>↓ 3%</small>
</div>
</div>
</div>
<div class='col-md-3'>
<div class='card text-center'>
<div class='card-body'>
<h6 class='text-muted'>Conversion Rate</h6>
<h2 class='text-success'>3.2%</h2>
<small class='text-success'>↑ 0.4%</small>
</div>
</div>
</div>
</div>
<div class='card'>
<div class='card-header bg-primary text-white'>
<h5 class='mb-0'>Top Products by Revenue</h5>
</div>
<div class='card-body p-0'>
<table class='table table-striped table-hover mb-0'>
<thead class='table-light'>
<tr>
<th>Product</th>
<th>Category</th>
<th>Units Sold</th>
<th class='text-end'>Revenue</th>
<th class='text-end'>Growth</th>
</tr>
</thead>
<tbody>
<tr>
<td><strong>Professional License</strong></td>
<td><span class='badge bg-primary'>Software</span></td>
<td>1,234</td>
<td class='text-end'>$369,000</td>
<td class='text-end'><span class='badge bg-success'>+18%</span></td>
</tr>
<tr>
<td><strong>Plus License</strong></td>
<td><span class='badge bg-primary'>Software</span></td>
<td>2,891</td>
<td class='text-end'>$289,000</td>
<td class='text-end'><span class='badge bg-success'>+15%</span></td>
</tr>
<tr>
<td><strong>Support Package</strong></td>
<td><span class='badge bg-info'>Services</span></td>
<td>892</td>
<td class='text-end'>$178,000</td>
<td class='text-end'><span class='badge bg-success'>+22%</span></td>
</tr>
<tr>
<td><strong>Training Program</strong></td>
<td><span class='badge bg-info'>Services</span></td>
<td>456</td>
<td class='text-end'>$91,000</td>
<td class='text-end'><span class='badge bg-warning'>+5%</span></td>
</tr>
</tbody>
</table>
</div>
</div>
</div>
</body>
</html>";
var pdf = renderer.RenderHtmlAsPdf(bootstrapDashboard);
pdf.SaveAs("sales-dashboard.pdf");
using IronPdf;
var renderer = new ChromePdfRenderer();
string bootstrapDashboard = @"
<!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-fluid py-4'>
<div class='d-flex justify-content-between align-items-center mb-4'>
<h1>Sales Dashboard - Q1 2025</h1>
<span class='badge bg-success fs-5'>+15.3% YoY</span>
</div>
<div class='row g-4 mb-4'>
<div class='col-md-3'>
<div class='card text-center'>
<div class='card-body'>
<h6 class='text-muted'>Total Revenue</h6>
<h2 class='text-primary'>$1.2M</h2>
<small class='text-success'>↑ 12%</small>
</div>
</div>
</div>
<div class='col-md-3'>
<div class='card text-center'>
<div class='card-body'>
<h6 class='text-muted'>New Customers</h6>
<h2 class='text-info'>1,847</h2>
<small class='text-success'>↑ 8%</small>
</div>
</div>
</div>
<div class='col-md-3'>
<div class='card text-center'>
<div class='card-body'>
<h6 class='text-muted'>Avg Order Value</h6>
<h2 class='text-warning'>$649</h2>
<small class='text-danger'>↓ 3%</small>
</div>
</div>
</div>
<div class='col-md-3'>
<div class='card text-center'>
<div class='card-body'>
<h6 class='text-muted'>Conversion Rate</h6>
<h2 class='text-success'>3.2%</h2>
<small class='text-success'>↑ 0.4%</small>
</div>
</div>
</div>
</div>
<div class='card'>
<div class='card-header bg-primary text-white'>
<h5 class='mb-0'>Top Products by Revenue</h5>
</div>
<div class='card-body p-0'>
<table class='table table-striped table-hover mb-0'>
<thead class='table-light'>
<tr>
<th>Product</th>
<th>Category</th>
<th>Units Sold</th>
<th class='text-end'>Revenue</th>
<th class='text-end'>Growth</th>
</tr>
</thead>
<tbody>
<tr>
<td><strong>Professional License</strong></td>
<td><span class='badge bg-primary'>Software</span></td>
<td>1,234</td>
<td class='text-end'>$369,000</td>
<td class='text-end'><span class='badge bg-success'>+18%</span></td>
</tr>
<tr>
<td><strong>Plus License</strong></td>
<td><span class='badge bg-primary'>Software</span></td>
<td>2,891</td>
<td class='text-end'>$289,000</td>
<td class='text-end'><span class='badge bg-success'>+15%</span></td>
</tr>
<tr>
<td><strong>Support Package</strong></td>
<td><span class='badge bg-info'>Services</span></td>
<td>892</td>
<td class='text-end'>$178,000</td>
<td class='text-end'><span class='badge bg-success'>+22%</span></td>
</tr>
<tr>
<td><strong>Training Program</strong></td>
<td><span class='badge bg-info'>Services</span></td>
<td>456</td>
<td class='text-end'>$91,000</td>
<td class='text-end'><span class='badge bg-warning'>+5%</span></td>
</tr>
</tbody>
</table>
</div>
</div>
</div>
</body>
</html>";
var pdf = renderer.RenderHtmlAsPdf(bootstrapDashboard);
pdf.SaveAs("sales-dashboard.pdf");
Imports IronPdf
Dim renderer As New ChromePdfRenderer()
Dim bootstrapDashboard 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-fluid py-4'>
<div class='d-flex justify-content-between align-items-center mb-4'>
<h1>Sales Dashboard - Q1 2025</h1>
<span class='badge bg-success fs-5'>+15.3% YoY</span>
</div>
<div class='row g-4 mb-4'>
<div class='col-md-3'>
<div class='card text-center'>
<div class='card-body'>
<h6 class='text-muted'>Total Revenue</h6>
<h2 class='text-primary'>$1.2M</h2>
<small class='text-success'>↑ 12%</small>
</div>
</div>
</div>
<div class='col-md-3'>
<div class='card text-center'>
<div class='card-body'>
<h6 class='text-muted'>New Customers</h6>
<h2 class='text-info'>1,847</h2>
<small class='text-success'>↑ 8%</small>
</div>
</div>
</div>
<div class='col-md-3'>
<div class='card text-center'>
<div class='card-body'>
<h6 class='text-muted'>Avg Order Value</h6>
<h2 class='text-warning'>$649</h2>
<small class='text-danger'>↓ 3%</small>
</div>
</div>
</div>
<div class='col-md-3'>
<div class='card text-center'>
<div class='card-body'>
<h6 class='text-muted'>Conversion Rate</h6>
<h2 class='text-success'>3.2%</h2>
<small class='text-success'>↑ 0.4%</small>
</div>
</div>
</div>
</div>
<div class='card'>
<div class='card-header bg-primary text-white'>
<h5 class='mb-0'>Top Products by Revenue</h5>
</div>
<div class='card-body p-0'>
<table class='table table-striped table-hover mb-0'>
<thead class='table-light'>
<tr>
<th>Product</th>
<th>Category</th>
<th>Units Sold</th>
<th class='text-end'>Revenue</th>
<th class='text-end'>Growth</th>
</tr>
</thead>
<tbody>
<tr>
<td><strong>Professional License</strong></td>
<td><span class='badge bg-primary'>Software</span></td>
<td>1,234</td>
<td class='text-end'>$369,000</td>
<td class='text-end'><span class='badge bg-success'>+18%</span></td>
</tr>
<tr>
<td><strong>Plus License</strong></td>
<td><span class='badge bg-primary'>Software</span></td>
<td>2,891</td>
<td class='text-end'>$289,000</td>
<td class='text-end'><span class='badge bg-success'>+15%</span></td>
</tr>
<tr>
<td><strong>Support Package</strong></td>
<td><span class='badge bg-info'>Services</span></td>
<td>892</td>
<td class='text-end'>$178,000</td>
<td class='text-end'><span class='badge bg-success'>+22%</span></td>
</tr>
<tr>
<td><strong>Training Program</strong></td>
<td><span class='badge bg-info'>Services</span></td>
<td>456</td>
<td class='text-end'>$91,000</td>
<td class='text-end'><span class='badge bg-warning'>+5%</span></td>
</tr>
</tbody>
</table>
</div>
</div>
</div>
</body>
</html>"
Dim pdf = renderer.RenderHtmlAsPdf(bootstrapDashboard)
pdf.SaveAs("sales-dashboard.pdf")
Wynik: Profesjonalny pulpit korporacyjny z kartami metrycznymi flexbox Bootstrap, responsywny układ siatki i stylizowane tabele danych — wszystko renderowane z perfekcyjną wiernością w PDF.
PDFTron (Apryse): Modul HTML2PDF z ograniczeniami frameworkowymi
Konwersja HTML na PDF w PDFTron jest realizowana przez moduł HTML2PDF, który wykorzystuje dostosowany silnik renderujący z określonymi ograniczeniami dla nowoczesnych frameworków CSS:
- Dostosowany Silnik: Nie oparty na Chromium, co oznacza, że wsparcie CSS3 jest selektywne, a nie kompleksowe
- Wsparcie dla Flexbox: Częściowa implementacja, układy flexbox Bootstrap 4/5 mogą nie renderować się poprawnie
- CSS Grid: Ograniczone wsparcie dla specyfikacji układu CSS Grid
- Ograniczenia JavaScript: Ograniczone wykonanie JavaScript w porównaniu do pełnych silników przeglądarek
- Bootstrap 3: Generalnie działa lepiej niż Bootstrap 4/5 z powodu układów opartych na tabelach
- Wymagane testy frameworka: Złożone komponenty Bootstrap wymagają rozległych testów i potencjalnych obejść
Według raportów deweloperów, użytkownicy PDFTron pracujący z Bootstrap napotykają:
- Paski nawigacyjne opartena flexboxie renderujące się z problemami z wyrównaniem
- Talii kart i systemy siatki wymagające dostosowań CSS
- Narzędzia responsywne nie są honorowane w wyjściu PDF
- Konieczność upraszczania komponentów Bootstrap lub użycia CSS traktowanego jako zastępczy
Rozważania korporacyjne: Dla aplikacji zbudowanych na nowoczesnych wersjach Bootstrap (4+), PDFTron może wymagać znaczącego dodatkowego wysiłku deweloperskiego, by obsłużyć konwersje układów, co potencjalnie rekompensuje jego inne zalety wydajności. Podejście z dostosowanym silnikiem oznacza, że nie uzyskujesz tej samej wierności renderowania co w rzeczywistej przeglądarce.
Dla kompleksowego wsparcia frameworka Bootstrap i wskazówek dotyczących testowania, zobacz Przewodnik po Bootstrap & Flexbox CSS.
Kiedy wybrać każdą z bibliotek?
Podjęcie właściwej decyzji zależy od Twoich specyficznych wymagań i ograniczeń.
Kiedy wybrać IronPDF:
Wierność HTML/CSS jest kluczowa
- Nowoczesne aplikacje webowe o złożonych układach
- Zawartość ciężka w JavaScript
- Projekty responsywne, które wymagają zachowania
Priorytetem jest szybki rozwój
- Prosty interfejs API skraca czas tworzenia
- Rozbudowane przykłady kodu
- Minimalna krzywa uczenia się
Przejrzystość budżetu ma znaczenie
- Publikowane ceny umożliwiają precyzyjne budżetowanie
- Brak niespodziewanych kosztów i ukrytych opłat
- Zawiera wszystkie funkcje w podstawowej licencji
Potrzebujesz specyficznych funkcji
Wybierz PDFTron (Apryse), gdy:
Przepływy dokumentów korporacyjnych
- Zaawansowane przetwarzanie formularzy z obsługą XFA
- Konwersje plików CAD (DWG, DXF)
- Zaawansowana obsługa dokumentów biurowych
Wydajność ponad funkcje
- Wysokowolumenowe przetwarzanie prostych dokumentów
- Niższe wymagania pamięciowe
- Podstawowe potrzeby w zakresie konwersji HTML
Specjalistyczne wymagania
- Wbudowane komponenty przeglądarki dokumentów
- Rozległe typy adnotacji (30+)
- Integracja starszych systemów
Duże środowisko korporacyjne
- Dedykowane umowy wsparcia
- Dostosowane rozwijanie funkcji
- Certyfikacje zgodności
Podsumowanie i wniosek
Zarówno IronPDF, jak i PDFTron (Apryse) to zdolne biblioteki PDF, ale obsługują różne segmenty rynku i przypadki użycia.
IronPDF wyróżnia się w:
- Wsparcie dla nowoczesnych technologii webowych (HTML5, CSS3, JavaScript)
- Przyjazny dla programistów design API
- Przejrzystość i przystępność cen
- Szybki rozwój aplikacji
- Wdrożenia w chmurze i w kontenerach
Atuty PDFTron (Apryse) obejmują:
- Przepływy pracy z dokumentami w Enterprise
- Obsługa CAD i formatów specjalistycznych
- Mniejsze zużycie zasobów
- Rozbudowane możliwości dodawania adnotacji
- Kompatybilność z systemami starszego typu
Dla większości deweloperów .NET budujących nowoczesne aplikacje, IronPDF oferuje silną kombinację funkcji, łatwości użycia i przejrzystości cenowej. Jego silnik renderujący oparty na Chrome zapewnia wysoką wierność konwersji HTML na PDF, a prosty API przyspiesza rozwój.
PDFTron pozostaje opcją dla Enterprise mających specyficzne wymagania dotyczące konwersji CAD, przetwarzania złożonych formularzy lub pracy ze starszymi formatami dokumentów. Jednak brak przejrzystości cenowej i modułowa struktura licencji mogą znacznie zwiększyć całkowite koszty.
Pierwsze kroki
Wypróbuj IronPDF:
Poznaj PDFTron:
Pamiętaj, aby przed podjęciem decyzji dokładnie przeanalizować obie opcje w kontekście konkretnych przypadków użycia. Oprócz możliwości technicznych należy wziąć pod uwagę takie czynniki, jak koszty długoterminowe, jakość wsparcia technicznego oraz plany rozwoju funkcji.
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.
Jak wyglądaja roznice w wydajności miedzy IronPDF a PDFTron w konwersji HTML do PDF?
IronPDF zapewnia lepsze renderowanie dla zlozonych treści internetowych dzięki silnikowi opartemu na Chrome, oferujac lepsze wsparcie dla JavaScript i CSS3. PDFTron, choc jest szybszy dla prostego HTML, może nie radzic sobie tak skutecznie z zlozonymi treściąmi.
Jakie sa opcje licencjonowania dla IronPDF i PDFTron?
IronPDF oferuje przejrzyste i wieczyste licencje z wszystkimi funkcjami zaczynajacymi sie od $749. PDFTron zas wymaga przygotowania indywidualnych wycen licencji, ktore mogą wynosic od $5,000 do ponad $100,000 rocznie.
Czy możliwe jest konwertowanie stron ASPX na PDF za pomoca tych bibliotek?
Tak, IronPDF może konwertować strony ASPX na PDF za pomoca metody AspxToPdf.RenderThisPageAsPdf w jednej linii kodu. PDFTron nie obsługuje bezpośrednio konwersji stron ASPX.
Ktora biblioteka jest bardziej odpowiednia dla srodowisk chmurowych, takich jak Azure?
IronPDF jest zoptymalizowany dla srodowisk chmurowych, włącznie z Azure i AWS, i działa sprawnie z właściwościami Functions oraz WebApps. PDFTron może wymagac dodatkowej konfiguracji dla uzyskania optymalnego wdrożenia w chmurze.
Czy można tworzyć formularze PDF do wypelnienia przy pomocy IronPDF lub PDFTron?
Tak, obie biblioteki obsluguja tworzenie formularzy PDF do wypelnienia. IronPDF używa CreatePdfFormsFromHtml do automatycznej konwersji formularzy HTML. PDFTron oferuje szeroki zakres typow pol formularzy, ale wymaga bardziej zlozonej integracji.
Jakie opcje wsparcia sa dostępne dla użytkowników IronPDF oraz PDFTron?
IronPDF oferuje wsparcie inżynierskie 24/5 z bezpośrednim dostepem do deweloperow i typowym czasem odpowiedzi wynoszacym 24-48 godzin. Opcje wsparcia PDFTron różnią sie w zależności od poziomu licencji, od podstawowego wsparcia na forum do platnej bezpośredniej pomocy.
Jak IronPDF i PDFTron radza sobie z obsługa stron internetowych chronionych haslem?
IronPDF wspiera uwierzytelnianie przez ChromeHttpLoginCredentials do obsługi formularzy logowania i uwierzytelniania HTTP, podczas gdy PDFTron ma ograniczone wsparcie dla tej funkcjonalności.



