跳至页脚内容
迁移指南

如何用 C# 从 GrabzIt 迁移到 IronPDF

从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 都需要与外部服务器进行网络往返,增加 500 毫秒至 5 秒的延迟。

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" .
SHELL

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
SHELL

快速启动迁移

步骤 1:更新许可配置

之前 (GrabzIt):

GrabzIt 的每个客户端实例化都需要应用密钥和秘密:

var grabzIt = new GrabzItClient("YOUR_APPLICATION_KEY", "YOUR_APPLICATION_SECRET");
var grabzIt = new GrabzItClient("YOUR_APPLICATION_KEY", "YOUR_APPLICATION_SECRET");
$vbLabelText   $csharpLabel

After (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();
$vbLabelText   $csharpLabel

步骤 2:更新名称空间导入

// Before (GrabzIt)
using GrabzIt;
using GrabzIt.Parameters;

// After (IronPDF)
using IronPdf;
// Before (GrabzIt)
using GrabzIt;
using GrabzIt.Parameters;

// After (IronPDF)
using IronPdf;
$vbLabelText   $csharpLabel

完整的 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 属性 备注
页面大小</code>(A4、Letter)|<code>RenderingOptions.PaperSize 使用 PdfPaperSize 枚举
CustomId 不适用 不需要
页边距 RenderingOptions.MarginTop 单位相同(毫米)
边距下限 RenderingOptions.MarginBottom 单位相同(毫米)

ImageOptions 到IronPDF的映射

GrabzIt 图像选项 IronPdf 同等产品 备注
格式</code> (png, jpg)|<code>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");
    }
}
$vbLabelText   $csharpLabel

After (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");
    }
}
$vbLabelText   $csharpLabel

两者之间的差异很大: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");
    }
}
$vbLabelText   $csharpLabel

After (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");
    }
}
$vbLabelText   $csharpLabel

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");
    }
}
$vbLabelText   $csharpLabel

After (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);
    }
}
$vbLabelText   $csharpLabel

GrabzIt 提供了一个专用的 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.
$vbLabelText   $csharpLabel

迁移后删除所有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!
$vbLabelText   $csharpLabel

有关详细信息,请参阅 文本提取文档

更小的文件大小

基于矢量的 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
$vbLabelText   $csharpLabel

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();
$vbLabelText   $csharpLabel

问题 2:未找到 PDF 选项

问题:IronPDF中不存在PDFOptions类。

解决方案:使用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;
$vbLabelText   $csharpLabel

问题 3:回调处理程序仍被引用

问题:应用程序需要回调端点。

解决方案:彻底删除回调机制。IronPDF同步返回结果--无需网络钩子。

问题 4:未找到 ImageOptions

问题:IronPDF中不存在ImageOptions类。

解决方案:先渲染成 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);
$vbLabelText   $csharpLabel

迁移清单

迁移前

  • 清点代码库中所有GrabzItAPI 调用
  • 确定回调处理程序和 webhook 端点
  • 记录GrabzIt当前的选项和模板
  • 获取IronPDF许可证密钥
  • 计划回调处理程序停用

代码迁移

安装 IronPdf NuGet 包: dotnet add package IronPdf

  • 移除GrabzItNuGet 包: dotnet remove package GrabzIt
  • GrabzItClient替换为ChromePdfRenderer
  • HTMLToPDF()转换为RenderHtmlAsPdf()
  • URLToPDF()转换为RenderUrlAsPdf()
  • Save(callback)替换为SaveAs(path)
  • 将选项从PDFOptions更新为RenderingOptions

基础架构迁移

  • 删除回调处理程序文件( .ashx等)
  • 从配置中移除GrabzItAPI 密钥
  • 移除 webhook URL 配置
  • 将IronPDF许可证密钥添加到配置中
  • 移除轮询/状态检查代码

测试

  • 测试 HTML 到 PDF 的转换
  • 测试 URL 到 PDF 的转换
  • 确认输出的PDF文件中文本可选择。
  • 测试文本提取功能(不使用 OCR)
  • 确认文件大小较小
  • 无网络延迟的性能测试

后迁移

取消GrabzIt订阅

  • 归档回调处理程序代码
  • 更新文档
  • 监控任何与GrabzIt相关的错误

Curtis Chau
技术作家

Curtis Chau 拥有卡尔顿大学的计算机科学学士学位,专注于前端开发,精通 Node.js、TypeScript、JavaScript 和 React。他热衷于打造直观且美观的用户界面,喜欢使用现代框架并创建结构良好、视觉吸引力强的手册。

除了开发之外,Curtis 对物联网 (IoT) 有浓厚的兴趣,探索将硬件和软件集成的新方法。在空闲时间,他喜欢玩游戏和构建 Discord 机器人,将他对技术的热爱与创造力相结合。