如何用 C# 从 GrabzIt 迁移到 IronPDF
从GrabzIt迁移到 IronPDF:完整的 C# 迁移指南
从GrabzIt迁移到IronPDF可将您的 .NET PDF 工作流程从基于云的截图捕获服务(具有回调复杂性)转变为进程内库,该库可生成具有可选择、可搜索文本的真正矢量 PDF。 本指南为专业的 .NET 开发人员提供了一个全面的、逐步的迁移路径,消除了外部服务器依赖性、回调处理程序和按捕获量定价。
为什么要从GrabzIt迁移到 IronPDF.
GrabzIt架构问题
GrabzIt 是一种基于云的屏幕截图和 PDF 捕捉服务。虽然方便快速集成,但它有基本的架构限制:
1.基于图像的 PDF:GrabzIt 可创建基于屏幕截图的 PDF,其中文本不可选,基本上是以 PDF 格式封装的图像。 这对于任何需要文本操作或可访问性的使用案例来说都是一个基本限制。
2.外部处理:所有内容都会发送到GrabzIt的服务器进行处理,这就会产生敏感数据的隐私和合规性问题。 您的 HTML 内容离开了您的基础架构。
3.回调复杂性:GrabzIt 使用异步回调模型,需要 webhook 处理基础结构。 您必须设置端点来接收结果,这增加了架构的复杂性。
4.按捕获量定价:按使用量付费的模式在扩大规模后可能会变得昂贵。 每生成一份 PDF 都需要成本。
5.无文本搜索:由于 PDF 是基于图像的,如果没有 OCR,文本搜索和提取将无法进行,这将增加额外的步骤和成本。
6.文件大小:基于图像的 PDF 比基于矢量的 PDF 大得多,通常是后者的 5-10 倍。
7.网络依赖性:在没有网络连接的情况下无法生成 PDF,因此无法实现离线场景。
8.延迟:每次生成 PDF 都需要通过网络往返外部服务器,因此会增加 500ms-5s 的延迟。
GrabzIt与IronPDF对比
| 方面 | GrabzIt | IronPDF |
|---|---|---|
| PDF 类型 | 基于图像(截图) | 真正的矢量 PDF |
| 文本选择 | 不可能 | 全文选择 |
| 文本搜索 | 需要 OCR | 本地可搜索 |
| 处理地点 | 外部服务器 | 本地/流程中 |
| 隐私保护 | 外部发送的数据 | 数据保持本地化 |
| 延迟 | 网络往返(500ms-5s) | 本地处理(~100 毫秒) |
| 定价模式 | 每次捕获 | 每位开发人员许可证 |
| 离线能力 | 否 | 是 |
| 文件大小 | 大图(图像数据) | 小(矢量数据) |
| 需要回电 | 是(异步) | 否(同步/异步) |
| CSS/JS 支持 | 有限的 | 完整的 Chromium 引擎 |
对于计划在 2025 年和 2026 年之前采用 .NET 10 和 C# 14 的团队来说,IronPDF 提供了一个面向未来的基础,其本地处理与现代 .NET 模式原生集成。
迁移复杂性评估
按功能估算的工作量
| 特征 | 迁移复杂性 | 备注 |
|---|---|---|
| HTML 至 PDF | 极低 | 直接方法替换 |
| URL 至 PDF | 极低 | 直接方法替换 |
| HTML 至图像 | 低 | 渲染 PDF 然后转换 |
| 页面大小/页边距 | 低 | 属性映射 |
| 回调处理程序 | 低 | 完全删除 |
| 水印 | 低 | 基于 HTML 的方法 |
| 页眉/页脚 | 语言 | 模板到 HTML 的转换 |
| 验证密钥 | 极低 | 移除GrabzIt密钥 |
范式转换
这次GrabzIt迁移的根本转变是从 基于回调的异步云处理到 异步进程内生成:
GrabzIt: 发送 HTML → 等待回调 → 从服务器检索结果
IronPdf: 渲染 HTML → 立即获取 PDF开始之前
前提条件
1..NET版本:IronPDF支持.NET Framework 4.6.2+ 和 .NET Core 3.1+ / .NET 5/6/7/8/9+ 。 2.许可证密钥:从 ironpdf.com 获取IronPDF许可证密钥。 3.计划基础架构移除:文档回调处理程序和 Webhook 端点的停用
识别所有GrabzIt使用情况
# FindGrabzItclient 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" .# FindGrabzItclient 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");IRON VB CONVERTER ERROR developers@ironsoftware.comAfter (IronPDF):
// Set once at application startup
IronPdf.License.LicenseKey = "YOUR-IRONPDF-LICENSE-KEY";
// Then create renderer without credentials
var renderer = new ChromePdfRenderer();// Set once at application startup
IronPdf.License.LicenseKey = "YOUR-IRONPDF-LICENSE-KEY";
// Then create renderer without credentials
var renderer = new ChromePdfRenderer();IRON VB CONVERTER ERROR developers@ironsoftware.com步骤 2:更新名称空间导入
// Before (GrabzIt)
using GrabzIt;
using GrabzIt.Parameters;
// After (IronPDF)
using IronPdf;// Before (GrabzIt)
using GrabzIt;
using GrabzIt.Parameters;
// After (IronPDF)
using IronPdf;IRON VB CONVERTER ERROR developers@ironsoftware.com完整的 API 参考
GrabzItClient 到IronPDF的映射
| GrabzIt 方法 | IronPdf 同等产品 | 备注 |
|---|---|---|
| <代码>new GrabzItClient(key、secret)</代码 | <代码>new ChromePdfRenderer()</ 代码 | 无需验证 |
| <代码>HTMLToPDF(html)</代码 | <代码>renderer.RenderHtmlAsPdf(html)</代码 | 直接返回 PDF |
| <代码>URLToPDF(url)</代码 | <代码>renderer.RenderUrlAsPdf(url)</代码 | 直接返回 PDF |
| <代码>HTMLToImage(html)</代码 | <代码>pdf.ToBitmap()</代码 | 渲染然后转换 |
| <代码>保存(callbackUrl)</代码 | <代码>pdf.SaveAs(路径)</代码 | 立竿见影的效果 |
| <代码>SaveTo(文件路径)</代码 | <代码>pdf.SaveAs(filePath)</代码 | 相同功能 |
| <代码>GetResult(id)</代码 | 不适用 | 无需回调 |
| <代码>GetStatus(id)</代码 | 不适用 | 同步操作 |
PDFOptions 到 RenderingOptions 映射
| GrabzIt PDF 选项 | IronPdf 属性 | 备注 |
|---|---|---|
| <代码>页面大小</代码>(A4、Letter) | <代码>RenderingOptions.PaperSize</代码 | 使用 PdfPaperSize 枚举 |
| <代码>CustomId</代码 | 不适用 | 不需要 |
| <代码>页边距</代码 | <代码>RenderingOptions.MarginTop</代码 | 单位相同(毫米) |
| <代码>边距下限</代码 | <代码>RenderingOptions.MarginBottom</代码 | 单位相同(毫米) |
ImageOptions 到IronPDF的映射
| GrabzIt 图像选项 | IronPdf 同等产品 | 备注 |
|---|---|---|
| <代码>格式</代码> (png, jpg) | <代码>bitmap.Save(路径,ImageFormat.Png)</代码 | 在 ToBitmap() 之后 |
| <代码>宽度</代码 | <代码>RenderingOptions.ViewPortWidth</代码 | 视口宽度 |
| <代码>高度</代码 | <代码>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");
}
}IRON VB CONVERTER ERROR developers@ironsoftware.comAfter (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");
}
}IRON VB CONVERTER ERROR developers@ironsoftware.com两者之间的差异很大:GrabzIt 需要 API 凭据(YOUR_APPLICATION_KEY, YOUR_APPLICATION_SECRET),使用自定义 ID 创建 PDFOptions 对象,结果是通过外部服务器发送基于图像的 PDF。IronPDF的 ChromePdfRenderer 可在本地生成真正的矢量 PDF,并可选择文本--无需证书、无需网络调用、无需回调。 有关其他渲染选项,请参阅 HTML to 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");
}
}IRON VB CONVERTER ERROR developers@ironsoftware.comAfter (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");
}
}IRON VB CONVERTER ERROR developers@ironsoftware.comGrabzIt 需要通过选项对象配置 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");
}
}IRON VB CONVERTER ERROR developers@ironsoftware.comAfter (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);
}
}IRON VB CONVERTER ERROR developers@ironsoftware.comGrabzIt 提供了一个专用的 HTMLToImage() 方法,其中包含用于格式、宽度和高度配置的 ImageOptions 。IronPDF通过使用 RenderHtmlAsPdf() 首先将 HTML 渲染为 PDF,然后使用 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! 否 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! 否 callback needed.IRON VB CONVERTER ERROR developers@ironsoftware.com迁移后删除所有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!IRON VB CONVERTER ERROR developers@ironsoftware.com有关详细信息,请参阅 文本提取文档。
更小的文件大小
基于矢量的 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_SECRETIRON VB CONVERTER ERROR developers@ironsoftware.comIronPDF 使用在应用程序启动时设置一次的单一许可证密钥--无需每次请求验证。
故障排除
问题 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();IRON VB CONVERTER ERROR developers@ironsoftware.com问题 2:未找到 PDF 选项
问题: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;IRON VB CONVERTER ERROR developers@ironsoftware.com问题 3:回调处理程序仍被引用
问题:应用程序期望回调端点。
解决方案:完全删除回调基础架构。IronPDF同步返回结果--无需网络钩子。
问题 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);IRON VB CONVERTER ERROR developers@ironsoftware.com迁移清单
迁移前
- [ ] 清点代码库中的所有GrabzItAPI 调用
- [确定回调处理程序和 Webhook 端点
- [ ] 记录当前的GrabzIt选项和模板
- [ ] 获取 IronPdf 许可证密钥
- [计划回调处理程序退役
代码迁移
- [ ] 安装 IronPdf NuGet 软件包:<代码>dotnet 添加软件包 IronPdf</ 代码
- [ ] 删除GrabzItNuGet 软件包:<代码>dotnet 移除GrabzIt软件包</代码
- [ ] 将
GrabzItClient替换为ChromePdfRenderer - [ ] 将
HTMLToPDF()转换为RenderHtmlAsPdf()。 - [ ] 将
URLToPDF()转换为RenderUrlAsPdf()。 - [ ] 将
Save(callback)替换为SaveAs(path) - [ ] 将选项从
PDFOptions更新为RenderingOptions
基础架构迁移
- [ ] 删除回调处理程序文件(<代码>.ashx</代码>等)
- [ ] 从配置中移除GrabzItAPI 密钥
- [ ] 删除网络钩子 URL 配置
- [ ] 在配置中添加 IronPdf 许可证密钥
- [ ] 删除轮询/状态检查代码
测试
- [ ] 测试 HTML 到 PDF 的转换
- [ ] 测试 URL 到 PDF 的转换
- [ ] 验证输出 PDF 中的文本是否可选
- [ ] 测试文本提取工作(无 OCR)
- [ ] 确认文件大小较小
- [ ] 无网络延迟的性能测试
后迁移
- [ ] 取消GrabzIt订阅
- [归档回调处理程序代码
- [ ] 更新文档
- [ ] 监控任何与GrabzIt相关的错误
结论
从GrabzIt迁移到IronPDF可为 .NET 应用程序提供多项重大改进。 您将获得真正的矢量 PDF 文件,其中包含可选择、可搜索的文本,而不是基于图像的截图。 本地处理消除了外部服务器依赖性、隐私问题和网络延迟。 同步 API 完全消除了回调的复杂性--删除 webhook 处理程序和状态轮询代码。
本次迁移的主要变化有 1.PDF 类型:基于图像的截图 → 真正的矢量 PDF 2.处理:外部服务器 → 本地进程中 3.架构:异步回调 → 同步结果 4.文件大小:大图像数据 → 小矢量数据 5.文本:需要 OCR → 本地可搜索






