Przejdź do treści stopki
PORóWNANIA PRODUKTóW

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:

  1. Otwórz program Visual Studio 2022 lub nowszą wersję
  2. Kliknij "Utwórz nowy projekt"
  3. Wybierz "Aplikacja internetowa ASP.NET Core" (zalecane .NET Core 6.0 lub nowsze)
  4. Wybierz nazwę projektu i lokalizację
  5. Wybierz "Aplikacja internetowa (Model-View-Controller)" lub "Web API" w zależności od potrzeb
  6. Upewnij się, że wybrano wersję ".NET 8.0" lub nowszą, aby zapewnić optymalną kompatybilność

Dialog nowego projektu w Visual Studio pokazujący wybór ASP.NET Core Web App 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 w kreatorze tworzenia projektów Visual Studio 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:

  1. Kliknij prawym przyciskiem myszy swój projekt w Eksploratorze rozwiązań
  2. Wybierz "Zarządzaj pakietami NuGet"
  3. Kliknij "Przeglądarki" i wyszukaj "IronPDF"
  4. Kliknij "Zainstaluj" w pakiecie IronPDF

Menu kontekstowe Solution Explorer pokazujące opcję Zarządzaj pakietami NuGet Dostęp do menedżera pakietów NuGet za pośrednictwem Eksploratora rozwiązań programu Visual Studio w celu instalacji IronPDF

Menu projektu w Visual Studio pokazujące opcje zarządzania pakietami Alternatywny dostęp do menedżera pakietów NuGet poprzez menu Projekt w programie Visual Studio

Interfejs Menedżera pakietów NuGet pokazujący instalację IronPDF 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
SHELL

Metoda 3: Instalacja poprzez bezpośrednie pobranie

W środowiskach bez dostępu do NuGet:

  1. Pobierz z oficjalnej strony IronPDF
  2. Rozpakuj plik ZIP do katalogu projektu
  3. W programie Visual Studio kliknij prawym przyciskiem myszy "Odwołania" → "Dodaj odwołanie"
  4. 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
SHELL

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

  1. Wyodrębnij SDK

    # Example extraction path
    PDFNET_BASE = C:/PDFTron/PDFNetDotNet4/
    # Example extraction path
    PDFNET_BASE = C:/PDFTron/PDFNetDotNet4/
    SHELL
  2. 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
  3. Skopiuj wymagane biblioteki

    • Skopiuj folder Lib z PDFNET_BASE do katalogu projektu
    • Dodaj odniesienia do obu PDFNetLoader.dll i platformowo-specyficznych PDFNet.dll
  4. Skonfiguruj właściwość Copy Local

Właściwość PDFTron Copy Local ustawiona na False w Visual Studio Ustawienie właściwości Copy Local biblioteki PDFNet.dll na False w celu prawidłowego wdrożenia PDFTron

  1. Zaktualizuj plik App.config

    <configuration>
       <runtime>
           <loadFromRemoteSources enabled="true" />
       </runtime>
    </configuration>
    <configuration>
       <runtime>
           <loadFromRemoteSources enabled="true" />
       </runtime>
    </configuration>
    XML
  2. Konfiguracja zdarzeń po kompilacji

    xcopy $(ProjectDir)Lib\PDFNet $(TargetDir)PDFNet /S /I /Y
    xcopy $(ProjectDir)Lib\PDFNet $(TargetDir)PDFNet /S /I /Y
    SHELL

Instalacja NuGet (uproszczona)

Aby uzyskać bardziej zwięzłe podejście:

  1. Otwórz menedżera pakietów NuGet
  2. Wyszukaj "PDFTron.NET.x64" lub pakiet przeznaczony dla konkretnej platformy
  3. Zainstaluj odpowiedni pakiet dla swojej architektury

Interfejs instalacji pakietu NuGet PDFTron 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")
$vbLabelText   $csharpLabel

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
$vbLabelText   $csharpLabel

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
$vbLabelText   $csharpLabel

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
$vbLabelText   $csharpLabel

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
$vbLabelText   $csharpLabel

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
$vbLabelText   $csharpLabel

Funkcja ASPX do PDF firmy IronPDF zachowuje:

  • ViewState i 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
$vbLabelText   $csharpLabel

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
$vbLabelText   $csharpLabel

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
$vbLabelText   $csharpLabel

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
$vbLabelText   $csharpLabel

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.ForEach był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")
$vbLabelText   $csharpLabel

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

  • Konwersja ASPX do PDF ASPX
  • Optymalizacja dla Azure i chmury Azure
  • Kompleksowe wsparcie dla HTML/CSS/JS

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.

Zacznij z IronPDF teraz.
green arrow pointer

Zwróć uwagęPDFTron jest zarejestrowanym znakiem towarowym odpowiedniego właściciela. Ta strona nie jest powiązana z, popierana ani sponsorowana przez PDFTron. Wszystkie nazwy produktów, logo i marki są własnością ich odpowiednich właścicieli. Porównania mają charakter wyłącznie informacyjny i odzwierciedlają informacje dostępne publicznie w momencie pisania.

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.

Jacob Mellor, Dyrektor Technologiczny @ Team Iron
Dyrektor ds. technologii

Jacob Mellor jest Chief Technology Officer w Iron Software i wizjonerskim inżynierem, pionierem technologii C# PDF. Jako pierwotny deweloper głównej bazy kodowej Iron Software, kształtuje architekturę produktów firmy od jej początku, przekształcając ją wspólnie z CEO Cameron Rimington w firmę liczą...

Czytaj więcej

Zespół wsparcia Iron

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