如何在 C# 中從 GrabzIt 遷移到 IronPDF
從GrabzIt遷移到IronPDF將您的.NET PDF工作流程從基於雲端的截圖捕獲服務(具有回調複雜度)轉變為產生真正的向量PDF(具有可選和可搜尋的文字)的處理內嵌程式庫。 本指南提供了一個全面的、逐步的遷移路徑,消除了對外部伺服器的依賴、回調處理程式,以及專業.NET開發者所面臨的按次定價問題。
為何從GrabzIt遷移到IronPDF
GrabzIt架構問題
GrabzIt是一個基於雲端的截圖和PDF捕獲服務。雖然方便於快速整合,但它有基本的架構限制:
-
基於影像的PDFs: GrabzIt建立的截圖型PDF中,文字是不可選擇的,實質上是包裝在PDF格式中的影像。 這對於任何需要文字操作或可及性的使用案例來說都是一個基本的限制。
-
外部處理: 所有的內容都被送到GrabzIt的伺服器進行處理,對於敏感資料造成隱私和合規性問題。 您的HTML內容將離開您的基礎設施。
-
回調複雜性: GrabzIt使用非同步回調模型,需要webhook處理基礎設施。 您必須設置端點以接收結果,增加了架構的複雜性。
-
按次定價: 按次付費模式在大規模下可能會變得昂貴。 每次PDF生成都會產生成本。
-
無法搜尋文字: 由於PDF是基於影像的,文字搜尋和提取在沒有OCR情況下是不可行的,這需要額外的步驟與費用。
-
文件大小較大: 基於影像的PDF文件比向量PDF大5至10倍。
-
網路依賴性: 沒有網路連線就無法生成PDF,這使得離線場景變得不可能。
- 延遲: 每次生成PDF都需要網路往返到外部伺服器,比起本地內嵌生成增加了顯著的延遲。
GrabzIt與IronPDF對比
| 方面 | GrabzIt | IronPDF |
|---|---|---|
| PDF型別 | 基於影像(截圖) | 真正的向量PDF |
| 文字選擇 | 不可能 | 完整文字選擇 |
| 文字搜尋 | 需要OCR | 原生可搜尋 |
| 處理位置 | 外部伺服器 | 本地/處理內嵌 |
| 隱私 | 資料外部傳送 | 資料保留在本地 |
| 延遲 | 網路往返(500ms-5s) | 本地處理(約100ms) |
| 價格模式 | 按次定價 | 每開發者授權 |
| 離線能力 | 否 | 是 |
| 文件大小 | 大(影像資料) | 小(向量資料) |
| 必需回調 | 是(非同步) | 否(同步/異步) |
| CSS/JS 支援 | 有限 | 完整的Chromium引擎 |
IronPDF本地整合現代.NET範式,並完全在程式內執行,從而消除了PDF流程中的雲端往返。
遷移複雜性評估
功能的預估努力程度
| 功能 | 遷移複雜性 |
|---|---|
| HTML轉PDF | 非常低 |
| URL到PDF | 非常低 |
| HTML至影像 | 低 |
| 頁面大小/邊距 | 低 |
| 回調處理程式 | 低 |
| 浮水印 | 低 |
| 頁眉/頁腳 | 中 |
| 認證密鑰 | 非常低 |
範式轉變
GrabzIt遷移的基本轉變是從基於非同步回調的雲端處理到同步處理內嵌生成:
GrabzIt: 傳送HTML → 等待回調 → 從伺服器檢索結果
IronPDF: 渲染HTML → 立即獲取PDF
開始之前
前提條件
- .NET版本: IronPDF支援 .NET Framework 4.6.2+ 和 .NET Core 3.1+ / .NET 5+
- 授權金鑰:從ironpdf.com取得您的IronPDF授權金鑰
- 計劃基礎設施移除: 文件化回調處理程式和webhook端點以便停用
識別所有GrabzIt使用情況
# Find GrabzIt client usage
grep -r "GrabzItClient\|GrabzIt\." --include="*.cs" .
# Find callback handlers
grep -r "GrabzIt\|grabzit" --include="*.ashx" --include="*.aspx" --include="*.cs" .
# Find configuration
grep -r "APPLICATION_KEY\|APPLICATION_SECRET\|grabzit" --include="*.config" --include="*.json" .
# Find GrabzIt client usage
grep -r "GrabzItClient\|GrabzIt\." --include="*.cs" .
# Find callback handlers
grep -r "GrabzIt\|grabzit" --include="*.ashx" --include="*.aspx" --include="*.cs" .
# Find configuration
grep -r "APPLICATION_KEY\|APPLICATION_SECRET\|grabzit" --include="*.config" --include="*.json" .
NuGet包變更
# Remove GrabzIt
dotnet remove package GrabzIt
# Install IronPDF
dotnet add package IronPdf
# Remove GrabzIt
dotnet remove package GrabzIt
# Install IronPDF
dotnet add package IronPdf
快速開始遷移
步驟1:更新授權配置
之前(GrabzIt):
GrabzIt需要每次客戶端實例化時的應用鍵和秘密:
var grabzIt = new GrabzItClient("YOUR_APPLICATION_KEY", "YOUR_APPLICATION_SECRET");
var grabzIt = new GrabzItClient("YOUR_APPLICATION_KEY", "YOUR_APPLICATION_SECRET");
Dim grabzIt As New GrabzItClient("YOUR_APPLICATION_KEY", "YOUR_APPLICATION_SECRET")
之後(IronPDF):
// Set once at application startup
IronPdf.License.LicenseKey = "YOUR-LICENSE-KEY";
// Then create renderer without credentials
var renderer = new ChromePdfRenderer();
// Set once at application startup
IronPdf.License.LicenseKey = "YOUR-LICENSE-KEY";
// Then create renderer without credentials
var renderer = new ChromePdfRenderer();
Imports IronPdf
' Set once at application startup
IronPdf.License.LicenseKey = "YOUR-LICENSE-KEY"
' Then create renderer without credentials
Dim renderer As New ChromePdfRenderer()
步驟2:更新名稱空間的引入
// Before (GrabzIt)
using GrabzIt;
using GrabzIt.Parameters;
// After (IronPDF)
using IronPdf;
// Before (GrabzIt)
using GrabzIt;
using GrabzIt.Parameters;
// After (IronPDF)
using IronPdf;
Imports IronPdf
完整API參考
GrabzItClient 到IronPDF映射
| GrabzIt 方法 | IronPDF等價 |
|---|---|
new GrabzItClient(key, secret) |
new ChromePdfRenderer() |
HTMLToPDF(html) |
renderer.RenderHtmlAsPdf(html) |
URLToPDF(url) |
renderer.RenderUrlAsPdf(url) |
HTMLToImage(html) |
pdf.ToBitmap() |
Save(callbackUrl) |
pdf.SaveAs(path) |
SaveTo(filePath) |
pdf.SaveAs(filePath) |
GetResult(id) |
無 |
GetStatus(id) |
無 |
PDFOptions 到 RenderingOptions 映射
| GrabzIt PDFOptions | IronPDF 屬性 |
|---|---|
PageSize (A4, Letter) |
RenderingOptions.PaperSize |
CustomId |
無 |
MarginTop |
RenderingOptions.MarginTop |
MarginBottom |
RenderingOptions.MarginBottom |
ImageOptions 到IronPDF映射
| GrabzIt ImageOptions | IronPDF等價 |
|---|---|
Format (png, jpg) |
bitmap.Save(path, ImageFormat.Png) |
Width |
RenderingOptions.ViewPortWidth |
Height |
RenderingOptions.ViewPortHeight |
程式碼遷移範例
範例1:HTML轉PDF轉換
之前(GrabzIt):
// NuGet: Install-Package GrabzIt
using GrabzIt;
using GrabzIt.Parameters;
using System;
class Program
{
static void Main()
{
var grabzIt = new GrabzItClient("YOUR_APPLICATION_KEY", "YOUR_APPLICATION_SECRET");
var options = new PDFOptions();
options.CustomId = "my-pdf";
grabzIt.HTMLToPDF("<html><body><h1>Hello World</h1></body></html>", options);
grabzIt.SaveTo("output.pdf");
}
}
// NuGet: Install-Package GrabzIt
using GrabzIt;
using GrabzIt.Parameters;
using System;
class Program
{
static void Main()
{
var grabzIt = new GrabzItClient("YOUR_APPLICATION_KEY", "YOUR_APPLICATION_SECRET");
var options = new PDFOptions();
options.CustomId = "my-pdf";
grabzIt.HTMLToPDF("<html><body><h1>Hello World</h1></body></html>", options);
grabzIt.SaveTo("output.pdf");
}
}
Imports GrabzIt
Imports GrabzIt.Parameters
Imports System
Module Program
Sub Main()
Dim grabzIt As New GrabzItClient("YOUR_APPLICATION_KEY", "YOUR_APPLICATION_SECRET")
Dim options As New PDFOptions()
options.CustomId = "my-pdf"
grabzIt.HTMLToPDF("<html><body><h1>Hello World</h1></body></html>", options)
grabzIt.SaveTo("output.pdf")
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("<html><body><h1>Hello World</h1></body></html>");
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("<html><body><h1>Hello World</h1></body></html>");
pdf.SaveAs("output.pdf");
}
}
Imports IronPdf
Imports System
Class Program
Shared Sub Main()
Dim renderer = New ChromePdfRenderer()
Dim pdf = renderer.RenderHtmlAsPdf("<html><body><h1>Hello World</h1></body></html>")
pdf.SaveAs("output.pdf")
End Sub
End Class
差異很大:GrabzIt需要API憑證(YOUR_APPLICATION_KEY、YOUR_APPLICATION_SECRET),建立一個帶有自訂ID的PDFOptions物件,結果是通過外部伺服器傳送的基於影像的PDF。 IronPDF的ChromePdfRenderer在本地生成真正的向量PDF,具有可選文字——不需憑證、網路呼叫或回調。 查看HTML到PDF文件以獲取其他渲染選項。
範例2:URL轉PDF轉換
之前(GrabzIt):
// NuGet: Install-Package GrabzIt
using GrabzIt;
using GrabzIt.Parameters;
using System;
class Program
{
static void Main()
{
var grabzIt = new GrabzItClient("YOUR_APPLICATION_KEY", "YOUR_APPLICATION_SECRET");
var options = new PDFOptions();
options.PageSize = PageSize.A4;
grabzIt.URLToPDF("https://www.example.com", options);
grabzIt.SaveTo("webpage.pdf");
}
}
// NuGet: Install-Package GrabzIt
using GrabzIt;
using GrabzIt.Parameters;
using System;
class Program
{
static void Main()
{
var grabzIt = new GrabzItClient("YOUR_APPLICATION_KEY", "YOUR_APPLICATION_SECRET");
var options = new PDFOptions();
options.PageSize = PageSize.A4;
grabzIt.URLToPDF("https://www.example.com", options);
grabzIt.SaveTo("webpage.pdf");
}
}
Imports GrabzIt
Imports GrabzIt.Parameters
Imports System
Module Program
Sub Main()
Dim grabzIt As New GrabzItClient("YOUR_APPLICATION_KEY", "YOUR_APPLICATION_SECRET")
Dim options As New PDFOptions()
options.PageSize = PageSize.A4
grabzIt.URLToPDF("https://www.example.com", options)
grabzIt.SaveTo("webpage.pdf")
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.RenderUrlAsPdf("https://www.example.com");
pdf.SaveAs("webpage.pdf");
}
}
// NuGet: Install-Package IronPdf
using IronPdf;
using System;
class Program
{
static void Main()
{
var renderer = new ChromePdfRenderer();
var pdf = renderer.RenderUrlAsPdf("https://www.example.com");
pdf.SaveAs("webpage.pdf");
}
}
Imports IronPdf
Imports System
Class Program
Shared Sub Main()
Dim renderer = New ChromePdfRenderer()
Dim pdf = renderer.RenderUrlAsPdf("https://www.example.com")
pdf.SaveAs("webpage.pdf")
End Sub
End Class
GrabzIt需要通過選項物件配置PageSize.A4並與外部伺服器進行認證。 IronPDF的RenderUrlAsPdf()方法直接接受URL並使用完整的Chromium引擎在本地渲染,並完全支援CSS和JavaScript。 瞭解更多關於URL到PDF轉換。
範例3:HTML到影像轉換
之前(GrabzIt):
// NuGet: Install-Package GrabzIt
using GrabzIt;
using GrabzIt.Parameters;
using System;
class Program
{
static void Main()
{
var grabzIt = new GrabzItClient("YOUR_APPLICATION_KEY", "YOUR_APPLICATION_SECRET");
var options = new ImageOptions();
options.Format = ImageFormat.png;
options.Width = 800;
options.Height = 600;
grabzIt.HTMLToImage("<html><body><h1>Hello World</h1></body></html>", options);
grabzIt.SaveTo("output.png");
}
}
// NuGet: Install-Package GrabzIt
using GrabzIt;
using GrabzIt.Parameters;
using System;
class Program
{
static void Main()
{
var grabzIt = new GrabzItClient("YOUR_APPLICATION_KEY", "YOUR_APPLICATION_SECRET");
var options = new ImageOptions();
options.Format = ImageFormat.png;
options.Width = 800;
options.Height = 600;
grabzIt.HTMLToImage("<html><body><h1>Hello World</h1></body></html>", options);
grabzIt.SaveTo("output.png");
}
}
Imports GrabzIt
Imports GrabzIt.Parameters
Imports System
Module Program
Sub Main()
Dim grabzIt As New GrabzItClient("YOUR_APPLICATION_KEY", "YOUR_APPLICATION_SECRET")
Dim options As New ImageOptions()
options.Format = ImageFormat.png
options.Width = 800
options.Height = 600
grabzIt.HTMLToImage("<html><body><h1>Hello World</h1></body></html>", options)
grabzIt.SaveTo("output.png")
End Sub
End Module
之後(IronPDF):
// NuGet: Install-Package IronPdf
using IronPdf;
using System;
using System.Drawing;
class Program
{
static void Main()
{
var renderer = new ChromePdfRenderer();
var pdf = renderer.RenderHtmlAsPdf("<html><body><h1>Hello World</h1></body></html>");
var images = pdf.ToBitmap();
images[0].Save("output.png", System.Drawing.Imaging.ImageFormat.Png);
}
}
// NuGet: Install-Package IronPdf
using IronPdf;
using System;
using System.Drawing;
class Program
{
static void Main()
{
var renderer = new ChromePdfRenderer();
var pdf = renderer.RenderHtmlAsPdf("<html><body><h1>Hello World</h1></body></html>");
var images = pdf.ToBitmap();
images[0].Save("output.png", System.Drawing.Imaging.ImageFormat.Png);
}
}
Imports IronPdf
Imports System
Imports System.Drawing
Class Program
Shared Sub Main()
Dim renderer = New ChromePdfRenderer()
Dim pdf = renderer.RenderHtmlAsPdf("<html><body><h1>Hello World</h1></body></html>")
Dim images = pdf.ToBitmap()
images(0).Save("output.png", System.Drawing.Imaging.ImageFormat.Png)
End Sub
End Class
GrabzIt提供專用的ImageOptions進行格式、寬度和高度配置。 IronPDF通過首先使用ToBitmap()轉換為位圖來實現相同的結果。 這種方式使您可以從單次渲染操作中獲得PDF和影像輸出。
關鍵遷移注意事項
不需回調
最重要的架構變化是完全消除回調處理程式:
// GrabzIt: Async callback pattern
grabzIt.HTMLToPDF(html, options);
grabzIt.Save("https://myserver.com/grabzit-callback"); // Wait for callback...
// Callback handler (separate endpoint)
public class GrabzItHandler : IHttpHandler
{
public void ProcessRequest(HttpContext context)
{
string id = context.Request.QueryString["id"];
GrabzItClient grabzIt = new GrabzItClient("APP_KEY", "APP_SECRET");
GrabzItFile file = grabzIt.GetResult(id);
file.Save("output.pdf");
}
}
// IronPDF: Synchronous - result immediately available
var pdf = renderer.RenderHtmlAsPdf(html);
pdf.SaveAs("output.pdf"); // Done! No callback needed.
// GrabzIt: Async callback pattern
grabzIt.HTMLToPDF(html, options);
grabzIt.Save("https://myserver.com/grabzit-callback"); // Wait for callback...
// Callback handler (separate endpoint)
public class GrabzItHandler : IHttpHandler
{
public void ProcessRequest(HttpContext context)
{
string id = context.Request.QueryString["id"];
GrabzItClient grabzIt = new GrabzItClient("APP_KEY", "APP_SECRET");
GrabzItFile file = grabzIt.GetResult(id);
file.Save("output.pdf");
}
}
// IronPDF: Synchronous - result immediately available
var pdf = renderer.RenderHtmlAsPdf(html);
pdf.SaveAs("output.pdf"); // Done! No callback needed.
Imports System.Web
' GrabzIt: Async callback pattern
grabzIt.HTMLToPDF(html, options)
grabzIt.Save("https://myserver.com/grabzit-callback") ' Wait for callback...
' Callback handler (separate endpoint)
Public Class GrabzItHandler
Implements IHttpHandler
Public Sub ProcessRequest(context As HttpContext) Implements IHttpHandler.ProcessRequest
Dim id As String = context.Request.QueryString("id")
Dim grabzIt As New GrabzItClient("APP_KEY", "APP_SECRET")
Dim file As GrabzItFile = grabzIt.GetResult(id)
file.Save("output.pdf")
End Sub
Public ReadOnly Property IsReusable As Boolean Implements IHttpHandler.IsReusable
Get
Return False
End Get
End Property
End Class
' IronPDF: Synchronous - result immediately available
Dim pdf = renderer.RenderHtmlAsPdf(html)
pdf.SaveAs("output.pdf") ' Done! No callback needed.
刪除所有GrabzIt回調處理程式(.ashx檔案,處理程式端點,webhook設置)遷移後。
真正的向量PDF
GrabzIt建立的影像型PDF中,文字是不可選擇的。 IronPDF生成的是真正的向量PDF:
// With IronPDF, text extraction works natively
var pdf = PdfDocument.FromFile("document.pdf");
string text = pdf.ExtractAllText(); // Works without OCR!
// With IronPDF, text extraction works natively
var pdf = PdfDocument.FromFile("document.pdf");
string text = pdf.ExtractAllText(); // Works without OCR!
Imports IronPdf
' With IronPDF, text extraction works natively
Dim pdf = PdfDocument.FromFile("document.pdf")
Dim text As String = pdf.ExtractAllText() ' Works without OCR!
請參閱文字提取文件以獲取更多詳細資訊。
較小的檔案大小
基於向量的PDF通常比GrabzIt的基於影像的PDF小5至10倍。 這改善了儲存成本、下載時間和電子郵件附件的可行性。
移除API憑證
GrabzIt要求每次操作的API憑證:
// Remove these from configuration
// YOUR_APPLICATION_KEY
// YOUR_APPLICATION_SECRET
// Remove these from configuration
// YOUR_APPLICATION_KEY
// YOUR_APPLICATION_SECRET
IronPDF使用在應用程式啟動時設置的一個授權密鑰,而無需每次請求認證。
故障排除
問題1:找不到GrabzItClient
問題:移除GrabzIt後,GrabzItClient引用導致編譯錯誤。
解決方案:替換為ChromePdfRenderer:
// Remove:
// var grabzIt = new GrabzItClient("KEY", "SECRET");
// Replace with:
var renderer = new ChromePdfRenderer();
// Remove:
// var grabzIt = new GrabzItClient("KEY", "SECRET");
// Replace with:
var renderer = new ChromePdfRenderer();
' Remove:
' Dim grabzIt = New GrabzItClient("KEY", "SECRET")
' Replace with:
Dim renderer = New ChromePdfRenderer()
問題2:找不到PDFOptions
問題: PDFOptions類在IronPDF中不存在。
解決方案:使用RenderingOptions屬性:
// GrabzIt
var options = new PDFOptions();
options.PageSize = PageSize.A4;
// IronPDF
renderer.RenderingOptions.PaperSize = PdfPaperSize.A4;
// GrabzIt
var options = new PDFOptions();
options.PageSize = PageSize.A4;
// IronPDF
renderer.RenderingOptions.PaperSize = PdfPaperSize.A4;
' GrabzIt
Dim options As New PDFOptions()
options.PageSize = PageSize.A4
' IronPDF
renderer.RenderingOptions.PaperSize = PdfPaperSize.A4
問題3:回調處理程式仍被引用
問題:應用程式預期有回調端點。
解決方案:完全刪除回調基礎設施。 IronPDF同步返回結果——不需要webhooks。
問題4:找不到ImageOptions
問題: ImageOptions類在IronPDF中不存在。
解決方案:先渲染為PDF,然後轉換:
// GrabzIt
var options = new ImageOptions();
options.Format = ImageFormat.png;
grabzIt.HTMLToImage(html, options);
// IronPDF
var pdf = renderer.RenderHtmlAsPdf(html);
var images = pdf.ToBitmap();
images[0].Save("output.png", System.Drawing.Imaging.ImageFormat.Png);
// GrabzIt
var options = new ImageOptions();
options.Format = ImageFormat.png;
grabzIt.HTMLToImage(html, options);
// IronPDF
var pdf = renderer.RenderHtmlAsPdf(html);
var images = pdf.ToBitmap();
images[0].Save("output.png", System.Drawing.Imaging.ImageFormat.Png);
' GrabzIt
Dim options As New ImageOptions()
options.Format = ImageFormat.png
grabzIt.HTMLToImage(html, options)
' IronPDF
Dim pdf = renderer.RenderHtmlAsPdf(html)
Dim images = pdf.ToBitmap()
images(0).Save("output.png", System.Drawing.Imaging.ImageFormat.Png)
遷移檢查表
遷移前
- 在程式碼庫中清查所有GrabzIt API呼叫
- 識別回調處理程式和webhook端點
- 文件化當前GrabzIt選項和模板
- 獲得IronPDF授權金鑰
- 計劃回調處理程式停用
程式碼遷移
- 安裝IronPDF NuGet包:
dotnet add package IronPdf - 移除GrabzIt NuGet包:
dotnet remove package GrabzIt - 將
GrabzItClient替換為ChromePdfRenderer - 將
HTMLToPDF()轉換為RenderHtmlAsPdf() - 將
URLToPDF()轉換為RenderUrlAsPdf() - 將
Save(callback)替換為SaveAs(path) - 將選項從
PDFOptions更新為RenderingOptions
基礎設施遷移
- 刪除回調處理程式檔案(
.ashx,等等) - 從配置中移除GrabzIt API密鑰
- 移除webhook URL配置
- 將IronPDF授權密鑰加入配置中
- 移除輪詢/狀態檢查程式碼
測試
- 測試 HTML 到 PDF 的轉換
- 測試 URL 到 PDF 的轉換
- 驗證輸出的PDF中文字是可選擇的
- 測試文字提取是否有效(無需OCR)
- 驗證檔案大小是否較小
- 在無網路延遲的情況下進行性能測試
遷移後
- 取消GrabzIt訂閱
- 將回調處理程式程式碼存檔
- 更新文件
- 監控任何與GrabzIt相關的錯誤

