IRONSOFTWAREHOME
视频

如何在C#中将图像转换为PDF

Curtis Chau
Curtis Chau
Updated: 2026年5月18日

为什么要从CraftMyPDF迁移到 IronPDF?

基于云的 PDF API(如 CraftMyPDF)引入了一些基本问题,使其不适合许多生产环境。

基于云的 PDF API 的问题

1.**您的数据离开您的系统:**每个 HTML 模板和 JSON 数据有效负载都会传输到CraftMyPDF的服务器。 对于发票、合同、医疗记录或任何敏感的商业数据,这会产生 HIPAA、GDPR 和 SOC2 合规风险。

  1. 网络延迟: 每次 PDF 生成涉及一个网络往返加上排队和渲染时间(通常为秒)。IronPDF可在几毫秒内本地生成。

  2. 逐 PDF 成本累积: 基于信用的定价随着卷的增大会累积,高吞吐量工作负载相对于一次性永久许可,产生了显著的经常性成本。

4.**针对打印优化的输出:**云 API 通常会针对打印进行优化——减少背景并简化颜色以节省"墨水"。因此,最终输出结果与屏幕上显示的 HTML 代码看起来截然不同。

5.**模板锁定:**CraftMyPDF需要使用其专有的拖放式编辑器。 不能随意使用标准 HTML/CSS。

架构比较

方面CraftMyPDFIronPDF
数据位置云(您的数据离开您的系统)内部部署(数据永不丢失)
延迟网络往返 + 渲染(通常为秒)毫秒
定价基于信用的订阅一次性永久许可
模板系统仅限专有的拖放功能任何 HTML/CSS/JavaScript
输出质量印刷优化像素完美的屏幕渲染
离线工作否(需要互联网)
合规性数据叶组织符合 SOC2/HIPAA 标准

功能对比

特征CraftMyPDFIronPDF
HTML 至 PDF通过 API 模板✅ 本地
URL 至 PDF通过 API✅ 本地
自定义模板仅限专有编辑器✅ 任何 HTML
支持 CSS3有限的✅ 全文
JavaScript 渲染有限的✅ 全文
合并/拆分 PDF通过 API✅ 本地
水印通过 API✅ 本地
离线工作
自托管

迁移前准备

前提条件

确保您的环境符合这些要求:

  • .NET Framework 4.6.2+ 或 .NET Core 3.1 / .NET 5-9
  • Visual Studio 2019+ 或带有 C# 扩展的 VS Code
  • 访问 NuGet 包管理器 -IronPDF许可证密钥(可在ironpdf.com免费试用)

审核CraftMyPDF的使用情况

在解决方案目录中运行这些命令,以识别所有CraftMyPDF引用:

# Find allCraftMyPDFusages in your codebase
grep -r "CraftMyPdf\|craftmypdf\|api.craftmypdf.com" --include="*.cs" .
grep -r "X-API-KEY" --include="*.cs" .

# Find API key references
grep -r "your-api-key\|template-id\|template_id" --include="*.cs" .

# Find NuGet package references
grep -r "CraftMyPdf\|RestSharp" --include="*.csproj" .
SHELL

值得期待的重大变化

变更CraftMyPDFIronPDF影响
架构云 REST API本地 .NET 库删除 HTTP 调用
模板专有编辑器标准 HTML将模板转换为 HTML
API关键字每次通话都需要启动时的许可删除 API 密钥处理
同步模式要求 (HTTP)可选项如果愿意,请删除等待
错误处理HTTP 状态代码例外情况更改 try/catch 模式
数据绑定JSON 模板字符串插值简化数据绑定

逐步迁移过程

步骤 1:更新 NuGet 软件包

移除 HTTP 客户端库并安装 IronPDF:

# Remove RestSharp HTTP client
dotnet remove package RestSharp

# Install IronPDF
dotnet add package IronPdf
SHELL

步骤 2:更新命名空间引用

用IronPDF替换 HTTP 客户端命名空间:

// Remove these
using RestSharp;
using System.IO;

// Add this
using IronPdf;

步骤 3:配置许可证(启动时一次)

用单个许可证配置替换每次请求的 API 密钥头:

// Add at application startup (Program.cs or Global.asax)
// This replaces all X-API-KEY headers
IronPdf.License.LicenseKey = "YOUR-LICENSE-KEY";

完整的 API 迁移参考

API 端点映射

CraftMyPDFIronPDF
POST /v1/createrenderer.RenderHtmlAsPdf(html)
X-API-KEY 头部License.LicenseKey = "..."
template_id标准 HTML 字符串
{%name%} 占位符$"{name}" C# 插值
POST /v1/mergePdfDocument.Merge(pdfs)
POST /v1/add-watermarkpdf.ApplyWatermark(html)
Webhook 回调不需要
费率限制不适用

配置映射

CraftMyPDF 选项IronPDF 同等产品
template_idHTML 字符串
data JSONC# 插值
page_size: "A4"PaperSize = PdfPaperSize.A4
orientation: "landscape"PaperOrientation = Landscape
margin_top: 20MarginTop = 20
headerHtmlHeader
footerHtmlFooter

代码迁移示例

HTML 到 PDF 转换

最常见的操作演示了从云 API 到本地渲染的基本架构转变。

CraftMyPDF实现:

// NuGet: Install-Package RestSharp
using System;
using RestSharp;
using System.IO;

class Program
{
    static void Main()
    {
        var client = new RestClient("https://api.craftmypdf.com/v1/create");
        var request = new RestRequest(Method.POST);
        request.AddHeader("X-API-KEY", "your-api-key");
        request.AddJsonBody(new
        {
            template_id = "your-template-id",
            data = new
            {
                html = "<h1>Hello World</h1><p>This is a PDF from HTML</p>"
            }
        });
        
        var response = client.Execute(request);
        File.WriteAllBytes("output.pdf", response.RawBytes);
    }
}

IronPDF 实现:

// NuGet: Install-Package IronPdf
using System;
using IronPdf;

class Program
{
    static void Main()
    {
        var renderer = new ChromePdfRenderer();
        var pdf = renderer.RenderHtmlAsPdf("<h1>Hello World</h1><p>This is a PDF from HTML</p>");
        pdf.SaveAs("output.pdf");
    }
}

IronPDF 省去了 RestClient 设置、API key headers、模板 ID 和 HTTP 响应处理--将 15 行云操作减少到 4 行本地代码。 有关更多选项,请参阅 HTML 转 PDF 文档

URL到PDF转换

CraftMyPDF实现:

// NuGet: Install-Package RestSharp
using System;
using RestSharp;
using System.IO;

class Program
{
    static void Main()
    {
        var client = new RestClient("https://api.craftmypdf.com/v1/create");
        var request = new RestRequest(Method.POST);
        request.AddHeader("X-API-KEY", "your-api-key");
        request.AddJsonBody(new
        {
            template_id = "your-template-id",
            data = new
            {
                url = "https://example.com"
            },
            export_type = "file" // "file" returns binary PDF; "json" returns a CDN URL
        });

        var response = client.Execute(request);
        File.WriteAllBytes("webpage.pdf", response.RawBytes);
    }
}

IronPDF 实现:

// NuGet: Install-Package IronPdf
using System;
using IronPdf;

class Program
{
    static void Main()
    {
        var renderer = new ChromePdfRenderer();
        var pdf = renderer.RenderUrlAsPdf("https://example.com");
        pdf.SaveAs("webpage.pdf");
    }
}

IronPDF 的 RenderUrlAsPdf 方法捕获整个网页,包括 JavaScript 渲染的内容。 有关更多选项,请参阅 URL to PDF 文档

页眉和页脚

CraftMyPDF实现:

// NuGet: Install-Package RestSharp
using System;
using RestSharp;
using System.IO;

class Program
{
    static void Main()
    {
        var client = new RestClient("https://api.craftmypdf.com/v1/create");
        var request = new RestRequest(Method.POST);
        request.AddHeader("X-API-KEY", "your-api-key");
        request.AddJsonBody(new
        {
            template_id = "your-template-id",
            data = new
            {
                html = "<h1>Document Content</h1>",
                header = "<div>Page Header</div>",
                footer = "<div>Page {page} of {total_pages}</div>"
            }
        });
        
        var response = client.Execute(request);
        File.WriteAllBytes("document.pdf", response.RawBytes);
    }
}

IronPDF 实现:

// NuGet: Install-Package IronPdf
using System;
using IronPdf;
using IronPdf.Rendering;

class Program
{
    static void Main()
    {
        var renderer = new ChromePdfRenderer();
        renderer.RenderingOptions.TextHeader = new TextHeaderFooter()
        {
            CenterText = "Page Header"
        };
        renderer.RenderingOptions.TextFooter = new TextHeaderFooter()
        {
            CenterText = "Page {page} of {total-pages}"
        };
        
        var pdf = renderer.RenderHtmlAsPdf("<h1>Document Content</h1>");
        pdf.SaveAs("document.pdf");
    }
}

IronPDF 支持类似 {page}{total-pages} 的占位符,用于动态页码。 有关更多选项,请参阅页眉和页脚文档

模板变量转换

CraftMyPDF 使用专有模板占位符,必须将其转换为 C# 字符串插值:

CraftMyPDF模式:

//CraftMyPDFtemplate variables
request.AddJsonBody(new
{
    template_id = "invoice-template",
    data = new
    {
        customer = "John Doe",
        amount = "$1,000",
        items = invoiceItems
    }
});

IronPDF模式:

// C# string interpolation
var html = $@"
<html>
<body>
    <h1>Invoice</h1>
    <p>Customer: {customerName}</p>
    <p>Amount: {amount}</p>
    {GenerateItemsTable(invoiceItems)}
</body>
</html>";

var pdf = renderer.RenderHtmlAsPdf(html);

关键迁移说明

删除所有 HTTP 代码

最重要的变化是消除了网络依赖性。IronPDF在本地运行--无 RestClient、无 API 调用、无响应处理:

//CraftMyPDF- HTTP required
var client = new RestClient("https://api.craftmypdf.com/v1/create");
var request = new RestRequest(Method.POST);
request.AddHeader("X-API-KEY", "your-api-key");
var response = await client.ExecuteAsync(request);

//IronPDF- no HTTP
var pdf = renderer.RenderHtmlAsPdf(html);

删除速率限制代码

CraftMyPDF 设置了 API 速率限制,需要重试逻辑。IronPDF没有限制:

//CraftMyPDF- needed to avoid 429 errors
await Task.Delay(100);
if (response.StatusCode == TooManyRequests) { /* retry */ }

//IronPDF- no limits, just generate
var pdf = renderer.RenderHtmlAsPdf(html);
// Remove all rate limit code!

删除 Webhook 处理程序

CraftMyPDF 使用异步网络钩子完成 PDF。IronPDF是同步的,PDF 可以立即完成:

//CraftMyPDF- webhook callback required
// POST with webhook_url, wait for callback

//IronPDF- PDF ready immediately
var pdf = renderer.RenderHtmlAsPdf(html);
pdf.SaveAs("output.pdf");
// No callback needed!

默认同步

如果只需要在 HTTP 调用中使用 async/await 模式,则将其删除:

//CraftMyPDF- async required
var response = await client.ExecuteAsync(request);

//IronPDF- sync by default (async available if needed)
var pdf = renderer.RenderHtmlAsPdf(html);

迁移后核对表

完成代码迁移后,请验证以下内容:

  • 运行所有 PDF 生成测试
  • 比较输出质量(IronPDF 的 Chromium 引擎可实现像素级完美渲染)
  • 衡量性能提升(毫秒与秒)
  • 验证所有模板是否已正确转换
  • 测试无速率限制的批量处理
  • 在所有目标环境中进行测试
  • 更新 CI/CD 流水线 取消CraftMyPDF订阅
  • 从 secrets/config 中移除 API 密钥

其他资源


从CraftMyPDF迁移到IronPDF可以消除云依赖、网络延迟、每 PDF 成本和模板锁定,同时提供离线运行的像素级完美 Chromium 渲染。从 REST API 调用到本地方法调用的过渡简化了您的代码库,并将敏感文档数据保留在您的基础架构中。

请注意: CraftMyPDF是其各自所有者的注册商标。 本网站与CraftMyPDF无关联、未经认可以及无赞助。 所有产品名称、徽标和品牌均为各自所有者的财产。 比较仅供参考,反映撰写时公开可用的信息。
Curtis Chau
技术作家

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

...
阅读更多

相关文章

Key in blue circle

立即获取免费的 30 天试用版密钥

Your trial license will be sent to your email address

无任何限制。100% 解锁。无需信用卡。

bullet_checked无需信用卡或创建账户无任何限制。100% 解锁。无需信用卡。
  • Logo Aetna
  • Logo NASA
  • Logo GE
  • Logo Porsche
  • Logo USDA
  • Logo Qatar
Join Millions of Engineers who’ve tried IronPDF
预约您的免费现场演示
Booking Badge

深受全球数百万工程师信赖

Iron Software 的客户徽标
获取您的无义务咨询
填写下面的表格或通过sales@ironsoftware.com
您的资料将始终保密。
深受全球数百万工程师信赖
Iron Software 的客户徽标
立即获取您的免费30 天试用密钥
无需信用卡或创建账户