如何用 C# 用響應式 CSS 將 HTML 轉換為 PDF
雖然ComPDFKit提供穩固的PDF操作功能,但有許多因素使開發團隊考慮更成熟的替代方案。
市場成熟度與生態系統比較
ComPDFKit面臨於新進市場參與者通常會遇到的挑戰:文件空缺、較小的社群,及有限的Stack Overflow涵蓋範圍。 IronPDF經過十年的改進,提供企業專案所需的穩定性和資源。
| 方面 | ComPDFKit | IronPDF |
|---|---|---|
| HTML到PDF | 需要手動HTML解析 | 原生Chromium渲染 |
| 市場成熟度 | 較新的參與者 | 10年以上,經過考驗 |
| 社群規模 | 較小,有限的Stack Overflow | 大型、活躍的社群 |
| 文件 | 一些空缺 | 廣泛的教程與指南 |
| 下載次數 | 正在增長 | 超過1,000萬次NuGet下載 |
| API風格 | 受到C++影響,冗長 | 現代的 .NET 流利API |
| 記憶體管理 | 手動Release()呼叫 |
自動GC處理 |
功能對等
兩個程式庫都支援全面的PDF功能:
| 功能 | ComPDFKit | IronPDF |
|---|---|---|
| HTML轉PDF | 基礎/手動 | ✅ 原生Chromium |
| URL到PDF | 手動實現 | ✅ 內建 |
| 從頭建立PDF | ✅ | ✅ |
| PDF編輯 | ✅ | ✅ |
| 文字提取 | ✅ | ✅ |
| 合併/分割 | ✅ | ✅ |
| 數位簽名 | ✅ | ✅ |
| 表單填寫 | ✅ | ✅ |
| 浮水印 | ✅ | ✅ |
| 跨平台 | Windows、Linux、macOS | Windows、Linux、macOS |
主要遷移利益
- 更優秀的HTML渲染:IronPDF的Chromium引擎能夠原生處理現代CSS3、JavaScript和響應式佈局
- 成熟的生態系統:超過10年的改進,廣泛的文件資料,並經過考驗的穩定性
- 更簡單的API:更少樣板程式碼,無需手動記憶體管理與
Release()呼叫 - 更好的 .NET整合:原生async/await、LINQ支持、流利的介面
- 豐富的資源:成千上萬的Stack Overflow答案和社群範例
遷移前準備
前提條件
確保您的環境符合以下要求:
- .NET Framework 4.6.2+ or .NET Core 3.1 / .NET 5-9
- Visual Studio 2019+或VS Code與C#擴展
- NuGet包管理器存取 -IronPDF許可證金鑰(免費試用可在 ironpdf.com 獲得)
審核ComPDFKit使用情形
在您的解決方案目錄中執行這些指令,以識別所有ComPDFKit的參考資料:
# Find allComPDFKitusages in your codebase
grep -r "using ComPDFKit" --include="*.cs" .
grep -r "CPDFDocument\|CPDFPage\|CPDFAnnotation" --include="*.cs" .
# Find NuGet package references
grep -r "ComPDFKit" --include="*.csproj" .
# Find allComPDFKitusages in your codebase
grep -r "using ComPDFKit" --include="*.cs" .
grep -r "CPDFDocument\|CPDFPage\|CPDFAnnotation" --include="*.cs" .
# Find NuGet package references
grep -r "ComPDFKit" --include="*.csproj" .
預期的中斷變更
| 更改 | ComPDFKit | IronPDF | 影響 |
|---|---|---|---|
| 文件載入 | CPDFDocument.InitWithFilePath() |
PdfDocument.FromFile() |
方法名稱變更 |
| 保存 | document.WriteToFilePath() |
pdf.SaveAs() |
方法名稱變更 |
| 記憶體清理 | 需要document.Release() |
自動(GC) | 移除手動清理 |
| 頁面存取 | document.PageAtIndex(i) |
pdf.Pages[i] |
陣列樣式存取 |
| 頁面索引 | 0起始基數 | 0起始基數 | 不需要變更 |
| HTML 渲染 | 手動實現 | RenderHtmlAsPdf() |
主要簡化 |
| 文字提取 | textPage.GetText() |
pdf.ExtractAllText() |
簡化的API |
逐步遷移過程
步驟1:更新NuGet包
移除ComPDFKit套件並安裝IronPDF:
# RemoveComPDFKitpackages
dotnet remove package ComPDFKit.NetCore
dotnet remove package ComPDFKit.NetFramework
# Install IronPDF
dotnet add package IronPdf
# RemoveComPDFKitpackages
dotnet remove package ComPDFKit.NetCore
dotnet remove package ComPDFKit.NetFramework
# Install IronPDF
dotnet add package IronPdf
步驟 2:更新命名空間引用
將ComPDFKit命名空間替換為IronPDF:
// Remove these
using ComPDFKit.PDFDocument;
using ComPDFKit.PDFPage;
using ComPDFKit.PDFAnnotation;
using ComPDFKit.Import;
// Add this
using IronPdf;
// Remove these
using ComPDFKit.PDFDocument;
using ComPDFKit.PDFPage;
using ComPDFKit.PDFAnnotation;
using ComPDFKit.Import;
// Add this
using IronPdf;
Imports IronPdf
步驟3:配置授權
// Add at application startup (Program.cs or Global.asax)
IronPdf.License.LicenseKey = "YOUR-LICENSE-KEY";
// Add at application startup (Program.cs or Global.asax)
IronPdf.License.LicenseKey = "YOUR-LICENSE-KEY";
' Add at application startup (Program.vb or Global.asax)
IronPdf.License.LicenseKey = "YOUR-LICENSE-KEY"
完整 API 遷移參考
文件操作
| 任務 | ComPDFKit | IronPDF |
|---|---|---|
| 建立空文件 | CPDFDocument.CreateDocument() |
new PdfDocument() |
| 從檔案載入 | CPDFDocument.InitWithFilePath(path) |
PdfDocument.FromFile(path) |
| 從流載入 | CPDFDocument.InitWithStream(stream) |
PdfDocument.FromStream(stream) |
| 保存到檔案 | document.WriteToFilePath(path) |
pdf.SaveAs(path) |
| 獲取頁數 | document.PageCount |
pdf.PageCount |
| 釋放/處置 | document.Release() |
不需要 |
HTML到PDF轉換
| 任務 | ComPDFKit | IronPDF |
|---|---|---|
| HTML字串轉PDF | 需要手動實現 | renderer.RenderHtmlAsPdf(html) |
| HTML文件轉PDF | 需要手動實現 | renderer.RenderHtmlFileAsPdf(path) |
| URL到PDF | 需要手動實現 | renderer.RenderUrlAsPdf(url) |
| 設定頁面大小 | 透過頁面建立參數 | renderer.RenderingOptions.PaperSize |
| 設定邊距 | 透過編輯器配置 | renderer.RenderingOptions.MarginTop等 |
合併和分割操作
| 任務 | ComPDFKit | IronPDF |
|---|---|---|
| 合併文件 | doc1.ImportPagesAtIndex(doc2, range, index) |
PdfDocument.Merge(pdf1, pdf2) |
| 分割文件 | 提取頁面到新文件 | pdf.CopyPages(start, end) |
程式碼遷移範例
HTML到PDF轉換
ComPDFKit與IronPDF之間最大的不同在於HTML渲染。 ComPDFKit需要手動文字放置,而IronPDF利用其Chromium引擎原生進行HTML渲染。
ComPDFKit實現:
// NuGet: Install-Package ComPDFKit.NetCore
using ComPDFKit.PDFDocument;
using System;
class Program
{
static void Main()
{
// ComPDFKit's .NET SDK has no native HTML-to-PDF rendering.
// The closest equivalent is to create a blank document and lay
// out primitives manually, or call ComPDFKit's separate cloud
// Conversion API (a different SKU).
var document = CPDFDocument.CreateDocument();
document.InsertPage(0, 595, 842, string.Empty);
document.WriteToFilePath("output.pdf");
document.Release();
}
}
// NuGet: Install-Package ComPDFKit.NetCore
using ComPDFKit.PDFDocument;
using System;
class Program
{
static void Main()
{
// ComPDFKit's .NET SDK has no native HTML-to-PDF rendering.
// The closest equivalent is to create a blank document and lay
// out primitives manually, or call ComPDFKit's separate cloud
// Conversion API (a different SKU).
var document = CPDFDocument.CreateDocument();
document.InsertPage(0, 595, 842, string.Empty);
document.WriteToFilePath("output.pdf");
document.Release();
}
}
Imports ComPDFKit.PDFDocument
Imports System
Module Program
Sub Main()
' ComPDFKit's .NET SDK has no native HTML-to-PDF rendering.
' The closest equivalent is to create a blank document and lay
' out primitives manually, or call ComPDFKit's separate cloud
' Conversion API (a different SKU).
Dim document = CPDFDocument.CreateDocument()
document.InsertPage(0, 595, 842, String.Empty)
document.WriteToFilePath("output.pdf")
document.Release()
End Sub
End Module
IronPDF實現:
// NuGet: Install-Package IronPdf
using IronPdf;
using System;
class Program
{
static void Main()
{
var renderer = new ChromePdfRenderer();
var pdf = renderer.RenderHtmlAsPdf("<h1>Hello World</h1><p>This is HTML content.</p>");
pdf.SaveAs("output.pdf");
}
}
// NuGet: Install-Package IronPdf
using IronPdf;
using System;
class Program
{
static void Main()
{
var renderer = new ChromePdfRenderer();
var pdf = renderer.RenderHtmlAsPdf("<h1>Hello World</h1><p>This is HTML content.</p>");
pdf.SaveAs("output.pdf");
}
}
Imports IronPdf
Imports System
Class Program
Shared Sub Main()
Dim renderer = New ChromePdfRenderer()
Dim pdf = renderer.RenderHtmlAsPdf("<h1>Hello World</h1><p>This is HTML content.</p>")
pdf.SaveAs("output.pdf")
End Sub
End Class
IronPDF的ChromePdfRenderer消除了手動文字定位和編輯器管理的需求。 欲了解更多HTML轉換選項,請參閱 HTML到PDF文件。
合併多個 PDF
ComPDFKit實現:
// NuGet: Install-Package ComPDFKit.NetCore
using ComPDFKit.PDFDocument;
using ComPDFKit.Import;
using System;
class Program
{
static void Main()
{
var document1 = CPDFDocument.InitWithFilePath("file1.pdf");
var document2 = CPDFDocument.InitWithFilePath("file2.pdf");
// Import pages from document2 into document1
document1.ImportPagesAtIndex(document2, "0-" + (document2.PageCount - 1), document1.PageCount);
document1.WriteToFilePath("merged.pdf");
document1.Release();
document2.Release();
}
}
// NuGet: Install-Package ComPDFKit.NetCore
using ComPDFKit.PDFDocument;
using ComPDFKit.Import;
using System;
class Program
{
static void Main()
{
var document1 = CPDFDocument.InitWithFilePath("file1.pdf");
var document2 = CPDFDocument.InitWithFilePath("file2.pdf");
// Import pages from document2 into document1
document1.ImportPagesAtIndex(document2, "0-" + (document2.PageCount - 1), document1.PageCount);
document1.WriteToFilePath("merged.pdf");
document1.Release();
document2.Release();
}
}
Imports ComPDFKit.PDFDocument
Imports ComPDFKit.Import
Imports System
Module Program
Sub Main()
Dim document1 = CPDFDocument.InitWithFilePath("file1.pdf")
Dim document2 = CPDFDocument.InitWithFilePath("file2.pdf")
' Import pages from document2 into document1
document1.ImportPagesAtIndex(document2, "0-" & (document2.PageCount - 1), document1.PageCount)
document1.WriteToFilePath("merged.pdf")
document1.Release()
document2.Release()
End Sub
End Module
IronPDF實現:
// NuGet: Install-Package IronPdf
using IronPdf;
using System;
using System.Collections.Generic;
class Program
{
static void Main()
{
var pdf1 = PdfDocument.FromFile("file1.pdf");
var pdf2 = PdfDocument.FromFile("file2.pdf");
var merged = PdfDocument.Merge(new List<PdfDocument> { pdf1, pdf2 });
merged.SaveAs("merged.pdf");
}
}
// NuGet: Install-Package IronPdf
using IronPdf;
using System;
using System.Collections.Generic;
class Program
{
static void Main()
{
var pdf1 = PdfDocument.FromFile("file1.pdf");
var pdf2 = PdfDocument.FromFile("file2.pdf");
var merged = PdfDocument.Merge(new List<PdfDocument> { pdf1, pdf2 });
merged.SaveAs("merged.pdf");
}
}
Imports IronPdf
Imports System
Imports System.Collections.Generic
Module Program
Sub Main()
Dim pdf1 = PdfDocument.FromFile("file1.pdf")
Dim pdf2 = PdfDocument.FromFile("file2.pdf")
Dim merged = PdfDocument.Merge(New List(Of PdfDocument) From {pdf1, pdf2})
merged.SaveAs("merged.pdf")
End Sub
End Module
IronPDF的靜態ImportPagesAtIndex模式冗長。 欲了解更多選項,請參閱 PDF合併文件。
新增水印
浮水印顯示出ComPDFKit的屬性驅動CPDFWatermark配置與IronPDF的基於HTML的樣式的不同。
ComPDFKit實現:
// NuGet: Install-Package ComPDFKit.NetCore
using ComPDFKit.PDFDocument;
using ComPDFKit.PDFWatermark;
using System;
class Program
{
static void Main()
{
var document = CPDFDocument.InitWithFilePath("input.pdf");
CPDFWatermark watermark = document.InitWatermark(
C_Watermark_Type.WATERMARK_TYPE_TEXT);
watermark.SetText("CONFIDENTIAL");
watermark.SetFontName("Helvetica");
watermark.SetFontSize(48);
watermark.SetTextRGBColor(255, 0, 0);
watermark.SetRotation(45);
watermark.SetOpacity(76); // 0..255
watermark.SetVertalign(C_Watermark_Vertalign.WATERMARK_VERTALIGN_CENTER);
watermark.SetHorizalign(C_Watermark_Horizalign.WATERMARK_HORIZALIGN_CENTER);
watermark.SetPages($"0-{document.PageCount - 1}");
watermark.SetFront(true);
watermark.CreateWatermark();
document.WriteToFilePath("watermarked.pdf");
document.Release();
}
}
// NuGet: Install-Package ComPDFKit.NetCore
using ComPDFKit.PDFDocument;
using ComPDFKit.PDFWatermark;
using System;
class Program
{
static void Main()
{
var document = CPDFDocument.InitWithFilePath("input.pdf");
CPDFWatermark watermark = document.InitWatermark(
C_Watermark_Type.WATERMARK_TYPE_TEXT);
watermark.SetText("CONFIDENTIAL");
watermark.SetFontName("Helvetica");
watermark.SetFontSize(48);
watermark.SetTextRGBColor(255, 0, 0);
watermark.SetRotation(45);
watermark.SetOpacity(76); // 0..255
watermark.SetVertalign(C_Watermark_Vertalign.WATERMARK_VERTALIGN_CENTER);
watermark.SetHorizalign(C_Watermark_Horizalign.WATERMARK_HORIZALIGN_CENTER);
watermark.SetPages($"0-{document.PageCount - 1}");
watermark.SetFront(true);
watermark.CreateWatermark();
document.WriteToFilePath("watermarked.pdf");
document.Release();
}
}
Imports ComPDFKit.PDFDocument
Imports ComPDFKit.PDFWatermark
Imports System
Class Program
Shared Sub Main()
Dim document = CPDFDocument.InitWithFilePath("input.pdf")
Dim watermark As CPDFWatermark = document.InitWatermark(C_Watermark_Type.WATERMARK_TYPE_TEXT)
watermark.SetText("CONFIDENTIAL")
watermark.SetFontName("Helvetica")
watermark.SetFontSize(48)
watermark.SetTextRGBColor(255, 0, 0)
watermark.SetRotation(45)
watermark.SetOpacity(76) ' 0..255
watermark.SetVertalign(C_Watermark_Vertalign.WATERMARK_VERTALIGN_CENTER)
watermark.SetHorizalign(C_Watermark_Horizalign.WATERMARK_HORIZALIGN_CENTER)
watermark.SetPages($"0-{document.PageCount - 1}")
watermark.SetFront(True)
watermark.CreateWatermark()
document.WriteToFilePath("watermarked.pdf")
document.Release()
End Sub
End Class
IronPDF實現:
// NuGet: Install-Package IronPdf
using IronPdf;
using IronPdf.Editing;
using System;
class Program
{
static void Main()
{
var pdf = PdfDocument.FromFile("input.pdf");
pdf.ApplyWatermark("<h1 style='color:rgba(255,0,0,0.3);'>CONFIDENTIAL</h1>",
rotation: 45,
verticalAlignment: VerticalAlignment.Middle,
horizontalAlignment: HorizontalAlignment.Center);
pdf.SaveAs("watermarked.pdf");
}
}
// NuGet: Install-Package IronPdf
using IronPdf;
using IronPdf.Editing;
using System;
class Program
{
static void Main()
{
var pdf = PdfDocument.FromFile("input.pdf");
pdf.ApplyWatermark("<h1 style='color:rgba(255,0,0,0.3);'>CONFIDENTIAL</h1>",
rotation: 45,
verticalAlignment: VerticalAlignment.Middle,
horizontalAlignment: HorizontalAlignment.Center);
pdf.SaveAs("watermarked.pdf");
}
}
Imports IronPdf
Imports IronPdf.Editing
Imports System
Module Program
Sub Main()
Dim pdf = PdfDocument.FromFile("input.pdf")
pdf.ApplyWatermark("<h1 style='color:rgba(255,0,0,0.3);'>CONFIDENTIAL</h1>",
rotation:=45,
verticalAlignment:=VerticalAlignment.Middle,
horizontalAlignment:=HorizontalAlignment.Center)
pdf.SaveAs("watermarked.pdf")
End Sub
End Module
IronPDF將多步CPDFWatermark配置簡化為單一方法呼叫與HTML/CSS樣式。 如需更多選項,請參見浮水印文件。
文字提取
ComPDFKit實現:
using ComPDFKit.PDFDocument;
using System.Text;
var document = CPDFDocument.InitWithFilePath("document.pdf");
// Extract text (verbose)
var allText = new StringBuilder();
for (int i = 0; i < document.PageCount; i++)
{
var page = document.PageAtIndex(i);
var textPage = page.GetTextPage();
allText.AppendLine(textPage.GetText(0, textPage.CountChars()));
textPage.Release();
page.Release();
}
document.WriteToFilePath("output.pdf");
document.Release(); // Must remember to release!
using ComPDFKit.PDFDocument;
using System.Text;
var document = CPDFDocument.InitWithFilePath("document.pdf");
// Extract text (verbose)
var allText = new StringBuilder();
for (int i = 0; i < document.PageCount; i++)
{
var page = document.PageAtIndex(i);
var textPage = page.GetTextPage();
allText.AppendLine(textPage.GetText(0, textPage.CountChars()));
textPage.Release();
page.Release();
}
document.WriteToFilePath("output.pdf");
document.Release(); // Must remember to release!
Imports ComPDFKit.PDFDocument
Imports System.Text
Dim document = CPDFDocument.InitWithFilePath("document.pdf")
' Extract text (verbose)
Dim allText As New StringBuilder()
For i As Integer = 0 To document.PageCount - 1
Dim page = document.PageAtIndex(i)
Dim textPage = page.GetTextPage()
allText.AppendLine(textPage.GetText(0, textPage.CountChars()))
textPage.Release()
page.Release()
Next
document.WriteToFilePath("output.pdf")
document.Release() ' Must remember to release!
IronPDF實現:
using IronPdf;
var pdf = PdfDocument.FromFile("document.pdf");
// Extract text (one-liner)
string allText = pdf.ExtractAllText();
pdf.SaveAs("output.pdf");
// No Release() needed - GC handles cleanup
using IronPdf;
var pdf = PdfDocument.FromFile("document.pdf");
// Extract text (one-liner)
string allText = pdf.ExtractAllText();
pdf.SaveAs("output.pdf");
// No Release() needed - GC handles cleanup
Imports IronPdf
Dim pdf = PdfDocument.FromFile("document.pdf")
' Extract text (one-liner)
Dim allText As String = pdf.ExtractAllText()
pdf.SaveAs("output.pdf")
' No Release() needed - GC handles cleanup
IronPDF將多行文字提取與手動Release()呼叫減至單一方法。 更多的提取選項,請參閱 文字提取文件。
密碼保護
IronPDF實現:
using IronPdf;
var renderer = new ChromePdfRenderer();
var pdf = renderer.RenderHtmlAsPdf("<h1>Confidential Document</h1>");
// Set security
pdf.SecuritySettings.UserPassword = "userPassword";
pdf.SecuritySettings.OwnerPassword = "ownerPassword";
pdf.SecuritySettings.AllowUserPrinting = PdfPrintSecurity.FullPrintRights;
pdf.SecuritySettings.AllowUserCopyPasteContent = false;
pdf.SaveAs("protected.pdf");
using IronPdf;
var renderer = new ChromePdfRenderer();
var pdf = renderer.RenderHtmlAsPdf("<h1>Confidential Document</h1>");
// Set security
pdf.SecuritySettings.UserPassword = "userPassword";
pdf.SecuritySettings.OwnerPassword = "ownerPassword";
pdf.SecuritySettings.AllowUserPrinting = PdfPrintSecurity.FullPrintRights;
pdf.SecuritySettings.AllowUserCopyPasteContent = false;
pdf.SaveAs("protected.pdf");
Imports IronPdf
Dim renderer As New ChromePdfRenderer()
Dim pdf = renderer.RenderHtmlAsPdf("<h1>Confidential Document</h1>")
' Set security
pdf.SecuritySettings.UserPassword = "userPassword"
pdf.SecuritySettings.OwnerPassword = "ownerPassword"
pdf.SecuritySettings.AllowUserPrinting = PdfPrintSecurity.FullPrintRights
pdf.SecuritySettings.AllowUserCopyPasteContent = False
pdf.SaveAs("protected.pdf")
欲了解全面的安全選項,請參閱 加密文件。
關鍵遷移注意事項
移除所有Release()呼叫
最有影響的改變是去除手動記憶體管理。 ComPDFKit需要在文件、頁面、文字頁面上顯式進行Release()呼叫。 IronPDF透過.NET垃圾回收自動處理這些操作。
//ComPDFKit- manual cleanup required
document.Release();
page.Release();
textPage.Release();
//IronPDF- no equivalent needed
// GC handles cleanup automatically
//ComPDFKit- manual cleanup required
document.Release();
page.Release();
textPage.Release();
//IronPDF- no equivalent needed
// GC handles cleanup automatically
'ComPDFKit- manual cleanup required
document.Release()
page.Release()
textPage.Release()
'IronPDF- no equivalent needed
' GC handles cleanup automatically
原生HTML渲染
ComPDFKit需透過編輯器API來手動文字放置,而IronPDF用其Chromium引擎原生渲染HTML/CSS,支持現代CSS3、JavaScript和響應式佈局。
相同的頁面索引
兩個程式庫都使用0起始索引(Pages[0]是第一頁)—頁面存取程式碼不需要更改。
簡化的文字提取
用一個單一的GetTextPage() + GetText() + Release()模式。
流利的合併API
用簡單的ImportPagesAtIndex(doc2, "0-9", pageCount)。
後遷移檢查清單
完成程式碼遷移後,請驗證以下內容:
- 運行所有單元測試以驗證PDF生成是否正常工作
- 比較PDF輸出品質(IronPDF的Chromium引擎可能產生不同的效果——通常較好)
- 測試具有複雜CSS和JavaScript的HTML渲染
- 驗證文字提取的準確性
- 測試表單功能
- 性能測試批量操作
- 在所有目標環境中測試
- 更新 CI/CD 管道
- 移除ComPDFKit的授權檔案
其他資源
從ComPDFKit遷移到IronPDF消除了手動記憶體管理與Release()呼叫,並提供ComPDFKit欠缺的原生HTML到PDF渲染。 向IronPDF的成熟生態系統的過渡提供了文件深度、社群支持和經過驗證的穩定性,這些都是企業專案所需的。

