产品比较 IronPDF 与 ITextPDF 的比较 Curtis Chau 已更新:七月 28, 2025 Download IronPDF NuGet 下载 DLL 下载 Windows 安装程序 Start Free Trial Copy for LLMs Copy for LLMs Copy page as Markdown for LLMs Open in ChatGPT Ask ChatGPT about this page Open in Gemini Ask Gemini about this page Open in Grok Ask Grok about this page Open in Perplexity Ask Perplexity about this page Share Share on Facebook Share on X (Twitter) Share on LinkedIn Copy URL Email article 对于处理PDF的开发人员来说,拥有一个可靠的PDF生成和操作库至关重要。 In the .NET ecosystem, two popular PDF libraries stand out – IronPDF and iTextPdf – each offering powerful tools to create, edit, and manage PDF documents. 本文根据功能能力、文档质量和定价政策对这些库进行深入对比。 IronPDF和iTextPdf概述 IronPDF。 IronPDF是一个用于PDF管理的强大.NET库,兼容各种.NET环境(Core 8, 7, 6, Framework 等)。 它提供了全面的功能集,包括HTML到PDF转换、合并PDF、加密和数字签名。 IronPDF的文档简单明了,用户可以获得可靠的技术支持。 开发人员通常可以通过Stack Overflow讨论和其他源代码共享平台找到常见问题的解决方案。 iTextPdf iTextPdf是来自iText库的一种高级PDF库,适用于Java和.NET (C#),专注于企业级文件处理。 它提供AGPL和商业许可证,可以灵活应用于各种项目。 像iTextPdf这样的iText软件高度可定制,非常适合用于文件加密、数字签名和表单创建等复杂的PDF任务。 跨平台兼容性 IronPDF和iTextPdf都支持跨平台功能,使得它们在.NET内的各种应用需求中都具有灵活性。 以下是每个库兼容性的概述。 IronPDF。 .NET版本:兼容.NET Core (8, 7, 6, 5, 3.1+)、.NET Standard (2.0+)和.NET Framework (4.6.2+)。 应用环境:在Windows、Linux、Mac、Docker、Azure和AWS环境中无缝工作。 支持的IDE:兼容Microsoft Visual Studio和JetBrains Rider & ReSharper。 操作系统和处理器:支持Windows, Mac, Linux, x64, x86, ARM。 iTextPdf .NET版本:支持.NET Core (2.x, 3.x)、.NET Framework (4.6.1+)和.NET 5+。 应用环境:兼容Windows, macOS, Linux和Docker。 关键功能比较: IronPDF vs. iTextPdf 以下是每个库提供的关键功能的详细比较。 IronPDF。 HTML到PDF转换:支持HTML、CSS、JavaScript和图像。 PDF操作:拆分、合并和编辑PDF文档。 安全:具有PDF加密和解密功能。 编辑:允许添加注释、书签和大纲。 模板:应用页眉、页脚和页码。 水印:使用HTML/CSS进行文本和图像水印的控制。 PDF 盖章:在PDF文件上添加图像和文本盖章。 有关IronPDF 提供的丰富功能集的更多信息,请访问IronPDF 功能页面。 iTextPdf PDF创建:支持从头创建PDF文档。 表单:提供PDF表单的创建和编辑功能。 数字签名:签署PDF文档。 压缩:优化PDF文件大小。 内容提取:从PDF中提取文本和图像。 可定制性:高度可定制,适合复杂项目。 PDF功能比较:IronPDF与iTextPdf HTML 到 PDF 转换 两个库都支持HTML到PDF的转换,尽管它们在方法和易用性上有所不同。 IronPDF using IronPdf; // Instantiate the renderer var renderer = new ChromePdfRenderer(); // Create a PDF from an HTML string var pdf = renderer.RenderHtmlAsPdf("<h1>Hello World</h1>"); pdf.SaveAs("output.pdf"); // Advanced example with external assets var myAdvancedPdf = renderer.RenderHtmlAsPdf("<img src='icons/iron.png'>", @"C:\site\assets\"); myAdvancedPdf.SaveAs("html-with-assets.pdf"); using IronPdf; // Instantiate the renderer var renderer = new ChromePdfRenderer(); // Create a PDF from an HTML string var pdf = renderer.RenderHtmlAsPdf("<h1>Hello World</h1>"); pdf.SaveAs("output.pdf"); // Advanced example with external assets var myAdvancedPdf = renderer.RenderHtmlAsPdf("<img src='icons/iron.png'>", @"C:\site\assets\"); myAdvancedPdf.SaveAs("html-with-assets.pdf"); Imports IronPdf ' Instantiate the renderer Private renderer = New ChromePdfRenderer() ' Create a PDF from an HTML string Private pdf = renderer.RenderHtmlAsPdf("<h1>Hello World</h1>") pdf.SaveAs("output.pdf") ' Advanced example with external assets Dim myAdvancedPdf = renderer.RenderHtmlAsPdf("<img src='icons/iron.png'>", "C:\site\assets\") myAdvancedPdf.SaveAs("html-with-assets.pdf") $vbLabelText $csharpLabel iTextPdf using iText.Html2pdf; using System.IO; public class HtmlToPdf { public static void ConvertHtmlToPdf() { 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; using System.IO; public class HtmlToPdf { public static void ConvertHtmlToPdf() { 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 Imports System.IO Public Class HtmlToPdf Public Shared Sub ConvertHtmlToPdf() 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 End Class $vbLabelText $csharpLabel IronPDF提供了一种直接的HTML到PDF转换方法,包括对HTML、CSS和JavaScript的支持。 它允许用户直接从HTML字符串进行转换或在可选的基础路径下包含资源。 iTextPdf,虽然有效,但需要更多的设置,更专注于基于文件的转换。 加密PDF文件 在高度重视安全的情况下,加密是必需的。 以下是每个库处理这种情况的方法。 IronPDF using IronPdf; // Load an encrypted PDF or create a new one var pdf = PdfDocument.FromFile("encrypted.pdf", "password"); // Set document security settings pdf.SecuritySettings.MakePdfDocumentReadOnly("secret-key"); pdf.SecuritySettings.AllowUserCopyPasteContent = false; pdf.Password = "my-password"; pdf.SaveAs("secured.pdf"); using IronPdf; // Load an encrypted PDF or create a new one var pdf = PdfDocument.FromFile("encrypted.pdf", "password"); // Set document security settings pdf.SecuritySettings.MakePdfDocumentReadOnly("secret-key"); pdf.SecuritySettings.AllowUserCopyPasteContent = false; pdf.Password = "my-password"; pdf.SaveAs("secured.pdf"); Imports IronPdf ' Load an encrypted PDF or create a new one Private pdf = PdfDocument.FromFile("encrypted.pdf", "password") ' Set document security settings pdf.SecuritySettings.MakePdfDocumentReadOnly("secret-key") pdf.SecuritySettings.AllowUserCopyPasteContent = False pdf.Password = "my-password" pdf.SaveAs("secured.pdf") $vbLabelText $csharpLabel iTextPdf using iText.Kernel.Pdf; using System.Text; public class EncryptPdf { public static readonly string DEST = "encrypt_pdf.pdf"; public static readonly string OWNER_PASSWORD = "World"; public static readonly string USER_PASSWORD = "Hello"; protected void ManipulatePdf(string dest) { PdfDocument document = new PdfDocument(new PdfReader("input.pdf"), new PdfWriter(dest, new WriterProperties().SetStandardEncryption( Encoding.UTF8.GetBytes(USER_PASSWORD), Encoding.UTF8.GetBytes(OWNER_PASSWORD), EncryptionConstants.ALLOW_PRINTING, EncryptionConstants.ENCRYPTION_AES_128))); document.Close(); } } using iText.Kernel.Pdf; using System.Text; public class EncryptPdf { public static readonly string DEST = "encrypt_pdf.pdf"; public static readonly string OWNER_PASSWORD = "World"; public static readonly string USER_PASSWORD = "Hello"; protected void ManipulatePdf(string dest) { PdfDocument document = new PdfDocument(new PdfReader("input.pdf"), new PdfWriter(dest, new WriterProperties().SetStandardEncryption( Encoding.UTF8.GetBytes(USER_PASSWORD), Encoding.UTF8.GetBytes(OWNER_PASSWORD), EncryptionConstants.ALLOW_PRINTING, EncryptionConstants.ENCRYPTION_AES_128))); document.Close(); } } Imports iText.Kernel.Pdf Imports System.Text Public Class EncryptPdf Public Shared ReadOnly DEST As String = "encrypt_pdf.pdf" Public Shared ReadOnly OWNER_PASSWORD As String = "World" Public Shared ReadOnly USER_PASSWORD As String = "Hello" Protected Sub ManipulatePdf(ByVal dest As String) Dim document As New PdfDocument(New PdfReader("input.pdf"), New PdfWriter(dest, (New WriterProperties()).SetStandardEncryption(Encoding.UTF8.GetBytes(USER_PASSWORD), Encoding.UTF8.GetBytes(OWNER_PASSWORD), EncryptionConstants.ALLOW_PRINTING, EncryptionConstants.ENCRYPTION_AES_128))) document.Close() End Sub End Class $vbLabelText $csharpLabel IronPDF的方法更加用户友好,提供简单的加密和对文档权限的控制。 iTextPdf虽然有效,但需要详细的设置,着重于加密标准。 编辑 PDF 内容 在PDF文件中遮盖信息对于隐私和安全至关重要。 以下是每个库支持此功能的方法。 IronPDF using IronPdf; PdfDocument pdf = PdfDocument.FromFile("novel.pdf"); // Redact 'are' from all pages pdf.RedactTextOnAllPages("are"); pdf.SaveAs("redacted.pdf"); using IronPdf; PdfDocument pdf = PdfDocument.FromFile("novel.pdf"); // Redact 'are' from all pages pdf.RedactTextOnAllPages("are"); pdf.SaveAs("redacted.pdf"); Imports IronPdf Private pdf As PdfDocument = PdfDocument.FromFile("novel.pdf") ' Redact 'are' from all pages pdf.RedactTextOnAllPages("are") pdf.SaveAs("redacted.pdf") $vbLabelText $csharpLabel iTextPdf using iText.Kernel.Pdf; using iText.Kernel.Colors; // Define areas to redact on each page Rectangle[] rectanglesToRedact = { new Rectangle(100, 100, 200, 50) }; // Draw black rectangles to cover sensitive areas using (PdfDocument pdfDoc = new PdfDocument(new PdfReader("input.pdf"), new PdfWriter("output_redacted.pdf"))) { for (int pageNum = 1; pageNum <= pdfDoc.GetNumberOfPages(); pageNum++) { PdfPage page = pdfDoc.GetPage(pageNum); PdfCanvas canvas = new PdfCanvas(page); foreach (Rectangle rect in rectanglesToRedact) { canvas.SetFillColor(ColorConstants.BLACK) .Rectangle(rect.GetX(), rect.GetY(), rect.GetWidth(), rect.GetHeight()) .Fill(); } } } using iText.Kernel.Pdf; using iText.Kernel.Colors; // Define areas to redact on each page Rectangle[] rectanglesToRedact = { new Rectangle(100, 100, 200, 50) }; // Draw black rectangles to cover sensitive areas using (PdfDocument pdfDoc = new PdfDocument(new PdfReader("input.pdf"), new PdfWriter("output_redacted.pdf"))) { for (int pageNum = 1; pageNum <= pdfDoc.GetNumberOfPages(); pageNum++) { PdfPage page = pdfDoc.GetPage(pageNum); PdfCanvas canvas = new PdfCanvas(page); foreach (Rectangle rect in rectanglesToRedact) { canvas.SetFillColor(ColorConstants.BLACK) .Rectangle(rect.GetX(), rect.GetY(), rect.GetWidth(), rect.GetHeight()) .Fill(); } } } Imports iText.Kernel.Pdf Imports iText.Kernel.Colors ' Define areas to redact on each page Private rectanglesToRedact() As Rectangle = { New Rectangle(100, 100, 200, 50) } ' Draw black rectangles to cover sensitive areas Using pdfDoc As New PdfDocument(New PdfReader("input.pdf"), New PdfWriter("output_redacted.pdf")) Dim pageNum As Integer = 1 Do While pageNum <= pdfDoc.GetNumberOfPages() Dim page As PdfPage = pdfDoc.GetPage(pageNum) Dim canvas As New PdfCanvas(page) 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 $vbLabelText $csharpLabel IronPDF提供了便捷的遮盖工具,可轻松隐藏所有页面上的敏感文本。 相比之下,iTextPdf要求用户手动定义和应用黑色矩形来覆盖敏感区域。 签名PDF文件 自动化PDF文档的签名可以显著节省时间。以下是IronPDF和iTextPdf如何处理数字签名的对比。 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 iTextPdf 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 当涉及到对PDF文件应用数字签名时,IronPDF提供了一种用X509证书实现这一目标的简单高效的方法。 它的API简化了这一过程,使其可以轻松集成到工作流中而不会牺牲对签名安全性的控制。 相比之下,iTextPDF的文件签名流程设置更复杂,但提供了更多的自定义选项。 开发人员可以获得更细致的控制,尽管在浏览iTextPDF的签名配置和证书处理时可能面临较大的学习曲线。 在PDF文件中应用水印 在PDF上添加水印对于品牌化、机密性和版权保护可能是必要的。 以下是IronPDF和iTextPDF应用水印到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 iTextPdf 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 IronPDF的API快速而直观,支持使用HTML和CSS进行自定义,水印应用。 这种方法用户友好,使其更容易创建视觉上不同的水印而无需广泛设置。iTextPDF另一方面,通过其更详细的配置选项允许高度可定制的水印放置,尽管这需要更多的编码工作。 在PDF上盖章图像和文本 在PDF上进行内容盖章类似于应用水印,但更注重添加特定元素,如图像或文本,用于标记或品牌化目的。 以下是IronPDF和iTextPDF如何执行该任务。 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 iTextPdf 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的图像和文本盖章方法快速而多功能,使开发人员可以轻松地在PDF页面上添加品牌内容或标签。 API利用熟悉的HTML/CSS样式元素,使自定义变得简单。 iTextPDF也提供图像和文本盖章功能,但其配置需要更多手动设置和对PDF布局结构的工作知识。 在PDF页面上直接操控和样式化内容的能力为开发人员提供了强大的盖章工具,尽管iTextPDF的设置可能需要更多的努力。 将 DOCX 转换为 PDF 在一些项目中,将DOCX文件转为PDF格式是必要的。 以下是IronPDF和iText如何处理这个任务的比较,强调了它们的不同之处。 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 iTextPDF 与IronPDF不同,iTextPDF没有内置支持将DOCX转换为PDF。 为了进行这种转换,开发人员必须依靠第三方库,如DocX或Aspose.Words,首先将DOCX文件转换为PDF兼容格式,然后可以使用iTextPDF进行处理或修改。 IronPDF提供了一个简单的内置解决方案,用于DOCX到PDF转换,无需额外库。 这使得它非常适合那些需要快速和集成方法的开发人员。 相比之下,iTextPDF依赖外部库来转换DOCX文件,需要额外的设置和依赖项,这可能会增加项目的复杂性。 支持 Bootstrap 和现代 CSS 框架 当从Bootstrap样式的Web应用程序生成PDF时,完整框架支持确保设计一致性,无需并行CSS文件或布局修改。 IronPDF。: Complete Bootstrap Framework Support IronPDF 的 Chromium 引擎提供完整支持: Bootstrap 5:全 flexbox 布局,CSS Grid,实用类,所有组件 Bootstrap 4:完整的卡片系统、导航、flex 实用程序、响应式设计 Tailwind CSS:全实用程序类,具有浏览器的准确渲染 Foundation:完整的网格系统和组件库 现代 CSS3:Flexbox、CSS 网格、自定义属性、动画、过渡 Real-world validation: IronPDF renders the Bootstrap homepage and all official examples with pixel-perfect accuracy. iTextPDF:有限的Bootstrap支持 iTextPDF使用pdfHTML与选择性的CSS3支持: 有限的flexbox支持:在版本7.1.15中添加但不完整 无CSS网格:基于网格的Bootstrap布局不支持 Bootstrap 3限制:现代Bootstrap 4/5组件需要解决方案 手动布局转换:复杂布局通常需要特定于PDF的代码 iTextPDF的文档明确指出高级CSS功能可能无法如预期呈现,需要开发人员测试每个Bootstrap组件并常常创建简化的布局。 开发影响:团队必须维护用于PDF生成的单独布局代码,或大量测试和修改Bootstrap组件,从而增加开发时间并减少设计一致性。 有关全面的 Bootstrap 框架指南和 CSS3 渲染功能,请参阅 Bootstrap & Flexbox CSS 指南。 代码示例比较总结 有关更多详细示例,请访问IronPDF示例。 定价和许可:IronPDF与iTextPdf库 IronPDF。 Pricing and Licensing IronPDF拥有不同级别和附加功能的许可证购买选项。 开发人员还可以购买Iron Suite,该套件让您以两件购买价格访问IronSoftware的所有产品。 如果您还没有准备好购买许可证,IronPDF提供了免费试用。 永久许可证:根据您的团队规模、项目需求和地点数量提供一系列永久许可证。 每种许可证类型都配有电子邮件支持。 Lite许可证:此许可证费用为$799,支持一名开发人员、一个地点和一个项目。 Plus许可证:支持三名开发人员、三个地点和三个项目,这是从Lite许可证的下一步,费用是$1,199。 Plus许可证除了电子邮件支持外,还提供聊天支持和电话支持。 专业许可证:适用于较大团队的许可证,支持十名开发人员、十个地点和十个项目,费用是$2,399。 该许可证提供与之前的层级相同的联系方式支持渠道,并额外支持屏幕共享。 免版税再分发: IronPDF 还提供免版税再分发保障,额外收费为 $2,399。 连续产品支持:IronPDF提供持续的产品更新、安全功能升级以及来自其工程团队的支持,费用为$999/年或一次性购买$1,999即可获得5年覆盖。 Iron Suite:费用$1,498,您可以访问包括IronPDF、IronOCR、IronWord、IronXL、IronBarcode、IronQR、IronZIP、IronPrint和IronWebScraper在内的所有Iron Software产品。 iTextPDF 许可证 AGPL许可证:iTextPDF核心库是根据AGPL许可证开源的,在符合条件的情况下可免费使用。 开发人员必须在相同许可证下发布任何修改。 商业许可证:对于不满足AGPL条件的开发人员,iTextPDF通过基于报价的模型提供商业许可。 文档和支持:IronPDF与iTextPdf IronPDF。 全面的文档:涵盖所有功能的广泛且用户友好的文档。 24/5支持:活跃的工程师支持。 视频教程:在YouTube上提供逐步视频指南。 社区论坛:活跃的社区提供额外支持。 定期更新:每月产品更新以确保最新的功能和安全漏洞修复。 iTextPDF iTextPDF提供了适用于其广泛功能集的强大文档和支持。 文档:iText PDF文档完整涵盖可用的功能。 示例和教程:代码示例和教程帮助开发人员入门。 GitHub 社区:开发人员可以报告问题,提交拉取请求并与iTextPDF团队互动。 定期更新:iTextPDF提供频繁的产品更新和改进。 For more details on IronPDF documentation and support, visit the IronPDF Documentation and the IronSoftware YouTube Channel. 结论 在.net的PDF操作工具领域,IronPDF和iTextPDF都为开发人员提供了强大的解决方案。 IronPDF因其简单的.NET平台集成和用户友好的功能(如无外部依赖的DOCX到PDF转换)而脱颖而出。 与之不同的是,iTextPDF因其多功能性和丰富的功能集而闻名,尤其是与其他工具结合使用时,尽管DOCX转换需要额外的依赖。 最终,选择IronPDF还是iTextPDF将取决于项目的具体需求、许可偏好和所需的支持水平。 两个库都提供了可靠的方法来简化.NET应用程序中的PDF工作流程。 [{i:(iTextPDF是其各自所有者的注册商标。 本网站与iTextPDF无关联、无赞助或认可。 所有产品名称、徽标和品牌均为其各自所有者的财产。 比较仅供参考,反映的是撰写时的公开信息。] 常见问题解答 如何在C#中将HTML转换为PDF? 你可以使用IronPDF的RenderHtmlAsPdf方法将HTML字符串转换为PDF。你还可以使用RenderHtmlFileAsPdf将HTML文件转换为PDF。 IronPDF 在 PDF 创建和操作方面提供了哪些功能? IronPDF 提供了 HTML 到 PDF 转换、PDF 合并、加密、数字签名、添加水印和 DOCX 至 PDF 转换等功能。 IronPDF 如何简化 PDF 签名? IronPDF 允许您使用 X509 证书为 PDF 文件应用数字签名,提供了一种简单的方法来保护您的文档。 IronPDF 可以在不同的操作系统上使用吗? 是的,IronPDF 支持跨平台兼容性。它可以在 Windows、Linux 和 Mac 上无缝运行,并兼容 .NET Core、.NET Standard 和 .NET Framework。 iTextPDF 在文档加密方面与 IronPDF 有何不同? 尽管 iTextPDF 提供加密标准的详细设置,IronPDF 则简化了这一过程,通过内置的加密方法,容易实现。 对于 IronPDF 用户有哪些支持资源可用? IronPDF 提供了广泛的支持,包括全面的文档、视频教程、社区论坛和 24/5 工程师支持。 IronPDF 如何处理 DOCX 到 PDF 的转换? IronPDF 包含本地 DOCX 转 PDF 转换功能,允许无缝集成,无需附加库。 IronPDF有哪些许可选项? IronPDF 提供不同层级的永久许可证,例如 Lite、Plus 和 Professional,以及免版税重新分发和持续产品支持的选项。 如何使用 IronPDF 对 PDF 应用水印? IronPDF 允许您使用 HTML 和 CSS 轻松应用水印,使您可以快速添加文本或图像水印,并根据需要进行自定义。 是什么让 IronPDF 适合与 .NET 应用程序配合的开发人员? IronPDF 设计为用户友好,并具有简化的 API,使其在 HTML 到 PDF 转换、加密和数字签名等任务中高效,非常适合 .NET 开发人员。 Curtis Chau 立即与工程团队聊天 技术作家 Curtis Chau 拥有卡尔顿大学的计算机科学学士学位,专注于前端开发,精通 Node.js、TypeScript、JavaScript 和 React。他热衷于打造直观且美观的用户界面,喜欢使用现代框架并创建结构良好、视觉吸引力强的手册。除了开发之外,Curtis 对物联网 (IoT) 有浓厚的兴趣,探索将硬件和软件集成的新方法。在空闲时间,他喜欢玩游戏和构建 Discord 机器人,将他对技术的热爱与创造力相结合。 相关文章 已发布十一月 13, 2025 比较 C# HTML 到 PDF 开源与 IronPDF 比较开源 HTML 到 PDF 库与 IronPDF for C#。发现哪个解决方案为您的 .NET 项目提供最佳的 PDF 生成能力。 阅读更多 已发布十月 27, 2025 哪种 ASP.NET Core PDF 库性价比最高? 发现适合ASP.NET Core应用程序的最佳PDF库。比较IronPDF的Chrome引擎与Aspose和Syncfusion的替代品。 阅读更多 已发布十月 27, 2025 如何使用 Aspose C# 与 IronPDF 创作 PDF 通过此逐步指南,学习如何使用 Aspose C# 与 IronPDF 创建 PDF,专为开发人员设计。 阅读更多 IronPDF与PDFreactor的比较IronPDF 与 GemBox.Pdf:完整的 ...
已发布十一月 13, 2025 比较 C# HTML 到 PDF 开源与 IronPDF 比较开源 HTML 到 PDF 库与 IronPDF for C#。发现哪个解决方案为您的 .NET 项目提供最佳的 PDF 生成能力。 阅读更多
已发布十月 27, 2025 哪种 ASP.NET Core PDF 库性价比最高? 发现适合ASP.NET Core应用程序的最佳PDF库。比较IronPDF的Chrome引擎与Aspose和Syncfusion的替代品。 阅读更多
已发布十月 27, 2025 如何使用 Aspose C# 与 IronPDF 创作 PDF 通过此逐步指南,学习如何使用 Aspose C# 与 IronPDF 创建 PDF,专为开发人员设计。 阅读更多