Przejdź do treści stopki
PORóWNANIA PRODUKTóW
Porownanie HTML do PDF w IronPDF w porownaniu z iText7

Porównanie IronPDF & iText7

Full Comparison

Looking for a detailed feature-by-feature breakdown? See how IronPDF stacks up against Itext on pricing, HTML support, and licensing.

View Full Comparison

Przyzwoite i proste narzędzie do manipulowania plikami PDF może usprawnić wiele zadań i procesów związanych z tworzeniem i edytowaniem dokumentów PDF. W ekosystemie .NET są dwie popularne biblioteki – IronPDF i iText – które pozwalają na generowanie PDF-ów bez jakichkolwiek zależności od Adobe. Obie oferują różnorodne funkcje, takie jak tworzenie, edytowanie, konwersja itp., ale ten artykuł skupi się na porównaniu tych bibliotek na podstawie trzech kryteriów: oferowanych funkcji, jakości dołączonej dokumentacji oraz polityk cenowych przyjętych przez te firmy w celu korzystania z ich produktów.

Przegląd IronPDF i iText

IronPDF to znana biblioteka .NET PDF, która pozwala programistom łatwo tworzyć, modyfikować i współdziałać z dokumentami PDF. Może być używana w różnych środowiskach .NET, w tym Core, 8, 7, 6 i Framework, co czyni ją wysoce elastyczną dla różnych wymagań rozwojowych. Kluczową cechą IronPDF jest jego bogaty zestaw funkcji, takich jak konwersja HTML do PDF, możliwość łączenia PDF-ów, szyfrowanie PDF oraz stosowanie podpisów cyfrowych, między innymi. Dokumentacja jest napisana w sposób zrozumiały dla użytkowników bez żadnych trudności, a sama biblioteka ma silne wsparcie techniczne.

iText jest jedną z najpopularniejszych bibliotek PDF dostępnych dla Java, a także .NET (C#). iText Core 8 oferuje programowalne rozwiązanie na poziomie enterprise do tworzenia i manipulowania plikami PDF. iText oferuje wsparcie dla wielu różnych funkcji i jest wydawany zarówno na licencji open-source (AGPL), jak i komercyjnych. Oznacza to, że może pokrywać szeroki zakres przypadków użycia podczas projektów transformacji cyfrowej dzięki swojej wszechstronności.

Kompatybilność między platformami

IronPDF i iText są kompatybilne z różnymi platformami; mogą przetwarzać pliki PDF na wielu różnych systemach oraz w środowisku .NET. Poniżej porównamy wspierane struktury i platformy dla każdego z produktów.

IronPDF:

IronPDF Przegląd Wspieranych Platform wspiera szeroki zakres platform i środowisk, zapewniając bezproblemową integrację i wdrożenie w różnych systemach:

  • Wersje .NET:

    • .NET Core (8, 7, 6, 5 i 3.1+)
    • .NET Standard (2.0+)
    • .NET Framework (4.6.2+)
  • Środowiska aplikacyjne: IronPDF działa w środowiskach aplikacyjnych, w tym Windows, Linux, Mac, Docker, Azure i AWS.

  • IDE: Działa z IDE, takimi jak Microsoft Visual Studio, JetBrains Rider i ReSharper.

  • Systemy operacyjne i procesory: Wspiera kilka różnych OS i procesorów, w tym Windows, Mac, Linux, x64, x86, ARM.

iText

  • Wersje .NET:

    • .NET Core (2.x, 3.x)
    • .NET Framework (4.6.1+)
    • .NET 5+
  • Środowiska aplikacyjne: iText wspiera różnorodne środowiska aplikacyjne dzięki wsparciu zarówno dla Java, jak i .NET (C#), w tym Windows, Mac, Linux i Docker.

  • Systemy operacyjne: Działa na systemach operacyjnych Windows, macOS i Linux.

Kluczowe Cechy Porównawcze: IronPDF vs. iText

Lista Kluczowych Cech IronPDF i iText oferują szereg funkcji i narzędzi do pracy z plikami PDF. Skupienie tej sekcji polega na dokładnym zbadaniu niektórych z tych funkcji i zobaczeniu, jak te dwie biblioteki porównują się w zakresie realizacji różnych zadań związanych z PDF.

IronPDF

  • Konwersja HTML do PDF: Wspiera HTML, CSS, JavaScript i obrazy.

  • Manipulacja plikami PDF: Rozdzielanie i łączenie dokumentów, zmiana formatowania oraz edytowanie istniejących dokumentów PDF.

  • Bezpieczeństwo: Szyfrowanie i deszyfrowanie PDF.

  • Edycja: Dodawanie adnotacji, zakładek i konspektów.

  • Szablony: Stosowanie nagłówków, stopek i numeracji stron.

  • Oznaczanie wodnym znakiem: Łatwe stosowanie tekstów i obrazów znaków wodnych w plikach PDF; zyskanie pełnej kontroli za pomocą HTML/CSS.

  • Znaczki PDF: Stemplowanie obrazów i tekstów do dokumentów PDF za pomocą IronPDF.

Aby uzyskać więcej informacji o szerokim zestawie funkcji, które oferuje IronPDF, odwiedź stronę funkcji IronPDF.

iText

  • Tworzenie PDF: Obsługuje tworzenie dokumentów PDF od podstaw.

  • Formularze: Twórz i edytuj formularze PDF.

  • Podpisy cyfrowe: Podpisuj dokumenty PDF.

  • Kompresja: Optymalizuj rozmiary plików PDF.

  • Wyodrębnianie zawartości: Wyodrębnij tekst i obrazy z plików PDF.

  • Open Source: Dostępny na licencji AGPL.

  • Dostosowywalność: Wysoki poziom dostosowywania dla zaawansowanych przypadków użycia.

Porównanie Funkcji Funkcionalności PDF między IronPDF a iText

Konwersja HTML do PDF

Konwersja zawartości HTML na PDF za pomocą IronPDF to zadanie wykonywane w wielu różnych biurach i przestrzeniach roboczych. Poniżej znajdują się przykłady kodu porównujące, jak IronPDF i iText podchodzą do tego procesu.

IronPDF

using IronPdf;

// Configure security settings
Installation.EnableWebSecurity = true;

// Instantiate Renderer
var renderer = new ChromePdfRenderer();

// Create a PDF from an HTML string using C#
var pdf = renderer.RenderHtmlAsPdf("<h1>Hello World</h1>");
pdf.SaveAs("output.pdf");

// Advanced Example with HTML Assets
// Load external HTML assets: images, CSS and JavaScript.
var myAdvancedPdf = renderer.RenderHtmlAsPdf("<img src='icons/iron.png'>", @"C:\site\assets\");
myAdvancedPdf.SaveAs("html-with-assets.pdf");
using IronPdf;

// Configure security settings
Installation.EnableWebSecurity = true;

// Instantiate Renderer
var renderer = new ChromePdfRenderer();

// Create a PDF from an HTML string using C#
var pdf = renderer.RenderHtmlAsPdf("<h1>Hello World</h1>");
pdf.SaveAs("output.pdf");

// Advanced Example with HTML Assets
// Load external HTML assets: images, CSS and JavaScript.
var myAdvancedPdf = renderer.RenderHtmlAsPdf("<img src='icons/iron.png'>", @"C:\site\assets\");
myAdvancedPdf.SaveAs("html-with-assets.pdf");
Imports IronPdf

' Configure security settings
Installation.EnableWebSecurity = True

' Instantiate Renderer
Dim renderer = New ChromePdfRenderer()

' Create a PDF from an HTML string using C#
Dim pdf = renderer.RenderHtmlAsPdf("<h1>Hello World</h1>")
pdf.SaveAs("output.pdf")

' Advanced Example with HTML Assets
' Load external HTML assets: images, CSS and JavaScript.
Dim myAdvancedPdf = renderer.RenderHtmlAsPdf("<img src='icons/iron.png'>", "C:\site\assets\")
myAdvancedPdf.SaveAs("html-with-assets.pdf")
$vbLabelText   $csharpLabel

iText

using iText.Html2pdf;

static void Main(string[] args)
{
    using (FileStream htmlSource = File.Open("input.html", FileMode.Open))
    using (FileStream pdfDest = File.Open("output.pdf", FileMode.Create))
    {
        ConverterProperties converterProperties = new ConverterProperties();
        HtmlConverter.ConvertToPdf(htmlSource, pdfDest, converterProperties);
    }
}
using iText.Html2pdf;

static void Main(string[] args)
{
    using (FileStream htmlSource = File.Open("input.html", FileMode.Open))
    using (FileStream pdfDest = File.Open("output.pdf", FileMode.Create))
    {
        ConverterProperties converterProperties = new ConverterProperties();
        HtmlConverter.ConvertToPdf(htmlSource, pdfDest, converterProperties);
    }
}
Imports iText.Html2pdf

Shared Sub Main(ByVal args() As String)
	Using htmlSource As FileStream = File.Open("input.html", FileMode.Open)
	Using pdfDest As FileStream = File.Open("output.pdf", FileMode.Create)
		Dim converterProperties As New ConverterProperties()
		HtmlConverter.ConvertToPdf(htmlSource, pdfDest, converterProperties)
	End Using
	End Using
End Sub
$vbLabelText   $csharpLabel

Podczas konwersji HTML do PDF, IronPDF oferuje zwięzłe i wygodne narzędzie do tego zadania. Wykorzystując ChromePdfRenderer do konwersji zawartości HTML w PDF, IronPDF wyróżnia się tym, że zapewnia użytkownikom dokumenty PDF o idealnym odwzorowaniu. Użytkownicy mogą tworzyć PDF-y bezpośrednio z ciągów HTML lub uwzględniać zewnętrzne zasoby, takie jak obrazy z opcjonalną bazową ścieżką, jak pokazano w zaawansowanym przykładzie. iText z kolei, korzysta z podstawowego podejścia, używając swojej klasy HtmlConverter do tworzenia dokumentów PDF z pliku HTML.

Szyfrowanie plików PDF

Szyfrowanie plików PDF za pomocą IronPDF oraz deszyfrowanie są ważne w wielu miejscach pracy. Poniżej zobaczymy, jak iText i IronPDF radzą sobie z szyfrowaniem PDF.

IronPDF

using IronPdf;
using System;

// Open an Encrypted File, alternatively create a new PDF from HTML
var pdf = PdfDocument.FromFile("encrypted.pdf", "password");

// Edit file metadata
pdf.MetaData.Author = "Satoshi Nakamoto";
pdf.MetaData.Keywords = "SEO, Friendly";
pdf.MetaData.ModifiedDate = DateTime.Now;

// Edit file security settings
pdf.SecuritySettings.RemovePasswordsAndEncryption();
pdf.SecuritySettings.MakePdfDocumentReadOnly("secret-key");
pdf.SecuritySettings.AllowUserAnnotations = false;
pdf.SecuritySettings.AllowUserCopyPasteContent = false;
pdf.SecuritySettings.AllowUserFormData = false;
pdf.SecuritySettings.AllowUserPrinting = IronPdf.Security.PdfPrintSecurity.FullPrintRights;

// Change or set the document encryption password
pdf.Password = "my-password";
pdf.SaveAs("secured.pdf");
using IronPdf;
using System;

// Open an Encrypted File, alternatively create a new PDF from HTML
var pdf = PdfDocument.FromFile("encrypted.pdf", "password");

// Edit file metadata
pdf.MetaData.Author = "Satoshi Nakamoto";
pdf.MetaData.Keywords = "SEO, Friendly";
pdf.MetaData.ModifiedDate = DateTime.Now;

// Edit file security settings
pdf.SecuritySettings.RemovePasswordsAndEncryption();
pdf.SecuritySettings.MakePdfDocumentReadOnly("secret-key");
pdf.SecuritySettings.AllowUserAnnotations = false;
pdf.SecuritySettings.AllowUserCopyPasteContent = false;
pdf.SecuritySettings.AllowUserFormData = false;
pdf.SecuritySettings.AllowUserPrinting = IronPdf.Security.PdfPrintSecurity.FullPrintRights;

// Change or set the document encryption password
pdf.Password = "my-password";
pdf.SaveAs("secured.pdf");
Imports IronPdf
Imports System

' Open an Encrypted File, alternatively create a new PDF from HTML
Private pdf = PdfDocument.FromFile("encrypted.pdf", "password")

' Edit file metadata
pdf.MetaData.Author = "Satoshi Nakamoto"
pdf.MetaData.Keywords = "SEO, Friendly"
pdf.MetaData.ModifiedDate = DateTime.Now

' Edit file security settings
pdf.SecuritySettings.RemovePasswordsAndEncryption()
pdf.SecuritySettings.MakePdfDocumentReadOnly("secret-key")
pdf.SecuritySettings.AllowUserAnnotations = False
pdf.SecuritySettings.AllowUserCopyPasteContent = False
pdf.SecuritySettings.AllowUserFormData = False
pdf.SecuritySettings.AllowUserPrinting = IronPdf.Security.PdfPrintSecurity.FullPrintRights

' Change or set the document encryption password
pdf.Password = "my-password"
pdf.SaveAs("secured.pdf")
$vbLabelText   $csharpLabel

iText

using System;
using System.IO;
using System.Text;
using iText.Kernel.Pdf;

public class EncryptPdf
{
    public static readonly String DEST = "results/sandbox/security/encrypt_pdf.pdf";
    public static readonly String SRC = "../../../resources/pdfs/hello.pdf";

    public static readonly String OWNER_PASSWORD = "World";
    public static readonly String USER_PASSWORD = "Hello";

    public static void Main(String[] args)
    {
        FileInfo file = new FileInfo(DEST);
        file.Directory.Create();

        new EncryptPdf().ManipulatePdf(DEST);
    }

    protected void ManipulatePdf(String dest)
    {
        PdfDocument document = new PdfDocument(new PdfReader(SRC), new PdfWriter(dest,
            new WriterProperties().SetStandardEncryption(
                Encoding.UTF8.GetBytes(USER_PASSWORD),
                Encoding.UTF8.GetBytes(OWNER_PASSWORD),
                EncryptionConstants.ALLOW_PRINTING,
                EncryptionConstants.ENCRYPTION_AES_128 | EncryptionConstants.DO_NOT_ENCRYPT_METADATA
            )));
        document.Close();
    }
}
using System;
using System.IO;
using System.Text;
using iText.Kernel.Pdf;

public class EncryptPdf
{
    public static readonly String DEST = "results/sandbox/security/encrypt_pdf.pdf";
    public static readonly String SRC = "../../../resources/pdfs/hello.pdf";

    public static readonly String OWNER_PASSWORD = "World";
    public static readonly String USER_PASSWORD = "Hello";

    public static void Main(String[] args)
    {
        FileInfo file = new FileInfo(DEST);
        file.Directory.Create();

        new EncryptPdf().ManipulatePdf(DEST);
    }

    protected void ManipulatePdf(String dest)
    {
        PdfDocument document = new PdfDocument(new PdfReader(SRC), new PdfWriter(dest,
            new WriterProperties().SetStandardEncryption(
                Encoding.UTF8.GetBytes(USER_PASSWORD),
                Encoding.UTF8.GetBytes(OWNER_PASSWORD),
                EncryptionConstants.ALLOW_PRINTING,
                EncryptionConstants.ENCRYPTION_AES_128 | EncryptionConstants.DO_NOT_ENCRYPT_METADATA
            )));
        document.Close();
    }
}
Imports System
Imports System.IO
Imports System.Text
Imports iText.Kernel.Pdf

Public Class EncryptPdf
	Public Shared ReadOnly DEST As String = "results/sandbox/security/encrypt_pdf.pdf"
	Public Shared ReadOnly SRC As String = "../../../resources/pdfs/hello.pdf"

	Public Shared ReadOnly OWNER_PASSWORD As String = "World"
	Public Shared ReadOnly USER_PASSWORD As String = "Hello"

	Public Shared Sub Main(ByVal args() As String)
		Dim file As New FileInfo(DEST)
		file.Directory.Create()

		Call (New EncryptPdf()).ManipulatePdf(DEST)
	End Sub

	Protected Sub ManipulatePdf(ByVal dest As String)
		Dim document As New PdfDocument(New PdfReader(SRC), New PdfWriter(dest, (New WriterProperties()).SetStandardEncryption(Encoding.UTF8.GetBytes(USER_PASSWORD), Encoding.UTF8.GetBytes(OWNER_PASSWORD), EncryptionConstants.ALLOW_PRINTING, EncryptionConstants.ENCRYPTION_AES_128 Or EncryptionConstants.DO_NOT_ENCRYPT_METADATA)))
		document.Close()
	End Sub
End Class
$vbLabelText   $csharpLabel

IronPDF oferuje użytkownikom prosty sposób szyfrowania plików PDF, jednocześnie dając użytkownikom dużo kontroli, takiej jak edycja metadanych i dostosowywanie ustawień bezpieczeństwa, takich jak tworzenie dokumentów tylko do odczytu lub z ograniczeniem działań użytkownika, jak kopiowanie i wklejanie. Z drugiej strony, iText stosuje niższy poziom i dłuższą metodę, w której szyfrowanie PDF jest stosowane podczas tworzenia dokumentu, określając hasła właściciela i użytkownika wraz z uprawnieniami, takimi jak prawa do drukowania, przy użyciu standardów szyfrowania jak AES-128.

Zaciemnianie zawartości PDF

Czasami, podczas obsługi poufnych lub prywatnych informacji, może być konieczne zaciemnienie tekstu w PDF za pomocą IronPDF fragmentów pliku PDF. Poniższe przykłady kodu pokażą, jak można zaciemnić tekst używając IronPDF w porównaniu z iText.

IronPDF

using IronPdf;

PdfDocument pdf = PdfDocument.FromFile("novel.pdf");

// Redact 'are' phrase from all pages
pdf.RedactTextOnAllPages("are");

pdf.SaveAs("redacted.pdf");
using IronPdf;

PdfDocument pdf = PdfDocument.FromFile("novel.pdf");

// Redact 'are' phrase from all pages
pdf.RedactTextOnAllPages("are");

pdf.SaveAs("redacted.pdf");
Imports IronPdf

Private pdf As PdfDocument = PdfDocument.FromFile("novel.pdf")

' Redact 'are' phrase from all pages
pdf.RedactTextOnAllPages("are")

pdf.SaveAs("redacted.pdf")
$vbLabelText   $csharpLabel

iText

using System;
using System.IO;
using iText.Kernel.Pdf;
using iText.Layout;
using iText.Layout.Element;
using iText.Layout.Properties;
using iText.Kernel.Colors;

string src = "input.pdf";
string dest = "output_redacted.pdf";

using (PdfReader reader = new PdfReader(src))
using (PdfWriter writer = new PdfWriter(dest))
using (PdfDocument pdfDoc = new PdfDocument(reader, writer))
{
    // Iterate through each page
    for (int pageNum = 1; pageNum <= pdfDoc.GetNumberOfPages(); pageNum++)
    {
        PdfPage page = pdfDoc.GetPage(pageNum);
        PdfCanvas canvas = new PdfCanvas(page);
        Rectangle[] rectanglesToRedact = { new Rectangle(100, 100, 200, 50) }; // Define rectangles to redact

        // Overlay black rectangles to simulate redaction
        foreach (Rectangle rect in rectanglesToRedact)
        {
            canvas.SetFillColor(ColorConstants.BLACK)
                .Rectangle(rect.GetX(), rect.GetY(), rect.GetWidth(), rect.GetHeight())
                .Fill();
        }
    }
}
using System;
using System.IO;
using iText.Kernel.Pdf;
using iText.Layout;
using iText.Layout.Element;
using iText.Layout.Properties;
using iText.Kernel.Colors;

string src = "input.pdf";
string dest = "output_redacted.pdf";

using (PdfReader reader = new PdfReader(src))
using (PdfWriter writer = new PdfWriter(dest))
using (PdfDocument pdfDoc = new PdfDocument(reader, writer))
{
    // Iterate through each page
    for (int pageNum = 1; pageNum <= pdfDoc.GetNumberOfPages(); pageNum++)
    {
        PdfPage page = pdfDoc.GetPage(pageNum);
        PdfCanvas canvas = new PdfCanvas(page);
        Rectangle[] rectanglesToRedact = { new Rectangle(100, 100, 200, 50) }; // Define rectangles to redact

        // Overlay black rectangles to simulate redaction
        foreach (Rectangle rect in rectanglesToRedact)
        {
            canvas.SetFillColor(ColorConstants.BLACK)
                .Rectangle(rect.GetX(), rect.GetY(), rect.GetWidth(), rect.GetHeight())
                .Fill();
        }
    }
}
Imports System
Imports System.IO
Imports iText.Kernel.Pdf
Imports iText.Layout
Imports iText.Layout.Element
Imports iText.Layout.Properties
Imports iText.Kernel.Colors

Private src As String = "input.pdf"
Private dest As String = "output_redacted.pdf"

Using reader As New PdfReader(src)
Using writer As New PdfWriter(dest)
Using pdfDoc As New PdfDocument(reader, writer)
	' Iterate through each page
	Dim pageNum As Integer = 1
	Do While pageNum <= pdfDoc.GetNumberOfPages()
		Dim page As PdfPage = pdfDoc.GetPage(pageNum)
		Dim canvas As New PdfCanvas(page)
		Dim rectanglesToRedact() As Rectangle = { New Rectangle(100, 100, 200, 50) } ' Define rectangles to redact

		' Overlay black rectangles to simulate redaction
		For Each rect As Rectangle In rectanglesToRedact
			canvas.SetFillColor(ColorConstants.BLACK).Rectangle(rect.GetX(), rect.GetY(), rect.GetWidth(), rect.GetHeight()).Fill()
		Next rect
		pageNum += 1
	Loop
End Using
End Using
End Using
$vbLabelText   $csharpLabel

Narzędzie do zaciemniania IronPDF jest zwięzłe i łatwe w obsłudze, co wymaga tylko kilku linii kodu do usprawnienia procesu zaciemniania. Zwiększa to wydajność zadań związanych z zaciemnianiem PDF i daje użytkownikom łatwy sposób na zabezpieczenie swoich poufnych i prywatnych danych. Z drugiej strony, iText nie oferuje wbudowanego narzędzia do zaciemniania w tym samym sensie, co IronPDF. Jednak nadal może zakrywać dane wrażliwe za pomocą metody pokazanej powyżej, aby rysować nad zawartością, którą użytkownicy chcą zaciemnić. Może to prowadzić do potencjalnych problemów, ponieważ te prostokąty nie usuwają ani właściwie nie zaciemniają tekstu, co oznacza, że inni ludzie mogą potencjalnie kopiować i wklejać dane, które zostały zaciemnione.

Podpisywanie dokumentów PDF

Możliwość cyfrowego podpisywania dokumentów PDF za pomocą IronPDF może zaoszczędzić czas, zwłaszcza gdy jest to proces zautomatyzowany. Oto kilka fragmentów kodu porównujących, jak IronPDF różni się od iText pod względem przeprowadzania cyfrowego podpisywania dokumentów.

IronPDF

using IronPdf;
using IronPdf.Signing;
using System.Security.Cryptography.X509Certificates;

// Create X509Certificate2 object with X509KeyStorageFlags set to Exportable
X509Certificate2 cert = new X509Certificate2("IronSoftware.pfx", "123456", X509KeyStorageFlags.Exportable);

// Create PdfSignature object
var sig = new PdfSignature(cert);

// Sign PDF document
PdfDocument pdf = PdfDocument.FromFile("document.pdf");
pdf.Sign(sig);
pdf.SaveAs("signed.pdf");
using IronPdf;
using IronPdf.Signing;
using System.Security.Cryptography.X509Certificates;

// Create X509Certificate2 object with X509KeyStorageFlags set to Exportable
X509Certificate2 cert = new X509Certificate2("IronSoftware.pfx", "123456", X509KeyStorageFlags.Exportable);

// Create PdfSignature object
var sig = new PdfSignature(cert);

// Sign PDF document
PdfDocument pdf = PdfDocument.FromFile("document.pdf");
pdf.Sign(sig);
pdf.SaveAs("signed.pdf");
Imports IronPdf
Imports IronPdf.Signing
Imports System.Security.Cryptography.X509Certificates

' Create X509Certificate2 object with X509KeyStorageFlags set to Exportable
Private cert As New X509Certificate2("IronSoftware.pfx", "123456", X509KeyStorageFlags.Exportable)

' Create PdfSignature object
Private sig = New PdfSignature(cert)

' Sign PDF document
Private pdf As PdfDocument = PdfDocument.FromFile("document.pdf")
pdf.Sign(sig)
pdf.SaveAs("signed.pdf")
$vbLabelText   $csharpLabel

iText

using System;
using System.IO;
using iText.Kernel.Pdf;
using iText.Signatures;
using Org.BouncyCastle.Crypto;
using Org.BouncyCastle.Pkcs;
using Org.BouncyCastle.X509;

class Program
{
    static void Main(string[] args)
    {
        string src = "input.pdf";
        string dest = "output_signed.pdf";
        string pfxFile = "your_certificate.pfx";
        string pfxPassword = "your_password";

        try
        {
            // Load your certificate
            Pkcs12Store ks = new Pkcs12Store(new FileStream(pfxFile, FileMode.Open), pfxPassword.ToCharArray());
            string alias = null;
            foreach (string al in ks.Aliases)
            {
                if (ks.IsKeyEntry(al))
                {
                    alias = al;
                    break;
                }
            }
            ICipherParameters pk = ks.GetKey(alias).Key;
            X509CertificateEntry[] chain = ks.GetCertificateChain(alias);
            X509Certificate2 cert = new X509Certificate2(chain[0].Certificate.GetEncoded());

            // Create output PDF with signed content
            using (PdfReader reader = new PdfReader(src))
            using (PdfWriter writer = new PdfWriter(dest))
            using (PdfDocument pdfDoc = new PdfDocument(reader, writer))
            {
                // Create the signer
                PdfSigner signer = new PdfSigner(pdfDoc, writer, new StampingProperties().UseAppendMode());

                // Configure signature appearance
                PdfSignatureAppearance appearance = signer.GetSignatureAppearance();
                appearance.SetReason("Digital Signature");
                appearance.SetLocation("Your Location");
                appearance.SetContact("Your Contact");

                // Create signature
                IExternalSignature pks = new PrivateKeySignature(pk, "SHA-256");
                signer.SignDetached(pks, chain, null, null, null, 0, PdfSigner.CryptoStandard.CMS);
            }

            Console.WriteLine($"PDF digitally signed successfully: {dest}");
        }
        catch (Exception ex)
        {
            Console.WriteLine($"Error signing PDF: {ex.Message}");
        }
    }
}
using System;
using System.IO;
using iText.Kernel.Pdf;
using iText.Signatures;
using Org.BouncyCastle.Crypto;
using Org.BouncyCastle.Pkcs;
using Org.BouncyCastle.X509;

class Program
{
    static void Main(string[] args)
    {
        string src = "input.pdf";
        string dest = "output_signed.pdf";
        string pfxFile = "your_certificate.pfx";
        string pfxPassword = "your_password";

        try
        {
            // Load your certificate
            Pkcs12Store ks = new Pkcs12Store(new FileStream(pfxFile, FileMode.Open), pfxPassword.ToCharArray());
            string alias = null;
            foreach (string al in ks.Aliases)
            {
                if (ks.IsKeyEntry(al))
                {
                    alias = al;
                    break;
                }
            }
            ICipherParameters pk = ks.GetKey(alias).Key;
            X509CertificateEntry[] chain = ks.GetCertificateChain(alias);
            X509Certificate2 cert = new X509Certificate2(chain[0].Certificate.GetEncoded());

            // Create output PDF with signed content
            using (PdfReader reader = new PdfReader(src))
            using (PdfWriter writer = new PdfWriter(dest))
            using (PdfDocument pdfDoc = new PdfDocument(reader, writer))
            {
                // Create the signer
                PdfSigner signer = new PdfSigner(pdfDoc, writer, new StampingProperties().UseAppendMode());

                // Configure signature appearance
                PdfSignatureAppearance appearance = signer.GetSignatureAppearance();
                appearance.SetReason("Digital Signature");
                appearance.SetLocation("Your Location");
                appearance.SetContact("Your Contact");

                // Create signature
                IExternalSignature pks = new PrivateKeySignature(pk, "SHA-256");
                signer.SignDetached(pks, chain, null, null, null, 0, PdfSigner.CryptoStandard.CMS);
            }

            Console.WriteLine($"PDF digitally signed successfully: {dest}");
        }
        catch (Exception ex)
        {
            Console.WriteLine($"Error signing PDF: {ex.Message}");
        }
    }
}
Imports System
Imports System.IO
Imports iText.Kernel.Pdf
Imports iText.Signatures
Imports Org.BouncyCastle.Crypto
Imports Org.BouncyCastle.Pkcs
Imports Org.BouncyCastle.X509

Friend Class Program
	Shared Sub Main(ByVal args() As String)
		Dim src As String = "input.pdf"
		Dim dest As String = "output_signed.pdf"
		Dim pfxFile As String = "your_certificate.pfx"
		Dim pfxPassword As String = "your_password"

		Try
			' Load your certificate
			Dim ks As New Pkcs12Store(New FileStream(pfxFile, FileMode.Open), pfxPassword.ToCharArray())
			Dim [alias] As String = Nothing
			For Each al As String In ks.Aliases
				If ks.IsKeyEntry(al) Then
					[alias] = al
					Exit For
				End If
			Next al
			Dim pk As ICipherParameters = ks.GetKey([alias]).Key
			Dim chain() As X509CertificateEntry = ks.GetCertificateChain([alias])
			Dim cert As New X509Certificate2(chain(0).Certificate.GetEncoded())

			' Create output PDF with signed content
			Using reader As New PdfReader(src)
			Using writer As New PdfWriter(dest)
			Using pdfDoc As New PdfDocument(reader, writer)
				' Create the signer
				Dim signer As New PdfSigner(pdfDoc, writer, (New StampingProperties()).UseAppendMode())

				' Configure signature appearance
				Dim appearance As PdfSignatureAppearance = signer.GetSignatureAppearance()
				appearance.SetReason("Digital Signature")
				appearance.SetLocation("Your Location")
				appearance.SetContact("Your Contact")

				' Create signature
				Dim pks As IExternalSignature = New PrivateKeySignature(pk, "SHA-256")
				signer.SignDetached(pks, chain, Nothing, Nothing, Nothing, 0, PdfSigner.CryptoStandard.CMS)
			End Using
			End Using
			End Using

			Console.WriteLine($"PDF digitally signed successfully: {dest}")
		Catch ex As Exception
			Console.WriteLine($"Error signing PDF: {ex.Message}")
		End Try
	End Sub
End Class
$vbLabelText   $csharpLabel

Podczas stosowania podpisów do plików PDF cyfrowo, IronPDF prezentuje zwięzłe, ale potężne narzędzie do realizacji tego procesu. Jego prostota pozwala na szybkie wykonanie procesu, oszczędzając czas każdego programisty, który implementuje go na potrzeby podpisywania. iText wymaga dłuższego, bardziej złożonego procesu, aby stosować podpisy cyfrowe do plików PDF. Chociaż ich zdolność do używania różnych opcji interfejsu i kluczy oferuje więcej kontroli użytkownikowi, złożoność, jaką to narzędzie przeprowadza to zadanie, może ograniczać jego użycie.

Stosowanie znaku wodnego do dokumentów PDF

Możliwość dodawania i personalizacji znaków wodnych na PDF za pomocą IronPDF może znacząco pomóc w ochronie poufności, ochronie praw autorskich, budowaniu marki lub każdym zadaniu związanym z informacjami wrażliwymi. Poniżej porównanie, jak IronPDF i iText stosują znaki wodne do plików PDF.

IronPDF

using IronPdf;

// Stamps a Watermark onto a new or existing PDF
var renderer = new ChromePdfRenderer();

var pdf = renderer.RenderUrlAsPdf("https://www.nuget.org/packages/IronPdf");
pdf.ApplyWatermark("<h2 style='color:red'>SAMPLE</h2>", 30, IronPdf.Editing.VerticalAlignment.Middle, IronPdf.Editing.HorizontalAlignment.Center);
pdf.SaveAs(@"C:\Path\To\Watermarked.pdf");
using IronPdf;

// Stamps a Watermark onto a new or existing PDF
var renderer = new ChromePdfRenderer();

var pdf = renderer.RenderUrlAsPdf("https://www.nuget.org/packages/IronPdf");
pdf.ApplyWatermark("<h2 style='color:red'>SAMPLE</h2>", 30, IronPdf.Editing.VerticalAlignment.Middle, IronPdf.Editing.HorizontalAlignment.Center);
pdf.SaveAs(@"C:\Path\To\Watermarked.pdf");
Imports IronPdf

' Stamps a Watermark onto a new or existing PDF
Private renderer = New ChromePdfRenderer()

Private pdf = renderer.RenderUrlAsPdf("https://www.nuget.org/packages/IronPdf")
pdf.ApplyWatermark("<h2 style='color:red'>SAMPLE</h2>", 30, IronPdf.Editing.VerticalAlignment.Middle, IronPdf.Editing.HorizontalAlignment.Center)
pdf.SaveAs("C:\Path\To\Watermarked.pdf")
$vbLabelText   $csharpLabel

iText

using iText.IO.Font;
using iText.IO.Font.Constants;
using iText.Kernel.Colors;
using iText.Kernel.Font;
using iText.Kernel.Pdf;
using iText.Kernel.Pdf.Canvas;
using iText.Kernel.Pdf.Extgstate;
using iText.Layout;
using iText.Layout.Element;
using iText.Layout.Properties;

public class TransparentWatermark 
{
    public static readonly String DEST = "results/sandbox/stamper/transparent_watermark.pdf";
    public static readonly String SRC = "../../../resources/pdfs/hero.pdf";

    public static void Main(String[] args) 
    {
        FileInfo file = new FileInfo(DEST);
        file.Directory.Create();

        new TransparentWatermark().ManipulatePdf(DEST);
    }

    protected void ManipulatePdf(String dest) 
    {
        PdfDocument pdfDoc = new PdfDocument(new PdfReader(SRC), new PdfWriter(dest));
        PdfCanvas under = new PdfCanvas(pdfDoc.GetFirstPage().NewContentStreamBefore(), new PdfResources(), pdfDoc);
        PdfFont font = PdfFontFactory.CreateFont(FontProgramFactory.CreateFont(StandardFonts.HELVETICA));
        Paragraph paragraph = new Paragraph("This watermark is added UNDER the existing content")
                .SetFont(font)
                .SetFontSize(15);

        Canvas canvasWatermark1 = new Canvas(under, pdfDoc.GetDefaultPageSize())
                .ShowTextAligned(paragraph, 297, 550, 1, TextAlignment.CENTER, VerticalAlignment.TOP, 0);
        canvasWatermark1.Close();
        PdfCanvas over = new PdfCanvas(pdfDoc.GetFirstPage());
        over.SetFillColor(ColorConstants.BLACK);
        paragraph = new Paragraph("This watermark is added ON TOP OF the existing content")
                .SetFont(font)
                .SetFontSize(15);

        Canvas canvasWatermark2 = new Canvas(over, pdfDoc.GetDefaultPageSize())
                .ShowTextAligned(paragraph, 297, 500, 1, TextAlignment.CENTER, VerticalAlignment.TOP, 0);
        canvasWatermark2.Close();
        paragraph = new Paragraph("This TRANSPARENT watermark is added ON TOP OF the existing content")
                .SetFont(font)
                .SetFontSize(15);
        over.SaveState();

        PdfExtGState gs1 = new PdfExtGState();
        gs1.SetFillOpacity(0.5f);
        over.SetExtGState(gs1);
        Canvas canvasWatermark3 = new Canvas(over, pdfDoc.GetDefaultPageSize())
                .ShowTextAligned(paragraph, 297, 450, 1, TextAlignment.CENTER, VerticalAlignment.TOP, 0);
        canvasWatermark3.Close();
        over.RestoreState();

        pdfDoc.Close();
    }
}
using iText.IO.Font;
using iText.IO.Font.Constants;
using iText.Kernel.Colors;
using iText.Kernel.Font;
using iText.Kernel.Pdf;
using iText.Kernel.Pdf.Canvas;
using iText.Kernel.Pdf.Extgstate;
using iText.Layout;
using iText.Layout.Element;
using iText.Layout.Properties;

public class TransparentWatermark 
{
    public static readonly String DEST = "results/sandbox/stamper/transparent_watermark.pdf";
    public static readonly String SRC = "../../../resources/pdfs/hero.pdf";

    public static void Main(String[] args) 
    {
        FileInfo file = new FileInfo(DEST);
        file.Directory.Create();

        new TransparentWatermark().ManipulatePdf(DEST);
    }

    protected void ManipulatePdf(String dest) 
    {
        PdfDocument pdfDoc = new PdfDocument(new PdfReader(SRC), new PdfWriter(dest));
        PdfCanvas under = new PdfCanvas(pdfDoc.GetFirstPage().NewContentStreamBefore(), new PdfResources(), pdfDoc);
        PdfFont font = PdfFontFactory.CreateFont(FontProgramFactory.CreateFont(StandardFonts.HELVETICA));
        Paragraph paragraph = new Paragraph("This watermark is added UNDER the existing content")
                .SetFont(font)
                .SetFontSize(15);

        Canvas canvasWatermark1 = new Canvas(under, pdfDoc.GetDefaultPageSize())
                .ShowTextAligned(paragraph, 297, 550, 1, TextAlignment.CENTER, VerticalAlignment.TOP, 0);
        canvasWatermark1.Close();
        PdfCanvas over = new PdfCanvas(pdfDoc.GetFirstPage());
        over.SetFillColor(ColorConstants.BLACK);
        paragraph = new Paragraph("This watermark is added ON TOP OF the existing content")
                .SetFont(font)
                .SetFontSize(15);

        Canvas canvasWatermark2 = new Canvas(over, pdfDoc.GetDefaultPageSize())
                .ShowTextAligned(paragraph, 297, 500, 1, TextAlignment.CENTER, VerticalAlignment.TOP, 0);
        canvasWatermark2.Close();
        paragraph = new Paragraph("This TRANSPARENT watermark is added ON TOP OF the existing content")
                .SetFont(font)
                .SetFontSize(15);
        over.SaveState();

        PdfExtGState gs1 = new PdfExtGState();
        gs1.SetFillOpacity(0.5f);
        over.SetExtGState(gs1);
        Canvas canvasWatermark3 = new Canvas(over, pdfDoc.GetDefaultPageSize())
                .ShowTextAligned(paragraph, 297, 450, 1, TextAlignment.CENTER, VerticalAlignment.TOP, 0);
        canvasWatermark3.Close();
        over.RestoreState();

        pdfDoc.Close();
    }
}
Imports iText.IO.Font
Imports iText.IO.Font.Constants
Imports iText.Kernel.Colors
Imports iText.Kernel.Font
Imports iText.Kernel.Pdf
Imports iText.Kernel.Pdf.Canvas
Imports iText.Kernel.Pdf.Extgstate
Imports iText.Layout
Imports iText.Layout.Element
Imports iText.Layout.Properties

Public Class TransparentWatermark
	Public Shared ReadOnly DEST As String = "results/sandbox/stamper/transparent_watermark.pdf"
	Public Shared ReadOnly SRC As String = "../../../resources/pdfs/hero.pdf"

	Public Shared Sub Main(ByVal args() As String)
		Dim file As New FileInfo(DEST)
		file.Directory.Create()

		Call (New TransparentWatermark()).ManipulatePdf(DEST)
	End Sub

	Protected Sub ManipulatePdf(ByVal dest As String)
		Dim pdfDoc As New PdfDocument(New PdfReader(SRC), New PdfWriter(dest))
		Dim under As New PdfCanvas(pdfDoc.GetFirstPage().NewContentStreamBefore(), New PdfResources(), pdfDoc)
		Dim font As PdfFont = PdfFontFactory.CreateFont(FontProgramFactory.CreateFont(StandardFonts.HELVETICA))
		Dim paragraph As Paragraph = (New Paragraph("This watermark is added UNDER the existing content")).SetFont(font).SetFontSize(15)

		Dim canvasWatermark1 As Canvas = (New Canvas(under, pdfDoc.GetDefaultPageSize())).ShowTextAligned(paragraph, 297, 550, 1, TextAlignment.CENTER, VerticalAlignment.TOP, 0)
		canvasWatermark1.Close()
		Dim over As New PdfCanvas(pdfDoc.GetFirstPage())
		over.SetFillColor(ColorConstants.BLACK)
		paragraph = (New Paragraph("This watermark is added ON TOP OF the existing content")).SetFont(font).SetFontSize(15)

		Dim canvasWatermark2 As Canvas = (New Canvas(over, pdfDoc.GetDefaultPageSize())).ShowTextAligned(paragraph, 297, 500, 1, TextAlignment.CENTER, VerticalAlignment.TOP, 0)
		canvasWatermark2.Close()
		paragraph = (New Paragraph("This TRANSPARENT watermark is added ON TOP OF the existing content")).SetFont(font).SetFontSize(15)
		over.SaveState()

		Dim gs1 As New PdfExtGState()
		gs1.SetFillOpacity(0.5F)
		over.SetExtGState(gs1)
		Dim canvasWatermark3 As Canvas = (New Canvas(over, pdfDoc.GetDefaultPageSize())).ShowTextAligned(paragraph, 297, 450, 1, TextAlignment.CENTER, VerticalAlignment.TOP, 0)
		canvasWatermark3.Close()
		over.RestoreState()

		pdfDoc.Close()
	End Sub
End Class
$vbLabelText   $csharpLabel

Łatwe i intuicyjne API IronPDF pozwala użytkownikom szybko stosować niestandardowe znaki wodne do swoich plików PDF, dając pełną kontrolę nad procesem. Jego zastosowanie HTML/CSS dodatkowo upraszcza proces, nie tracąc kontroli nad personalizacją. iText's podejście do dodawania znaków wodnych do PDF wymaga więcej manualnej pracy, potencjalnie spowalniając proces.

Stemplowanie obrazów i tekstu na PDF

Czasami strony PDF trzeba oznaczyć tekstem lub obrazami na PDF, podobnie jak w przypadku konieczności stosowania znaków wodnych do swoich plików PDF. Teraz porównamy, jak IronPDF i iText wykonują stemplowanie zawartości na dokumentach PDF.

IronPDF

using IronPdf;
using IronPdf.Editing;

ChromePdfRenderer renderer = new ChromePdfRenderer();

PdfDocument pdf = renderer.RenderHtmlAsPdf("<h1>Example HTML Document!</h1>");

// Create text stamper
TextStamper textStamper = new TextStamper()
{
    Text = "Text Stamper!",
    FontFamily = "Bungee Spice",
    UseGoogleFont = true,
    FontSize = 30,
    IsBold = true,
    IsItalic = true,
    VerticalAlignment = VerticalAlignment.Top,
};

// Stamp the text stamper
pdf.ApplyStamp(textStamper);
pdf.SaveAs("stampText.pdf");

// Create image stamper
ImageStamper imageStamper = new ImageStamper(new Uri("https://ironpdf.com/img/svgs/iron-pdf-logo.svg"))
{
    VerticalAlignment = VerticalAlignment.Top,
};

// Stamp the image stamper
pdf.ApplyStamp(imageStamper, 0);
pdf.SaveAs("stampImage.pdf");
using IronPdf;
using IronPdf.Editing;

ChromePdfRenderer renderer = new ChromePdfRenderer();

PdfDocument pdf = renderer.RenderHtmlAsPdf("<h1>Example HTML Document!</h1>");

// Create text stamper
TextStamper textStamper = new TextStamper()
{
    Text = "Text Stamper!",
    FontFamily = "Bungee Spice",
    UseGoogleFont = true,
    FontSize = 30,
    IsBold = true,
    IsItalic = true,
    VerticalAlignment = VerticalAlignment.Top,
};

// Stamp the text stamper
pdf.ApplyStamp(textStamper);
pdf.SaveAs("stampText.pdf");

// Create image stamper
ImageStamper imageStamper = new ImageStamper(new Uri("https://ironpdf.com/img/svgs/iron-pdf-logo.svg"))
{
    VerticalAlignment = VerticalAlignment.Top,
};

// Stamp the image stamper
pdf.ApplyStamp(imageStamper, 0);
pdf.SaveAs("stampImage.pdf");
Imports IronPdf
Imports IronPdf.Editing

Private renderer As New ChromePdfRenderer()

Private pdf As PdfDocument = renderer.RenderHtmlAsPdf("<h1>Example HTML Document!</h1>")

' Create text stamper
Private textStamper As New TextStamper() With {
	.Text = "Text Stamper!",
	.FontFamily = "Bungee Spice",
	.UseGoogleFont = True,
	.FontSize = 30,
	.IsBold = True,
	.IsItalic = True,
	.VerticalAlignment = VerticalAlignment.Top
}

' Stamp the text stamper
pdf.ApplyStamp(textStamper)
pdf.SaveAs("stampText.pdf")

' Create image stamper
Dim imageStamper As New ImageStamper(New Uri("https://ironpdf.com/img/svgs/iron-pdf-logo.svg")) With {.VerticalAlignment = VerticalAlignment.Top}

' Stamp the image stamper
pdf.ApplyStamp(imageStamper, 0)
pdf.SaveAs("stampImage.pdf")
$vbLabelText   $csharpLabel

iText

using iText.Kernel.Pdf;
using iText.Layout;
using iText.Layout.Element;

public void StampPDF(string inputPdfPath, string outputPdfPath, string stampText)
{
    PdfDocument pdfDoc = new PdfDocument(new PdfReader(inputPdfPath), new PdfWriter(outputPdfPath));

    Document doc = new Document(pdfDoc);

    // Add stamp (text) to each page
    int numPages = pdfDoc.GetNumberOfPages();
    for (int i = 1; i <= numPages; i++)
    {
        doc.ShowTextAligned(new Paragraph(stampText),
                            36, 36, i, iText.Layout.Properties.TextAlignment.LEFT,
                            iText.Layout.Properties.VerticalAlignment.TOP, 0);
    }

    doc.Close();
}
using iText.Kernel.Pdf;
using iText.Layout;
using iText.Layout.Element;

public void StampPDF(string inputPdfPath, string outputPdfPath, string stampText)
{
    PdfDocument pdfDoc = new PdfDocument(new PdfReader(inputPdfPath), new PdfWriter(outputPdfPath));

    Document doc = new Document(pdfDoc);

    // Add stamp (text) to each page
    int numPages = pdfDoc.GetNumberOfPages();
    for (int i = 1; i <= numPages; i++)
    {
        doc.ShowTextAligned(new Paragraph(stampText),
                            36, 36, i, iText.Layout.Properties.TextAlignment.LEFT,
                            iText.Layout.Properties.VerticalAlignment.TOP, 0);
    }

    doc.Close();
}
Imports iText.Kernel.Pdf
Imports iText.Layout
Imports iText.Layout.Element

Public Sub StampPDF(ByVal inputPdfPath As String, ByVal outputPdfPath As String, ByVal stampText As String)
	Dim pdfDoc As New PdfDocument(New PdfReader(inputPdfPath), New PdfWriter(outputPdfPath))

	Dim doc As New Document(pdfDoc)

	' Add stamp (text) to each page
	Dim numPages As Integer = pdfDoc.GetNumberOfPages()
	For i As Integer = 1 To numPages
		doc.ShowTextAligned(New Paragraph(stampText), 36, 36, i, iText.Layout.Properties.TextAlignment.LEFT, iText.Layout.Properties.VerticalAlignment.TOP, 0)
	Next i

	doc.Close()
End Sub
$vbLabelText   $csharpLabel

IronPDF może pomóc w dodawaniu tekstu lub obrazów do PDF w sposób wszechstronny i dostosowawczy, oferując pełną kontrolę. Jego API jest łatwe do zrozumienia i pracy z nim, zwłaszcza dla programistów zaznajomionych z HTML/CSS. iText używa swoich narzędzi do stemplowania obrazów i tekstów, aby dać użytkownikom większą kontrolę nad zawartością wyświetlaną na ich plikach PDF, chociaż proces może ostatecznie być bardziej manualny.

Konwertuj DOCX do PDF

Czasami trzeba konwertować PDF z jednego formatu na inny. W tym przypadku przyjrzymy się konwersji DOCX do PDF za pomocą IronPDF i jak IronPDF oraz iText radzą sobie z tym procesem różnie.

IronPDF

using IronPdf;

// Instantiate Renderer
DocxToPdfRenderer renderer = new DocxToPdfRenderer();

// Render from DOCX file
PdfDocument pdf = renderer.RenderDocxAsPdf("Modern-chronological-resume.docx");

// Save the PDF
pdf.SaveAs("pdfFromDocx.pdf");
using IronPdf;

// Instantiate Renderer
DocxToPdfRenderer renderer = new DocxToPdfRenderer();

// Render from DOCX file
PdfDocument pdf = renderer.RenderDocxAsPdf("Modern-chronological-resume.docx");

// Save the PDF
pdf.SaveAs("pdfFromDocx.pdf");
Imports IronPdf

' Instantiate Renderer
Private renderer As New DocxToPdfRenderer()

' Render from DOCX file
Private pdf As PdfDocument = renderer.RenderDocxAsPdf("Modern-chronological-resume.docx")

' Save the PDF
pdf.SaveAs("pdfFromDocx.pdf")
$vbLabelText   $csharpLabel

iText

iText, samodzielnie, nie może obsłużyć konwersji DOCX do PDF; zamiast tego polega na zewnętrznych bibliotekach, takich jak DocX lub Aspose.Words.

IronPDF zapewnia programistom prostą i zwięzłą funkcję do obsługi zadań konwersji DOCX do PDF, czyniąc ją łatwą do konwersji plików DOCX na format PDF bez konieczności korzystania z zewnętrznych bibliotek. iText, z kolei, polega na zewnętrznych bibliotekach do wykonania tego zadania.

Podsumowanie porównania przykładów kodowania

iText C# HTML do PDF Alternatywy

Więcej szczegółowych przykładów znajdziesz na Przykłady IronPDF tworzenia PDF z HTML.

Wsparcie dla Bootstrap i Nowoczesnych Ram CSS

Istotną kwestią, która często pojawia się podczas rzeczywistego rozwoju, jest to, jak dobrze każda biblioteka obsługuje nowoczesne ramy CSS. Z Bootstrap, Tailwind CSS i Foundation stanowiących podstawę większości współczesnych aplikacji internetowych, kompatybilność ram może znacząco wpłynąć na przepływ pracy nad rozwojem i jakość wyników.

IronPDF: Pełna obsługa nowoczesnych frameworków

Silnik renderujący Chrome w IronPDF zapewnia pełne, gotowe na produkcję wsparcie dla wszystkich nowoczesnych ram CSS:

  • Bootstrap 5: Wsparcie dla natywnego flexbox i siatki CSS dla wszystkich układów
  • Tailwind CSS: Pełne wsparcie dla ram narzędziowych
  • Nowoczesny CSS3: Transformacje, animacje, niestandardowe właściwości i zaawansowane selektory
  • Weryfikacja ram: Skutecznie renderuje stronę główną Bootstrap i szablony Bootstrap

Przykład kodu: Wskaźniki postępu Bootstrap

using IronPdf;

var renderer = new ChromePdfRenderer();

string bootstrap ProgressBars = @"
<!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 my-5'>
        <h2 class='mb-4'>Project Progress Dashboard</h2>

        <div class='mb-4'>
            <div class='d-flex justify-content-between mb-1'>
                <span>Backend Development</span>
                <span class='text-success fw-bold'>85%</span>
            </div>
            <div class='progress' style='height: 25px;'>
                <div class='progress-bar progress-bar-striped bg-success' role='progressbar'
                     style='width: 85%' aria-valuenow='85' aria-valuemin='0' aria-valuemax='100'>
                </div>
            </div>
        </div>

        <div class='mb-4'>
            <div class='d-flex justify-content-between mb-1'>
                <span>Frontend UI</span>
                <span class='text-warning fw-bold'>60%</span>
            </div>
            <div class='progress' style='height: 25px;'>
                <div class='progress-bar progress-bar-animated bg-warning' role='progressbar'
                     style='width: 60%' aria-valuenow='60' aria-valuemin='0' aria-valuemax='100'>
                </div>
            </div>
        </div>

        <div class='mb-4'>
            <div class='d-flex justify-content-between mb-1'>
                <span>Testing & QA</span>
                <span class='text-info fw-bold'>40%</span>
            </div>
            <div class='progress' style='height: 25px;'>
                <div class='progress-bar bg-info' role='progressbar'
                     style='width: 40%' aria-valuenow='40' aria-valuemin='0' aria-valuemax='100'>
                </div>
            </div>
        </div>
    </div>
</body>
</html>";

var pdf = renderer.RenderHtmlAsPdf(bootstrapProgressBars);
pdf.SaveAs("project-progress.pdf");
using IronPdf;

var renderer = new ChromePdfRenderer();

string bootstrap ProgressBars = @"
<!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 my-5'>
        <h2 class='mb-4'>Project Progress Dashboard</h2>

        <div class='mb-4'>
            <div class='d-flex justify-content-between mb-1'>
                <span>Backend Development</span>
                <span class='text-success fw-bold'>85%</span>
            </div>
            <div class='progress' style='height: 25px;'>
                <div class='progress-bar progress-bar-striped bg-success' role='progressbar'
                     style='width: 85%' aria-valuenow='85' aria-valuemin='0' aria-valuemax='100'>
                </div>
            </div>
        </div>

        <div class='mb-4'>
            <div class='d-flex justify-content-between mb-1'>
                <span>Frontend UI</span>
                <span class='text-warning fw-bold'>60%</span>
            </div>
            <div class='progress' style='height: 25px;'>
                <div class='progress-bar progress-bar-animated bg-warning' role='progressbar'
                     style='width: 60%' aria-valuenow='60' aria-valuemin='0' aria-valuemax='100'>
                </div>
            </div>
        </div>

        <div class='mb-4'>
            <div class='d-flex justify-content-between mb-1'>
                <span>Testing & QA</span>
                <span class='text-info fw-bold'>40%</span>
            </div>
            <div class='progress' style='height: 25px;'>
                <div class='progress-bar bg-info' role='progressbar'
                     style='width: 40%' aria-valuenow='40' aria-valuemin='0' aria-valuemax='100'>
                </div>
            </div>
        </div>
    </div>
</body>
</html>";

var pdf = renderer.RenderHtmlAsPdf(bootstrapProgressBars);
pdf.SaveAs("project-progress.pdf");
Imports IronPdf

Dim renderer As New ChromePdfRenderer()

Dim bootstrapProgressBars 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 my-5'>
        <h2 class='mb-4'>Project Progress Dashboard</h2>

        <div class='mb-4'>
            <div class='d-flex justify-content-between mb-1'>
                <span>Backend Development</span>
                <span class='text-success fw-bold'>85%</span>
            </div>
            <div class='progress' style='height: 25px;'>
                <div class='progress-bar progress-bar-striped bg-success' role='progressbar'
                     style='width: 85%' aria-valuenow='85' aria-valuemin='0' aria-valuemax='100'>
                </div>
            </div>
        </div>

        <div class='mb-4'>
            <div class='d-flex justify-content-between mb-1'>
                <span>Frontend UI</span>
                <span class='text-warning fw-bold'>60%</span>
            </div>
            <div class='progress' style='height: 25px;'>
                <div class='progress-bar progress-bar-animated bg-warning' role='progressbar'
                     style='width: 60%' aria-valuenow='60' aria-valuemin='0' aria-valuemax='100'>
                </div>
            </div>
        </div>

        <div class='mb-4'>
            <div class='d-flex justify-content-between mb-1'>
                <span>Testing & QA</span>
                <span class='text-info fw-bold'>40%</span>
            </div>
            <div class='progress' style='height: 25px;'>
                <div class='progress-bar bg-info' role='progressbar'
                     style='width: 40%' aria-valuenow='40' aria-valuemin='0' aria-valuemax='100'>
                </div>
            </div>
        </div>
    </div>
</body>
</html>"

Dim pdf = renderer.RenderHtmlAsPdf(bootstrapProgressBars)
pdf.SaveAs("project-progress.pdf")
$vbLabelText   $csharpLabel

iText7: Ograniczone wsparcie dla ram

iText7 używa niestandardowego konwertera HTML na PDF (pdfHTML) z poważnymi ograniczeniami dla nowoczesnych ram CSS:

  • Brak wykonywania JavaScript: Nie może obsłużyć dynamicznych komponentów Bootstrap
  • Ograniczone wsparcie dla flexbox: Układy Bootstrap 4+ często nie renderują się poprawnie (v7.1.15 ma częściowe wsparcie)
  • CSS Grid niewspierane: Nowoczesne układy oparte na siatce nie będą działać
  • Wymagana manualna preprocesja: Złożone układy potrzebują zewnętrznych narzędzi, takich jak Selenium lub Puppeteer

Według oficjalnej dokumentacji iText, programiści są zachęcani do:

  1. Unikania złożonych układów CSS, w tym flexbox
  2. Używania układów opartych na tabelach zamiast nowoczesnych systemów siatkowych
  3. Uproszczenia komponentów Bootstrap do bazowego HTML
  4. Dokładnych testów, ponieważ kompatybilność z ramami jest ograniczona

Wpływ w rzeczywistym świecie: Jeśli twoja aplikacja używa Bootstrap do swojego interfejsu użytkownika i potrzebujesz eksportów PDF, które odpowiadają twojemu projektowi sieciowemu, iText7 wymaga albo znaczących przeróbek HTML/CSS do generacji PDF, albo integracji z zewnętrznymi narzędziami automatyzacji przeglądarek, co znacznie zwiększa złożoność i czas rozwoju.

Dla kompleksowej informacji o kompatybilności ram CSS, zajrzyj do Przewodnik CSS Bootstrap i Flexbox.

Wycenianie i licencjonowanie: IronPDF vs. Biblioteka iText

Ceny i licencje IronPDF

Opcje Licencjonowania IronPDF oferują różne poziomy i dodatkowe funkcje do zakupu licencji. Programiści mogą także kupić Iron Suite, uzyskując dostęp do wszystkich produktów Iron Software w cenie dwóch. Jeśli nie jesteś gotowy, żeby kupić licencję, IronPDF oferuje darmową wersję próbną, która trwa 30 dni.

  • Licencje wieczyste: Oferują szereg licencji wieczystych w zależności od liczby programistów, potrzeb projektu i liczby lokalizacji. Każdy typ licencji zawiera wsparcie e-mailowe.

  • Lite License: Ta licencja wspiera jednego programistę, jedną lokalizację i jeden projekt.

  • Plus License: Wspierająca trzech programistów, trzy lokalizacje i trzy projekty, kosztuje $1,199. Licencja Plus oferuje wsparcie czatowe, telefoniczne i e-mail.

  • Professional License: Odpowiednia dla większych zespołów, wspierająca dziesięciu programistów, dziesięć lokalizacji i dziesięć projektów za $2,399. Oferuje te same kanały wsparcia, co poprzednie poziomy, ale również oferuje wsparcie przy udostępnianiu ekranu.

  • Redystrybucja bez opłat licencyjnych: Licencjonowanie IronPDF oferuje również pokrycie redystrybucji bez opłat licencyjnych za dodatkowe $2,399.

  • Nieprzerwane wsparcie produktu: Dostęp do bieżących aktualizacji produktów, aktualizacji funkcji zabezpieczeń i wsparcia od ich zespołu inżynieryjnego przez $1,199/rok lub jednorazowy zakup $2,399 za ochronę 5-letnią.

  • Iron Suite: Za $1,498 uzyskujesz dostęp do wszystkich produktów Iron Software w tym IronPDF, IronOCR, IronWord, IronXL, IronBarcode, IronQR, IronZIP, IronPrint i IronWebScraper.

Porównanie Licencjonowania IronPDF

Licencjonowanie iText

  • Licencja AGPL: Biblioteka iText Core jest open-source i dostępna dla użytkowników za darmo. Aby korzystać z iText na podstawie tego modelu licencjonowania, użytkownicy muszą przestrzegać jego warunków, a wszelkie modyfikacje dokonane w iText na tej licencji muszą być również wydawane na podstawie modelu licencji AGPL.

  • Licencja komercyjna: iText oferuje model licencjonowania komercyjnego dla programistów, których projekty nie są zgodne z warunkami AGPL, a ceny są zależne od ofert.

Dokumentacja i wsparcie: IronPDF vs. iText

IronPDF

  • Obszerna dokumentacja: Rozbudowana i przyjazna dla użytkownika dokumentacja obejmująca wszystkie funkcje.

  • Wsparcie 24/5: Aktywne wsparcie inżyniera jest dostępne.

  • Samouczki wideo: Krok po kroku przewodniki wideo dostępne na YouTube.

  • Forum społecznościowe: Zaangażowana społeczność do dodatkowego wsparcia.

  • Regularne aktualizacje: Miesięczne aktualizacje produktów z najnowszymi funkcjami i poprawkami zabezpieczeń.

iText

  • Dokumentacja: Szczegółowa dokumentacja obejmująca funkcje oprogramowania iText.

  • Przykłady i samouczki: Samouczki i przykłady kodu dla różnych funkcji.

  • GitHub: Programiści mogą przesyłać wszelkie problemy lub błędy do repozytorium GitHub iText i komunikować się z grupą iText.

  • Aktualizacje: iText oferuje regularne aktualizacje i usprawnienia.

Aby uzyskać więcej szczegółów na temat dokumentacji i wsparcia IronPDF, odwiedź Dokumentację IronPDF oraz Kanał Iron Software na YouTube.

Wnioski

Na polu narzędzi do manipulacji PDF dla .NET, zarówno IronPDF, jak i iText oferują solidne możliwości dostosowane do różnych potrzeb rozwojowych. IronPDF wyróżnia się ze względu na prostą integrację w różnych platformach takich jak .NET Core, Framework i Standard, wraz z kompleksowymi funkcjami, takimi jak konwersja HTML do PDF i zaawansowane opcje bezpieczeństwa. Z drugiej strony, iText, znany z dziedzictwa Java, oferuje potężne narzędzia do generowania i manipulacji PDF zarówno na licencji open-source, jak i komercyjnej, kładąc nacisk na wszechstronność i dostosowywalność.

Wybór między tymi narzędziami finalnie zależy od wymagań projektu, preferencji dotyczących licencjonowania oraz poziomu wymaganego wsparcia technicznego. Niezależnie od wyboru prostoty i elastyczności IronPDF czy rozbudowanego zestawu funkcji otwartej biblioteki PDF, jaką jest iText, programiści mają do dyspozycji ample zasoby do efektywnego usprawnienia przepływów pracy związanych z PDF w swoich aplikacjach.

Możesz wypróbować 30-dniową bezpłatną wersję próbną, aby sprawdzić dostępne funkcje.

Zwróć uwagęiText jest zarejestrowanym znakiem towarowym jego właściciela. Ta strona nie jest powiązana, wspierana ani sponsorowana przez iText. 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.

Jakie są główne różnice między IronPDF a iText?

IronPDF jest chwalony za łatwość obsługi, obszerną dokumentację i solidne wsparcie techniczne, co czyni go przyjazną dla użytkownika opcją dla programistów. iText, choć solidny, często wymaga więcej pracy ręcznej i jest dostępny na licencji open source (AGPL) oraz komercyjnej.

Jakie opcje licencyjne są dostępne dla bibliotek PDF?

IronPDF oferuje różne licencje wieczyste oraz opcję Bez opłat licencyjnych, natomiast iText zapewnia bezpłatną licencję AGPL wraz z opcją komercyjną dla projektów, które nie są zgodne z AGPL.

Która biblioteka PDF oferuje lepsze wsparcie dla programistów?

IronPDF zapewnia obszerną dokumentację, wsparcie inżynierów dostępne 24 godziny na dobę przez 5 dni w tygodniu oraz aktywne forum społecznościowe, gwarantując programistom dostęp do aktualnych zasobów i pomocy.

Czy IronPDF jest kompatybilny z różnymi środowiskami .NET?

Tak, IronPDF jest kompatybilny z .NET Core, .NET Standard i .NET Framework i działa w środowiskach takich jak Windows, Linux, Mac, Docker, Azure i AWS.

W jaki sposób IronPDF obsługuje szyfrowanie plików PDF?

IronPDF oferuje proste API do szyfrowania plików PDF, umożliwiające użytkownikom łatwą edycję metadanych i dostosowywanie ustawień zabezpieczeń, zapewniając bezpieczeństwo dokumentów i zgodność z przepisami.

Czy IronPDF umożliwia konwersję plików DOCX do formatu PDF?

Tak, IronPDF wyróżnia się w konwersji plików DOCX do PDF, oferując bezpośredni i wydajny proces bez konieczności korzystania z zewnętrznych bibliotek, usprawniając zadania związane z konwersją dokumentów w aplikacjach.

Jakie cechy wyróżniają IronPDF w zakresie konwersji HTML do PDF?

IronPDF wykorzystuje ChromePdfRenderer do konwersji HTML na PDF, co pozwala na łatwą integrację HTML, CSS i JavaScript, zapewniając precyzyjne renderowanie treści internetowych do plików PDF.

Jak wypada porównanie IronPDF i iText pod względem kompatybilności międzyplatformowej?

Obie biblioteki obsługują wiele systemów operacyjnych i środowisk, ale IronPDF zapewnia bardziej płynne działanie w przypadku zadań takich jak konwersja HTML do PDF i szyfrowanie plików PDF.

Jakie są kluczowe funkcje oferowane przez IronPDF?

IronPDF oferuje takie funkcje, jak konwersja HTML do PDF, obróbka plików PDF, szyfrowanie i deszyfrowanie, możliwości edycji, dodawanie znaków wodnych, stemplowanie plików PDF oraz podpisywanie cyfrowe.

Curtis Chau
Autor tekstów technicznych

Curtis Chau posiada tytuł licencjata z informatyki (Uniwersytet Carleton) i specjalizuje się w front-endowym rozwoju, z ekspertką w Node.js, TypeScript, JavaScript i React. Pasjonuje się tworzeniem intuicyjnych i estetycznie przyjemnych interfejsów użytkownika, Curtis cieszy się pracą z nowoczesnymi frameworkami i tworzeniem dobrze zorganizowanych, atrakcyjnych wizualnie podrę...

Czytaj więcej
iText Logo

Zmęczony drogimi odnowieniami i przestarzałymi aktualizacjami produktów?

Dokonaj łatwego przejścia z iText z naszym wsparciem inżynierskim na rzecz migracji i lepszego dealu.

IronPDF Logo

Zespol wsparcia Iron

Jestesmy online 24 godziny, 5 dni w tygodniu.
Czat
Email
Zadzwon do mnie