CraftMyPDF 与 IronPdf:技术比较指南
CraftMyPDFvs IronPDF:面向 .NET 开发人员的技术比较。
当.NET 开发人员评估 PDF 生成解决方案时,CraftMyPDF 成为基于云、模板驱动 API 和基于 Web 编辑器的选择。 然而,纯云架构固有的局限性(包括向外部服务器传输数据、网络延迟和按 PDF 定价)导致许多团队不得不评估内部部署的替代方案。IronPDF提供本地 PDF 生成功能,采用原生 Chromium 渲染技术,无外部依赖性。
本比较从技术相关的维度对两种方法进行了研究,以帮助专业开发人员和架构师针对他们的 .NET PDF 需求做出明智的决定。
了解 CraftMyPDF。
CraftMyPDF 是一个基于云的 API,旨在通过基于网络的拖放模板编辑器促进 PDF 文档的创建。 该服务允许用户直接在浏览器中设计 PDF 模板,支持布局组件、高级格式化、表达式和 JSON 有效载荷的数据绑定。
API 通过 REST 端点运行,要求开发人员将 HTML 模板和数据传输到CraftMyPDF的服务器进行渲染。 根据他们的文档,每个文档的 PDF 生成延迟为 1.5-30 秒,具体取决于复杂性和当前服务器负载。
然而,CraftMyPDF 的纯云架构存在一些局限性。 用户必须在专有模板设计器中工作--不能直接使用标准 HTML/CSS 模板。 由于是纯云计算,不存在内部部署选项,这给处理敏感文件的组织带来了合规性问题。 该服务采用订阅模式,按 PDF 定价。
了解IronPDF
IronPDF 是一个 .NET 库,可使用嵌入式 Chromium 渲染引擎在本地生成 PDF。该库可将 HTML、CSS 和 JavaScript 转换为 PDF,其渲染质量与开发人员在 Chrome 浏览器中看到的相同--提供像素完美的屏幕渲染,而不是打印优化输出。
IronPDF 完全在企业内部运行,这意味着文档数据永远不会离开企业的基础架构。 该库无需调用外部 API、连接互联网或订阅模板编辑器。 一次性永久许可证取代了按 PDF 计算的持续成本。
架构和部署比较
这些 .NET PDF 解决方案的根本区别在于其架构方法。
| 方面 | CraftMyPDF | IronPDF |
|---|---|---|
| 数据位置 | 云(数据离开您的系统) | 内部部署(数据永不丢失) |
| 延迟 | 1.每个 PDF 文件 5-30 秒 | 毫秒 |
| 定价 | 按 PDF 订阅 | 一次性永久许可 |
| 模板系统 | 仅限专有的拖放功能 | 任何 HTML/CSS/JavaScript |
| 输出质量 | 印刷优化 | 像素完美的屏幕渲染 |
| 离线工作 | 否(需要互联网) | 是 |
| 合规性 | 数据叶组织 | 符合 SOC2/HIPAA 标准 |
| 渲染引擎 | 云呈现器 | 本地 Chromium |
CraftMyPDF 要求将每个 HTML 模板和 JSON 数据有效载荷传输到其服务器。 对于发票、合同、医疗记录或任何敏感的商业数据,这将产生 HIPAA、GDPR 和 SOC2 合规性问题。 IronPdf 在本地处理所有内容。
代码比较:常见的 PDF 操作
HTML 到 PDF 转换
将 HTML 内容转换为 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>Hello World</h1><p>This is a PDF from HTML</p>"
}
});
var response = client.Execute(request);
File.WriteAllBytes("output.pdf", response.RawBytes);
}
}// 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);
}
}IRON VB CONVERTER ERROR developers@ironsoftware.comIronPDF:
// 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");
}
}// 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");
}
}IRON VB CONVERTER ERROR developers@ironsoftware.comCraftMyPDF 需要配置 REST 客户端、添加 API key 标头、构建带有模板 ID 的 JSON 体、执行 HTTP 请求、处理响应以及将原始字节写入文件。IronPDF创建一个 ChromePdfRenderer ,调用 RenderHtmlAsPdf() 并保存--无需网络调用、无需 API 密钥、无需模板 ID。
有关高级 HTML 渲染选项,请浏览 HTML 到 PDF 转换指南。
URL到PDF转换
将网页截取为 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 = "pdf"
});
var response = client.Execute(request);
File.WriteAllBytes("webpage.pdf", response.RawBytes);
}
}// 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 = "pdf"
});
var response = client.Execute(request);
File.WriteAllBytes("webpage.pdf", response.RawBytes);
}
}IRON VB CONVERTER ERROR developers@ironsoftware.comIronPDF:
// 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");
}
}// 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");
}
}IRON VB CONVERTER ERROR developers@ironsoftware.comCraftMyPDF 需要相同的 REST 客户端设置,但采用不同的 JSON 有效载荷结构。IronPDF的 RenderUrlAsPdf() 使用 Chromium 直接在本地渲染 URL。
在 URL to PDF 文档中了解有关 URL 呈现的更多信息。
添加页眉和页脚
文档页眉和页脚展示了 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>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);
}
}// 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);
}
}IRON VB CONVERTER ERROR developers@ironsoftware.comIronPDF:
// 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");
}
}// 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");
}
}IRON VB CONVERTER ERROR developers@ironsoftware.comCraftMyPDF 在发送到 API 的 JSON 数据有效载荷中嵌入页眉/页脚内容。IronPDF使用 RenderingOptions.TextHeader 和 RenderingOptions.TextFooter 属性与 TextHeaderFooter 对象,提供无需网络传输的类型化配置。
方法映射参考
对于评估CraftMyPDF迁移或比较功能的开发人员,该映射显示了等价操作:
| CraftMyPDF | IronPDF | 备注 |
|---|---|---|
| <代码>POST /v1/create</ 代码 | <代码>renderer.RenderHtmlAsPdf(html)</代码 | 无需调用 API |
X-API-KEY 标题 | <代码>License.LicenseKey = "..."</ 代码 | 启动时设置一次 |
| <代码>模板id</代码 | 标准 HTML 字符串 | 使用任何 HTML |
{%name%} 占位符 | $"{name}" C# 插值 | 标准 .NET |
| <代码>POST /v1/merge</ 代码 | <代码>PdfDocument.Merge(pdfs)</代码 | 本地即时翻译 |
| <代码>POST /v1/add-watermark</ 代码 | <代码>pdf.ApplyWatermark(html)</代码 | 基于 HTML |
| Webhook 回调 | 不需要 | 结果同步 |
| 费率限制 | 不适用 | 无限制 |
配置映射
| CraftMyPDF 选项 | IronPdf 同等产品 |
|---|---|
page_size:"A4" | <代码>PaperSize = PdfPaperSize.A4</ 代码 |
orientation:"横向"</代码 | <代码>PaperOrientation = Landscape</代码 |
| <代码>margin_top: 20</ 代码 | <代码>MarginTop = 20</ 代码 |
| <代码>标题</代码 | <代码>Html 标头</代码 |
footer | <代码>HtmlFooter</代码 |
| <代码>async:true</代码 | 使用 *Async() 方法 |
功能对比摘要
| 特征 | CraftMyPDF | IronPDF |
|---|---|---|
| HTML 至 PDF | 通过 API 模板 | ✅ 本地 |
| URL 至 PDF | 通过 API | ✅ 本地 |
| 自定义模板 | 仅限专有编辑器 | ✅ 任何 HTML |
| 支持 CSS3 | 有限的 | ✅ 全文 |
| JavaScript 渲染 | 有限的 | ✅ 全文 |
| 合并/拆分 PDF | 通过 API | ✅ 本地 |
| 表格填写 | 通过 API | ✅ 本地 |
| 数字签名 | 通过 API | ✅ 本地 |
| 水印 | 通过 API | ✅ 本地 |
| 离线工作 | ❌ | ✅ |
| 自托管 | ❌ | ✅ |
成本比较
定价模式代表了根本不同的成本结构方法。
CraftMyPDF 费用(每月):
- Lite 计划:19 美元/月,1,200 个 PDF 文档
- 专业版:49 美元/月,5,000 份 PDF
- 企业:99 美元/月,15,000 份 PDF
- 规模100,000 份 PDF = ~$500-600/月
IronPDF 费用(一次性):
- Lite License:749 美元(一名开发人员,一个项目)
- 专业:1,499 美元(无限制项目)
- 一次性付款后永久无限量提供 PDF 文件
盈亏平衡点大约为 2-3 个月,具体取决于 PDF 的数量。
团队何时考虑从CraftMyPDF迁移到 IronPDF?
开发团队评估从CraftMyPDF过渡到IronPDF有几个原因:
数据合规性要求:处理敏感文档(发票、合同、医疗记录、财务数据)的机构不能将这些信息传输到第三方服务器。CraftMyPDF的云架构与 HIPAA、GDPR 和 SOC2 合规性要求相冲突。 IronPdf 在本地处理所有内容。
延迟敏感性:CraftMyPDF 记录的每 PDF 1.5-30 秒的延迟会在大批量或实时场景中造成瓶颈。IronPDF可在几毫秒内生成 PDF,无需网络往返。
成本可预测性:每份 PDF 的订阅成本会随着使用量的增长而不可预测地累积。 每月生成数以千计 PDF 的企业发现,一次性永久许可随着时间的推移会变得更加经济。
模板灵活性:CraftMyPDF 专有的拖放编辑器限制了模板设计选项。 希望使用现有 HTML/CSS 资产或标准网络开发工具的团队更喜欢 IronPdf 的方法,即任何 HTML 都可以成为模板。
输出质量:云 PDF API 通常会针对打印输出进行优化,减少背景并简化颜色。 IronPdf 的 Chromium 引擎可生成像素完美的屏幕渲染,与开发人员在浏览器中看到的效果一致。
离线操作:需要在没有互联网连接的情况下生成 PDF 的应用程序不能使用基于云的 API。IronPdf 可完全离线运行。
架构简化:移除 REST 客户端配置、API 密钥管理、HTTP 错误处理、速率限制逻辑和 webhook 处理程序可显著简化代码库。
优势和考虑因素
CraftMyPDF的优势
- 用户友好界面:基于 Web 的拖放编辑器简化了非开发人员的模板创建过程
- 无需基础设施管理:云托管无需维护服务器
- 跨平台 API:可从任何编程语言访问的 REST API
CraftMyPDF注意事项
- 模板锁定:必须使用专有模板设计器
- 仅限云:无内部部署选项
- 数据传输:在外部服务器上处理的所有文件
- 延迟: 每次生成 PDF 需 1.5-30 秒
- 持续成本:按 PDF 订阅定价
- 互联网依赖性:需要网络连接
IronPDF的优势
IronPDF注意事项
- 开发技能:要求具备创建模板所需的 C# 知识
- 初始设置:与云 API 订阅相比,设置更多
结论
CraftMyPDF 和IronPDF代表了在 .NET 应用程序中生成 PDF 的根本不同方法。CraftMyPDF提供基于云、模板驱动的解决方案,适用于熟悉外部数据处理和订阅定价模式的组织。
IronPdf 提供内部生成 PDF 的功能,可将敏感数据保存在组织边界内,消除网络延迟,并提供可预测的一次性许可成本。 对于要求数据合规性、低延迟、成本可预测性或模板灵活性的团队,IronPDF 可以满足这些特定要求。
随着企业对 .NET 10、C# 14 以及 2026 年之前的应用程序开发进行规划,依赖云生成 PDF 和自托管生成 PDF 之间的架构选择会影响当前的开发模式和长期的运营成本。 团队应根据每种方法的特点评估其具体要求--数据敏感性、预期数量、延迟容忍度和预算限制。