APITemplate io与IronPDF的C# PDF库比较
作为一名 C# 开发人员,我在项目中生成和处理PDF 文件时经常遇到挑战。 高效、可靠且易于集成的 PDF 解决方案是我们这个领域普遍存在的问题。 因此,我决定探索APITemplate和IronPDF这两个流行的工具,它们承诺简化 C# 应用程序中与 PDF 相关的任务。
在本文中,我将分享我使用 APITemplate 和 IronPDF 的实践经验,比较它们的功能、性能和集成能力。 我的目标是为您提供清晰、公正的分析,帮助您为下一个项目做出明智的决定。 当我第一次接触 APITemplate 和 IronPDF 时,就被它们在 C# 开发中解决 PDF 相关难题的潜力所吸引。 让我们来看看这些工具各自提供的功能。
APITemplate

APITemplate 是一项基于云计算的服务,专注于从模板生成 PDF 和图像。 它提供了一个 API,允许开发人员通过向预定义模板发送 JSON 数据来创建文档和图形。 在最初的测试中,我发现 APITemplate 非常简单易用。 我可以使用他们的 Web 界面创建一个模板,然后使用他们的 API 从我的 C# 应用程序中填充数据。
APITemplate 的主要功能
基于模板的生成
APITemplate 的核心优势在于其基于模板的方法。 我可以为文档和图片创建可重复使用的模板,这为我节省了大量重复性工作的时间。 它还提供了一个用于生成 PDF 的标记符模板编辑器。 您可以通过与 Zapier 和其他第三方集成的可重复使用模板生成 PDF。
JSON 数据集成
JSON 数据集成是我经常使用的一项功能。 它使您能够用 JSON 数据填充模板。 这使得与我的 C# 应用程序集成变得异常简单,因为我可以将对象序列化为 JSON 并发送到 API。
API 控制台
API 控制台功能为我节省了很多时间。 有了它,我可以直接从他们的网站上预览和测试 API 调用,帮助我在 C# 代码中实现请求之前进行调试和微调。
可自定义的页眉和页脚
在我的 PDF 文件中添加自定义页眉和页脚的功能非常有价值,尤其是在创建专业报告或发票时。 我可以轻松地加入页码、日期或公司徽标。
IronPDF。
!a href="/static-assets/pdf/blog/apitemplate-io-comparison/apitemplate-io-comparison-2.webp">APITemplate io 和 IronPDF 对 C# PDF 库的比较:图 2
IronPDF则是一个.NET 库,专门用于在 C# 应用程序中进行 PDF 操作。 它提供了广泛的功能,包括 PDF 创建、编辑和转换。 其突出特点之一是能够从 HTML 生成 PDF,这对基于网络的应用程序非常有用。
我第一次使用 IronPDF 的经历是通过 NuGet 安装并将其直接集成到我的 C# 项目中。 它的 API 集成过程非常流畅,这意味着我可以立即在我的项目中使用它。无需依赖外部服务,就能以编程方式轻松创建 PDF 给我留下了深刻印象。
我注意到的关键区别是,APITemplate 在从预定义模板创建文档方面表现出色,而 IronPDF 在您的 C# 代码中提供了更多自定义 PDF 操作的灵活性。 APITemplate 基于云的特性意味着您无需担心生成 PDF 所需的服务器资源,但它确实需要互联网连接。 IronPdf 作为一个本地库,可以离线工作,但会使用您的服务器资源。
IronPDF。。 的主要功能
从 HTML 创建 PDF.
IronPDF 擅长从 HTML 内容生成 PDF。 我已经广泛使用这一功能来动态创建报告和文档。 这就像将 HTML 字符串甚至 URL 传递给库一样简单。 IronPDF 对现代网络标准的广泛支持意味着我从 HTML 内容生成的每个 PDF 都是高质量的文档。
PDF 操作
该功能允许我以编程方式编辑现有的 PDF。 我可以在 PDF 文档中添加文本、图像甚至新页面,这对于更新报告或表格非常有用。
PDF 合并和拆分
我发现这项功能在处理大型文档时特别方便。 IronPDF 可轻松 将多个 PDF 合二为一,或 将单个 PDF 拆分为多个文件。
文本提取
当我需要从 PDF 中提取文本内容进行分析或编制索引时,IronPDF 的文本提取功能就派上了用场。 它能很好地处理各种 PDF 布局,使数据提取变得轻而易举。
表格填写
对于涉及自动完成表单的项目,IronPDF form-filling 功能非常有用。 我可以通过编程填充 PDF 表单,节省手动输入数据的时间。
数字签名
安全性在我的许多项目中至关重要。 IronPDF 允许我在 PDF 中添加数字签名,从而增强文档的真实性和安全性。
密码保护
在处理敏感文档时,我使用 IronPDF 为 PDF 添加密码保护。 这对确保我的机密信息的安全非常有帮助。
PDF 到图像的转换
有时我需要将 PDF 页面转换为图像 以便预览或缩略图。 IronPdf 使这一过程变得简单明了,它只需要我编写几行代码,并支持各种图像格式。
跨平台兼容性
作为一名在跨平台项目上工作的 .NET 开发人员,我很感激 IronPDF 能够在不同操作系统之间无缝工作,这要归功于它的 .NET Standard 支持。
为您的 C# 项目设置 IronPDF 和 APITemplate
在 C# 项目中设置这些工具相当简单。 我将根据自己的经验向您介绍 IronPDF 和 APITemplate 的翻译过程。
IronPDF。。
要在我的 C# 项目中设置 IronPdf,我遵循以下步骤:
1.在 Visual Studio 中打开我的项目。
2.使用 NuGet 包管理器安装 IronPDF。 我要么使用 NuGet 软件包管理器,要么使用软件包管理器控制台。
1.在 NuGet 包管理器中搜索 IronPDF 并安装。
!a href="/static-assets/pdf/blog/apitemplate-io-comparison/apitemplate-io-comparison-3.webp">APITemplate io 和 IronPDF 对 C# PDF 库的比较:图 3
2.或者,我在软件包管理器控制台中运行
:ProductInstall :ProductInstall!a href="/static-assets/pdf/blog/apitemplate-io-comparison/apitemplate-io-comparison-4.webp">APITemplate io 和 IronPDF 对 C# PDF 库的比较:图 4
3.安装后,我在 C# 文件顶部添加了必要的 using 语句:
using IronPdf; using IronPdf;4.为了激活许可证,我在应用程序启动时添加了这一行:
IronPdf.License.LicenseKey = "YOUR-LICENSE-KEY-HERE"; IronPdf.License.LicenseKey = "YOUR-LICENSE-KEY-HERE";就是这样! 现在我可以开始在我的代码中使用 IronPDF 了。
APITemplate
对于 APITemplate 而言,由于它是一个基于 Web 的 API,因此设置过程有些不同:
1.首先,我在他们的网站上注册了一个 APITemplate 账户。 2.注册后,我导航到 API 部分以获取我的 API 密钥。
- 在我的 C# 项目中,我不需要安装任何特定的包。 我通常使用内置的 HttpClient 来进行 API 调用。
4.我将安全地存储 API 密钥。 在开发过程中,我可能会使用用户机密:
dotnet user-secrets set "APITemplate:ApiKey" "YOUR-API-KEY-HERE" dotnet user-secrets set "APITemplate:ApiKey" "YOUR-API-KEY-HERE"5.在我的代码中,我使用 API 密钥设置了 HttpClient:
using System.Net.Http;
using System.Net.Http.Headers;
var client = new HttpClient();
client.DefaultRequestHeaders.Add("X-API-KEY", Configuration["APITemplate:ApiKey"]); using System.Net.Http;
using System.Net.Http.Headers;
var client = new HttpClient();
client.DefaultRequestHeaders.Add("X-API-KEY", Configuration["APITemplate:ApiKey"]);6.现在我已经准备好对 APITemplate 进行 API 调用了。
在本项目中,我将使用 APITemplate 的 GitHub 官方示例项目,该项目已配置完成,您只需添加模板密钥即可。 完成这些设置后,我就可以开始在我的 C# 项目中使用 IronPdf 和 APITemplate 了。 IronPDF 在我的应用程序内本地运行,而 APITemplate 需要互联网连接才能与其服务器通信。
IronPDF。 与 APITemplate 的高级功能对比
作为一名 C# 开发人员,我有机会探索了 IronPDF 和 APITemplate。 让我们来看看他们的一些高级功能,这些功能给我留下了深刻的印象。
IronPDF。。 高级功能
支持 JavaScript 的 HTML 到 PDF 转换
IronPDF 的HTML 转 PDF功能令人印象深刻。它不仅能渲染静态 HTML,还能处理 JavaScript。 这在处理动态网页内容时对我来说是一个很大的优势。
下面是我如何使用它的一个快速示例:
var Renderer = new ChromePdfRenderer();
string htmlContent = @"
<html>
<body>
<h1>Dynamic Chart</h1>
<canvas id='myChart'></canvas>
<script src='https://cdn.jsdelivr.net/npm/chart.js'></script>
<script>
var ctx = document.getElementById('myChart').getContext('2d');
new Chart(ctx, {
type: 'bar',
data: {
labels: ['Red', 'Blue', 'Yellow', 'Green', 'Purple', 'Orange'],
datasets: [{
label: '# of Votes',
data: [12, 19, 3, 5, 2, 3],
backgroundColor: [
'rgba(255, 99, 132, 0.2)',
'rgba(54, 162, 235, 0.2)',
'rgba(255, 206, 86, 0.2)',
'rgba(75, 192, 192, 0.2)',
'rgba(153, 102, 255, 0.2)',
'rgba(255, 159, 64, 0.2)'
],
borderColor: [
'rgba(255, 99, 132, 1)',
'rgba(54, 162, 235, 1)',
'rgba(255, 206, 86, 1)',
'rgba(75, 192, 192, 1)',
'rgba(153, 102, 255, 1)',
'rgba(255, 159, 64, 1)'
],
borderWidth: 1
}]
},
options: {
scales: {
y: {
beginAtZero: true
}
}
}
});
</script>
</body>
</html>";
var PDF = Renderer.RenderHtmlAsPdf(htmlContent);
PDF.SaveAs("dynamic_chart.pdf");var Renderer = new ChromePdfRenderer();
string htmlContent = @"
<html>
<body>
<h1>Dynamic Chart</h1>
<canvas id='myChart'></canvas>
<script src='https://cdn.jsdelivr.net/npm/chart.js'></script>
<script>
var ctx = document.getElementById('myChart').getContext('2d');
new Chart(ctx, {
type: 'bar',
data: {
labels: ['Red', 'Blue', 'Yellow', 'Green', 'Purple', 'Orange'],
datasets: [{
label: '# of Votes',
data: [12, 19, 3, 5, 2, 3],
backgroundColor: [
'rgba(255, 99, 132, 0.2)',
'rgba(54, 162, 235, 0.2)',
'rgba(255, 206, 86, 0.2)',
'rgba(75, 192, 192, 0.2)',
'rgba(153, 102, 255, 0.2)',
'rgba(255, 159, 64, 0.2)'
],
borderColor: [
'rgba(255, 99, 132, 1)',
'rgba(54, 162, 235, 1)',
'rgba(255, 206, 86, 1)',
'rgba(75, 192, 192, 1)',
'rgba(153, 102, 255, 1)',
'rgba(255, 159, 64, 1)'
],
borderWidth: 1
}]
},
options: {
scales: {
y: {
beginAtZero: true
}
}
}
});
</script>
</body>
</html>";
var PDF = Renderer.RenderHtmlAsPdf(htmlContent);
PDF.SaveAs("dynamic_chart.pdf");该代码使用 Chart.js 生成带有动态图表的 PDF。 JavaScript 将在 PDF 创建过程中执行,生成包含渲染图表的 PDF。 我曾用它来创建数据经常变化的动态报告,省去了手动更新图表和图形的麻烦。
!a href="/static-assets/pdf/blog/apitemplate-io-comparison/apitemplate-io-comparison-5.webp">APITemplate io 和 IronPDF 对 C# PDF 库的比较:图 5
能够像本例中的 Chart.js 那样添加外部脚本,意味着我可以使用强大的 JavaScript 库在我的 PDF 中创建丰富的动态内容。 此外,该功能允许我在 HTML 中使用 CSS 和响应式设计技术,确保生成的 PDF 在各种设备和打印格式上都非常美观。 我甚至使用媒体查询来创建 PDF,以便从同一个 HTML 源中优化屏幕查看和打印。
PDF 加密和解密
在我的许多项目中,安全至关重要,尤其是在处理敏感信息时。 IronPdf 的加密和解密功能在这些情况下发挥了无价之宝的作用。
var pdf = PdfDocument.FromFile("input.pdf");
// Set user password (for opening the document)
pdf.Password = "user_password";
// Set owner password (for editing, printing, etc.)
pdf.OwnerPassword = "owner_password";
// Set specific permissions
pdf.SecuritySettings.AllowUserPrinting = IronPdf.Security.PdfPrintSecurity.NoPrint;
pdf.SecuritySettings.AllowUserCopyPasteContent = false;
pdf.SecuritySettings.AllowUserEdits = IronPdf.Security.PdfEditSecurity.NoEdit;
pdf.SaveAs("highly_secured.pdf");var pdf = PdfDocument.FromFile("input.pdf");
// Set user password (for opening the document)
pdf.Password = "user_password";
// Set owner password (for editing, printing, etc.)
pdf.OwnerPassword = "owner_password";
// Set specific permissions
pdf.SecuritySettings.AllowUserPrinting = IronPdf.Security.PdfPrintSecurity.NoPrint;
pdf.SecuritySettings.AllowUserCopyPasteContent = false;
pdf.SecuritySettings.AllowUserEdits = IronPdf.Security.PdfEditSecurity.NoEdit;
pdf.SaveAs("highly_secured.pdf");!a href="/static-assets/pdf/blog/apitemplate-io-comparison/apitemplate-io-comparison-6.webp">APITemplate io 和 IronPDF 对 C# PDF 库的比较:图 6
该代码不仅使用用户密码对 PDF 进行加密,还设置了所有者密码,可对 permissions 进行细粒度控制。 我可以明确规定用户可以和不可以对 PDF 进行哪些操作,例如打印或复制内容。
在解密方面,我经常使用这种方法:
try
{
var pdf = PdfDocument.FromFile("encrypted.pdf", "user_password");
pdf.SecuritySettings.RemovePasswordsAndEncryption();
pdf.SaveAs("decrypted.pdf");
Console.WriteLine("PDF decrypted successfully!");
}
catch (Exception ex)
{
Console.WriteLine($"Decryption failed: {ex.Message}");
}try
{
var pdf = PdfDocument.FromFile("encrypted.pdf", "user_password");
pdf.SecuritySettings.RemovePasswordsAndEncryption();
pdf.SaveAs("decrypted.pdf");
Console.WriteLine("PDF decrypted successfully!");
}
catch (Exception ex)
{
Console.WriteLine($"Decryption failed: {ex.Message}");
}这段代码尝试用用户密码打开加密的 PDF,移除所有安全限制,并将其保存为新的未加密文件。try-catch 块有助于处理密码可能不正确的情况。
我曾在不同的场景中使用过这些功能,例如创建安全的文档管理系统,不同的用户对 PDF 有不同级别的访问权限。 例如,在一个医疗记录系统中,我确保病人的敏感信息经过加密,只有经过授权的人员才能访问。
PDF 压缩
在处理大量 PDF 文件时,文件大小成为一个关键因素。 IronPDF 的压缩功能是管理存储和带宽限制的救星。
下面是一个更高级的例子,说明我是如何使用压缩技术的:
using IronPdf;
using System.IO;
using PdfDocument = IronPdf.PdfDocument;
var PDF = PdfDocument.FromFile(@"F:/Test.pdf");
// Compress images
PDF.CompressImages(80); // 80% quality
// Compress fonts
PDF.CompressStructTree();
// Save the compressed PDF
PDF.SaveAs(@"F:/highly_compressed.pdf");
// Compare file sizes
var originalSize = new FileInfo(@"F:/Test.pdf").Length;
var compressedSize = new FileInfo(@"F:/highly_compressed.pdf").Length;
var compressionRatio = (1 - (double)compressedSize / originalSize) * 100;
Console.WriteLine($"Original size: {originalSize / 1024} KB");
Console.WriteLine($"Compressed size: {compressedSize / 1024} KB");
Console.WriteLine($"Compression ratio: {compressionRatio:F2}%");using IronPdf;
using System.IO;
using PdfDocument = IronPdf.PdfDocument;
var PDF = PdfDocument.FromFile(@"F:/Test.pdf");
// Compress images
PDF.CompressImages(80); // 80% quality
// Compress fonts
PDF.CompressStructTree();
// Save the compressed PDF
PDF.SaveAs(@"F:/highly_compressed.pdf");
// Compare file sizes
var originalSize = new FileInfo(@"F:/Test.pdf").Length;
var compressedSize = new FileInfo(@"F:/highly_compressed.pdf").Length;
var compressionRatio = (1 - (double)compressedSize / originalSize) * 100;
Console.WriteLine($"Original size: {originalSize / 1024} KB");
Console.WriteLine($"Compressed size: {compressedSize / 1024} KB");
Console.WriteLine($"Compression ratio: {compressionRatio:F2}%");结果如下
!a href="/static-assets/pdf/blog/apitemplate-io-comparison/apitemplate-io-comparison-7.webp">APITemplate io 和 IronPDF 对 C# PDF 库的比较:图 7
我发现这种技术组合在减少文件大小方面非常有效,同时又不会对质量产生重大影响。
我曾在不同的场景中使用过这项功能:
1.电子邮件附件:通过电子邮件发送 PDF 文件时,我会对其进行压缩,以确保它们不会超过附件大小限制。
- Web 应用程序:对于需要用户下载的 PDF 文件,压缩有助于减少加载时间和带宽使用。 3.归档:当需要长期保存大量 PDF 文件时,压缩可以显著降低存储成本。
在一个项目中,我为一家律师事务所开发文档管理系统。 他们有数千份 PDF 格式的案例文件,其中许多是扫描文件,文件大小很大。 通过实施这种压缩技术,我们将他们的存储需求降低了 60% 以上,从而大大节省了云存储费用。
数字签名
在 PDF 文件中添加数字签名是许多业务流程的必备功能,可确保文件的真实性和不可抵赖性。 IronPDF 让这项复杂的任务变得出奇地简单。 下面是我如何实现数字签名的一个更详细的示例:
using IronPdf;
using IronPdf.Signing;
var renderer = new ChromePdfRenderer();
var pdf = PdfDocument.FromFile(@"F:/Contract.pdf");
var signature = new IronPdf.Signing.PdfSignature(@"F:/Iron.pfx", "123")
{
// Step 3. Optional signing options and a handwritten signature graphic
SigningContact = "support@ironsoftware.com",
SigningLocation = "New York, USA",
SigningReason = "Signing PDF"
};
pdf.Sign(signature);
pdf.SaveAs(@"F:/signed.pdf");using IronPdf;
using IronPdf.Signing;
var renderer = new ChromePdfRenderer();
var pdf = PdfDocument.FromFile(@"F:/Contract.pdf");
var signature = new IronPdf.Signing.PdfSignature(@"F:/Iron.pfx", "123")
{
// Step 3. Optional signing options and a handwritten signature graphic
SigningContact = "support@ironsoftware.com",
SigningLocation = "New York, USA",
SigningReason = "Signing PDF"
};
pdf.Sign(signature);
pdf.SaveAs(@"F:/signed.pdf");我已经在多个实际应用中使用了这一功能:
1.合同管理系统:我们为一家需要以电子方式发送和接收已签署合同的公司实施了该系统。 数字签名确保了合同的法律效力。 2.医疗记录系统:在医疗保健应用中,我们使用数字签名,使医生能够签署患者记录和处方。 3.政府文件处理:我们为一个政府机构实施了一个系统,该系统可以对官方文件进行数字签名。
PDF 拆分和合并
分割和合并 PDF 文件的功能是我在文档管理系统中经常使用的一项基本功能。 IronPdf 对这些功能的实现既强大又灵活。 下面是一个更高级的拆分和合并 PDF 的示例:
using IronPdf;
class Program
{
static void Main(string[] args)
{
// Create first PDF with three pages
const string html_a = @"
<h1>Document A</h1>
<p>This is the first page of Document A.</p>
<div style='page-break-after: always;'></div>
<h2>Document A - Page 2</h2>
<p>This is the second page of Document A.</p>
<div style='page-break-after: always;'></div>
<h2>Document A - Page 3</h2>
<p>This is the third and final page of Document A.</p>";
// Create second PDF with two pages
const string html_b = @"
<h1>Document B</h1>
<p>Welcome to the first page of Document B.</p>
<div style='page-break-after: always;'></div>
<h2>Document B - Page 2</h2>
<p>This is the second and last page of Document B.</p>";
// Render HTML to PDF
var renderer = new ChromePdfRenderer();
var pdfdoc_a = renderer.RenderHtmlAsPdf(html_a);
var pdfdoc_b = renderer.RenderHtmlAsPdf(html_b);
// Merge PDFs
var merged = PdfDocument.Merge(pdfdoc_a, pdfdoc_b);
merged.SaveAs(@"F:/IronPdf/MergedDocument.pdf");
Console.WriteLine("Merged PDF created: MergedDocument.pdf");
// Load the merged PDF
var pdf = PdfDocument.FromFile(@"F:/IronPdf/MergedDocument.pdf");
// Extract the first page
var firstPage = pdf.CopyPage(0);
firstPage.SaveAs(@"F:/IronPdf/FirstPageOnly.pdf");
Console.WriteLine("First page extracted: FirstPageOnly.pdf");
// Extract pages 2 to 4 (note: index starts at 0)
var middlePages = pdf.CopyPages(1, 3);
middlePages.SaveAs(@"F:/IronPdf/Pages2to4.pdf");
Console.WriteLine("Pages 2 to 4 extracted: Pages2to4.pdf");
Console.WriteLine("Process completed. Press any key to exit.");
Console.ReadKey();
}
}using IronPdf;
class Program
{
static void Main(string[] args)
{
// Create first PDF with three pages
const string html_a = @"
<h1>Document A</h1>
<p>This is the first page of Document A.</p>
<div style='page-break-after: always;'></div>
<h2>Document A - Page 2</h2>
<p>This is the second page of Document A.</p>
<div style='page-break-after: always;'></div>
<h2>Document A - Page 3</h2>
<p>This is the third and final page of Document A.</p>";
// Create second PDF with two pages
const string html_b = @"
<h1>Document B</h1>
<p>Welcome to the first page of Document B.</p>
<div style='page-break-after: always;'></div>
<h2>Document B - Page 2</h2>
<p>This is the second and last page of Document B.</p>";
// Render HTML to PDF
var renderer = new ChromePdfRenderer();
var pdfdoc_a = renderer.RenderHtmlAsPdf(html_a);
var pdfdoc_b = renderer.RenderHtmlAsPdf(html_b);
// Merge PDFs
var merged = PdfDocument.Merge(pdfdoc_a, pdfdoc_b);
merged.SaveAs(@"F:/IronPdf/MergedDocument.pdf");
Console.WriteLine("Merged PDF created: MergedDocument.pdf");
// Load the merged PDF
var pdf = PdfDocument.FromFile(@"F:/IronPdf/MergedDocument.pdf");
// Extract the first page
var firstPage = pdf.CopyPage(0);
firstPage.SaveAs(@"F:/IronPdf/FirstPageOnly.pdf");
Console.WriteLine("First page extracted: FirstPageOnly.pdf");
// Extract pages 2 to 4 (note: index starts at 0)
var middlePages = pdf.CopyPages(1, 3);
middlePages.SaveAs(@"F:/IronPdf/Pages2to4.pdf");
Console.WriteLine("Pages 2 to 4 extracted: Pages2to4.pdf");
Console.WriteLine("Process completed. Press any key to exit.");
Console.ReadKey();
}
}!a href="/static-assets/pdf/blog/apitemplate-io-comparison/apitemplate-io-comparison-8.webp">APITemplate io 和 IronPDF 对 C# PDF 库的比较:图 8
以下是代码生成的合并文档:
!a href="/static-assets/pdf/blog/apitemplate-io-comparison/apitemplate-io-comparison-9.webp">APITemplate io 和 IronPDF 对 C# PDF 库的比较:图 9
表格填写
在我的许多项目中,自动表单填写节省了大量时间。 IronPDF 允许我以编程方式填充 PDF 表单,这对于处理大量表单或创建个性化文档来说非常宝贵。 下面是一个更全面的表格填写示例:
using IronPdf;
using System;
// Load the combined form
PdfDocument pdf = PdfDocument.FromFile(@"F:/completeForm.pdf");
// Handle radio buttons
var radioForm = pdf.Form.FindFormField("traveltype");
radioForm.Value = "Airplane";
// Handle checkbox
var checkboxForm = pdf.Form.FindFormField("taskCompleted");
checkboxForm.Value = "Yes";
// Handle combobox
var comboboxForm = pdf.Form.FindFormField("priority");
comboboxForm.Value = "Low";
// Print out all the available choices for combobox
foreach (var choice in comboboxForm.Choices)
{
Console.WriteLine(choice);
}
// Handle text inputs
pdf.Form.FindFormField("firstname").Value = "John";
pdf.Form.FindFormField("lastname").Value = "Smith";
// Handle text area
pdf.Form.FindFormField("address").Value = "Iron Software\r\n205 N. Michigan Ave.";
// Save the edited PDF
pdf.SaveAs(@"F:/completeFormEdited.pdf");using IronPdf;
using System;
// Load the combined form
PdfDocument pdf = PdfDocument.FromFile(@"F:/completeForm.pdf");
// Handle radio buttons
var radioForm = pdf.Form.FindFormField("traveltype");
radioForm.Value = "Airplane";
// Handle checkbox
var checkboxForm = pdf.Form.FindFormField("taskCompleted");
checkboxForm.Value = "Yes";
// Handle combobox
var comboboxForm = pdf.Form.FindFormField("priority");
comboboxForm.Value = "Low";
// Print out all the available choices for combobox
foreach (var choice in comboboxForm.Choices)
{
Console.WriteLine(choice);
}
// Handle text inputs
pdf.Form.FindFormField("firstname").Value = "John";
pdf.Form.FindFormField("lastname").Value = "Smith";
// Handle text area
pdf.Form.FindFormField("address").Value = "Iron Software\r\n205 N. Michigan Ave.";
// Save the edited PDF
pdf.SaveAs(@"F:/completeFormEdited.pdf");我已经在多个实际应用中使用了这一功能:
1.人力资源入职系统:我们创建了一个系统,可根据人力资源数据库中的信息自动填写新员工文书,从而节省了人工数据录入的时间。
2.保险索赔处理:我们为一家保险公司建立了一个系统,可在索赔表中预先填写投保人信息,大大加快了索赔提交流程。
3.学校申请系统:在一个教育项目中,我们实施了一个根据学生数据填写学校申请表的系统,使学生和行政人员的申请流程更加简便。
4.税表生成:我们为一家会计师事务所创建了一个系统,该系统可根据客户财务数据自动填写税表,从而在报税季节减少错误并节省时间。
以编程方式填写表格的能力已成为许多业务流程实现自动化的关键因素,从而大大节省了时间,减少了手动数据录入的错误。
水印
在 PDF 文件中添加水印通常是品牌、安全或状态指示所必需的。 IronPdf 提供灵活的水印功能,我发现它在很多项目中都很有用。 下面是我如何使用水印的一个更详细的例子:
using IronPdf;
using IronSoftware.Drawing;
string watermarkHtml = @"
<img style='width: 250px;' src='https://ironsoftware.com/img/products/ironpdf-logo-text-dotnet.svg'>
<h1>Iron Software</h1>";
ChromePdfRenderer renderer = new ChromePdfRenderer();
PdfDocument pdf = renderer.RenderHtmlAsPdf("<h1>Watermark</h1>");
// Apply watermark with 45 degrees rotation and 70% opacity
pdf.ApplyWatermark(watermarkHtml, rotation: 30, opacity: 90);
pdf.SaveAs("watermarkOpacity&Rotation.pdf");using IronPdf;
using IronSoftware.Drawing;
string watermarkHtml = @"
<img style='width: 250px;' src='https://ironsoftware.com/img/products/ironpdf-logo-text-dotnet.svg'>
<h1>Iron Software</h1>";
ChromePdfRenderer renderer = new ChromePdfRenderer();
PdfDocument pdf = renderer.RenderHtmlAsPdf("<h1>Watermark</h1>");
// Apply watermark with 45 degrees rotation and 70% opacity
pdf.ApplyWatermark(watermarkHtml, rotation: 30, opacity: 90);
pdf.SaveAs("watermarkOpacity&Rotation.pdf");!a href="/static-assets/pdf/blog/apitemplate-io-comparison/apitemplate-io-comparison-10.webp">APITemplate io 和 IronPDF 对 C# PDF 库的比较:图 10
APITemplate 高级功能
动态模板生成
APITemplate 的动态模板生成功能非常强大,可以使用自定义 JSON 数据创建高度可定制的文档。 APITemplate 的 API 支持动态组件。 您可以获得代码的 PDF 和图片输出。 在 API 控制台中,我可以使用所见即所得编辑器轻松生成 PDF 文档。
让我们来看看我是如何在项目中运用这项技术的。
using System;
using System.IO;
using System.Net.Http;
using System.Text.Json;
using System.Threading.Tasks;
namespace csharp
{
class ReturnContent
{
public string download_url { get; set; }
public string status { get; set; }
}
class Program
{
static async Task Main(string[] args)
{
var api_key = "a9e4MjA2NTg6MTc3Njk6Uk1ZSzVjTWs1T3d6VE9Mdw=";
var template_id = "bf077b23b4a407ae";
var url = $"https://rest.apitemplate.io/v2/create-pdf?template_id={template_id}";
var data = new
{
date = "15/05/2022",
invoice_no = "435568799",
sender_address1 = "3244 Jurong Drive",
sender_address2 = "Falmouth Maine 1703",
sender_phone = "255-781-6789",
sender_email = "dev@ironsoftware.com",
rece_addess1 = "2354 Lakeside Drive",
rece_addess2 = "New York 234562 ",
rece_phone = "34333-84-223",
rece_email = "info@ironsoftware.com",
items = new[]
{
new { item_name = "Oil", unit = 1, unit_price = 100, total = 100 },
new { item_name = "Rice", unit = 2, unit_price = 200, total = 400 },
new { item_name = "Orange", unit = 7, unit_price = 20, total = 1400 }
},
total = "total",
footer_email = "info@ironsoftware.com"
};
var json_content = JsonSerializer.Serialize(data);
var buffer = System.Text.Encoding.UTF8.GetBytes(json_content);
var byteContent = new ByteArrayContent(buffer);
Console.WriteLine(json_content);
var client = new HttpClient();
client.DefaultRequestHeaders.Add("X-API-KEY", api_key);
var response = await client.PostAsync(url, byteContent);
var ret = await response.Content.ReadAsStringAsync();
var returnContent = JsonSerializer.Deserialize<ReturnContent>(ret);
if (returnContent.status == "success")
{
Console.WriteLine($"Downloading {returnContent.download_url}...");
var download_response = await client.GetAsync(returnContent.download_url);
using (var stream = await download_response.Content.ReadAsStreamAsync())
{
var fileInfo = new FileInfo(@"F:/generated_document.pdf");
using (var fileStream = fileInfo.OpenWrite())
{
await stream.CopyToAsync(fileStream);
}
}
Console.WriteLine("PDF file has been downloaded and saved as 'generated_document.pdf'");
}
}
}
}using System;
using System.IO;
using System.Net.Http;
using System.Text.Json;
using System.Threading.Tasks;
namespace csharp
{
class ReturnContent
{
public string download_url { get; set; }
public string status { get; set; }
}
class Program
{
static async Task Main(string[] args)
{
var api_key = "a9e4MjA2NTg6MTc3Njk6Uk1ZSzVjTWs1T3d6VE9Mdw=";
var template_id = "bf077b23b4a407ae";
var url = $"https://rest.apitemplate.io/v2/create-pdf?template_id={template_id}";
var data = new
{
date = "15/05/2022",
invoice_no = "435568799",
sender_address1 = "3244 Jurong Drive",
sender_address2 = "Falmouth Maine 1703",
sender_phone = "255-781-6789",
sender_email = "dev@ironsoftware.com",
rece_addess1 = "2354 Lakeside Drive",
rece_addess2 = "New York 234562 ",
rece_phone = "34333-84-223",
rece_email = "info@ironsoftware.com",
items = new[]
{
new { item_name = "Oil", unit = 1, unit_price = 100, total = 100 },
new { item_name = "Rice", unit = 2, unit_price = 200, total = 400 },
new { item_name = "Orange", unit = 7, unit_price = 20, total = 1400 }
},
total = "total",
footer_email = "info@ironsoftware.com"
};
var json_content = JsonSerializer.Serialize(data);
var buffer = System.Text.Encoding.UTF8.GetBytes(json_content);
var byteContent = new ByteArrayContent(buffer);
Console.WriteLine(json_content);
var client = new HttpClient();
client.DefaultRequestHeaders.Add("X-API-KEY", api_key);
var response = await client.PostAsync(url, byteContent);
var ret = await response.Content.ReadAsStringAsync();
var returnContent = JsonSerializer.Deserialize<ReturnContent>(ret);
if (returnContent.status == "success")
{
Console.WriteLine($"Downloading {returnContent.download_url}...");
var download_response = await client.GetAsync(returnContent.download_url);
using (var stream = await download_response.Content.ReadAsStreamAsync())
{
var fileInfo = new FileInfo(@"F:/generated_document.pdf");
using (var fileStream = fileInfo.OpenWrite())
{
await stream.CopyToAsync(fileStream);
}
}
Console.WriteLine("PDF file has been downloaded and saved as 'generated_document.pdf'");
}
}
}
}!a href="/static-assets/pdf/blog/apitemplate-io-comparison/apitemplate-io-comparison-11.webp">APITemplate io 和 IronPDF 对 C# PDF 库的比较:图 11
这是生成的 PDF 文档:
!a href="/static-assets/pdf/blog/apitemplate-io-comparison/apitemplate-io-comparison-12.webp">APITemplate io 和 IronPDF 对 C# PDF 库的比较:图 12
批量生成 PDF
APITemplate 的批量 PDF 生成功能在一次 API 调用中创建多个文档时具有显著优势。 下面是我如何使用它的一个更详细的例子:
using System;
using System.IO;
using System.Net.Http;
using System.Text.Json;
using System.Threading.Tasks;
using System.Collections.Generic;
namespace csharp
{
class ReturnContent
{
public string download_url { get; set; }
public string status { get; set; }
}
class Program
{
static async Task Main(string[] args)
{
var api_key = "a9e4MjA2NTg6MTc3Njk6Uk1ZSzVjTWs1T3d6VE9Mdw=";
var template_id = "d4f77b23b4ab09fa";
var url = $"https://rest.apitemplate.io/v2/create-pdf?template_id={template_id}";
var membershipCards = new List<object>
{
new { name = "Iron Dev 1", email = "dev1@ironsoftware.com", membership_id = "M001", expiry_date = "2024-12-31" },
new { name = "Iron Dev 2", email = "dev2@ironsoftware.com", membership_id = "M002", expiry_date = "2025-06-30" },
new { name = "Iron Dev 3", email = "dev3@ironsoftware.com", membership_id = "M003", expiry_date = "2024-09-15" }
};
var client = new HttpClient();
client.DefaultRequestHeaders.Add("X-API-KEY", api_key);
for (int i = 0; i < membershipCards.Count; i++)
{
var json_content = JsonSerializer.Serialize(membershipCards[i]);
var buffer = System.Text.Encoding.UTF8.GetBytes(json_content);
var byteContent = new ByteArrayContent(buffer);
Console.WriteLine($"Creating PDF for {((dynamic)membershipCards[i]).name}...");
var response = await client.PostAsync(url, byteContent);
var ret = await response.Content.ReadAsStringAsync();
var returnContent = JsonSerializer.Deserialize<ReturnContent>(ret);
if (returnContent.status == "success")
{
Console.WriteLine($"Downloading {returnContent.download_url}...");
var download_response = await client.GetAsync(returnContent.download_url);
using (var stream = await download_response.Content.ReadAsStreamAsync())
{
var fileInfo = new FileInfo($"F:/membership_card_{i + 1}.pdf");
using (var fileStream = fileInfo.OpenWrite())
{
await stream.CopyToAsync(fileStream);
}
}
Console.WriteLine($"PDF file has been downloaded and saved as 'membership_card_{i + 1}.pdf'");
}
else
{
Console.WriteLine($"Failed to create PDF for {((dynamic)membershipCards[i]).name}. Status: {returnContent.status}");
}
}
}
}
}using System;
using System.IO;
using System.Net.Http;
using System.Text.Json;
using System.Threading.Tasks;
using System.Collections.Generic;
namespace csharp
{
class ReturnContent
{
public string download_url { get; set; }
public string status { get; set; }
}
class Program
{
static async Task Main(string[] args)
{
var api_key = "a9e4MjA2NTg6MTc3Njk6Uk1ZSzVjTWs1T3d6VE9Mdw=";
var template_id = "d4f77b23b4ab09fa";
var url = $"https://rest.apitemplate.io/v2/create-pdf?template_id={template_id}";
var membershipCards = new List<object>
{
new { name = "Iron Dev 1", email = "dev1@ironsoftware.com", membership_id = "M001", expiry_date = "2024-12-31" },
new { name = "Iron Dev 2", email = "dev2@ironsoftware.com", membership_id = "M002", expiry_date = "2025-06-30" },
new { name = "Iron Dev 3", email = "dev3@ironsoftware.com", membership_id = "M003", expiry_date = "2024-09-15" }
};
var client = new HttpClient();
client.DefaultRequestHeaders.Add("X-API-KEY", api_key);
for (int i = 0; i < membershipCards.Count; i++)
{
var json_content = JsonSerializer.Serialize(membershipCards[i]);
var buffer = System.Text.Encoding.UTF8.GetBytes(json_content);
var byteContent = new ByteArrayContent(buffer);
Console.WriteLine($"Creating PDF for {((dynamic)membershipCards[i]).name}...");
var response = await client.PostAsync(url, byteContent);
var ret = await response.Content.ReadAsStringAsync();
var returnContent = JsonSerializer.Deserialize<ReturnContent>(ret);
if (returnContent.status == "success")
{
Console.WriteLine($"Downloading {returnContent.download_url}...");
var download_response = await client.GetAsync(returnContent.download_url);
using (var stream = await download_response.Content.ReadAsStreamAsync())
{
var fileInfo = new FileInfo($"F:/membership_card_{i + 1}.pdf");
using (var fileStream = fileInfo.OpenWrite())
{
await stream.CopyToAsync(fileStream);
}
}
Console.WriteLine($"PDF file has been downloaded and saved as 'membership_card_{i + 1}.pdf'");
}
else
{
Console.WriteLine($"Failed to create PDF for {((dynamic)membershipCards[i]).name}. Status: {returnContent.status}");
}
}
}
}
}该代码只需调用一次 API 即可生成多张会员卡。 每张卡片都根据个人会员信息进行定制。 下面是由该代码生成的一张卡片:
!a href="/static-assets/pdf/blog/apitemplate-io-comparison/apitemplate-io-comparison-13.webp">APITemplate io 和 IronPDF 对 C# PDF 库的比较:图 13
图像生成
虽然生成 PDF 是 APITemplate 的主要功能,但其图像生成功能同样令人印象深刻,允许您使用控制台中的模板生成社交媒体图片。 它还提供了响应式图像智能裁剪功能。横幅生成 API 与图像 API 相同。 下面是我使用它的一个更复杂的例子:
using System;
using System.IO;
using System.Net.Http;
using System.Text;
using System.Text.Json;
using System.Threading.Tasks;
namespace csharp
{
class ReturnContent
{
public string download_url { get; set; }
public string status { get; set; }
}
class Program
{
static async Task Main(string[] args)
{
var api_key = "a9e4MjA2NTg6MTc3Njk6Uk1ZSzVjTWs1T3d6VE9Mdw=";
var template_id = "f4377b23b4aeeed0";
var url = $"https://rest.apitemplate.io/v2/create-image?template_id={template_id}";
var json_content = @"{
""overrides"": [
{
""name"": ""rect_image_bg"",
""stroke"": ""grey"",
""src"": ""https://images.unsplash.com/photo-1542401886-65d6c61db217?crop=entropy&cs=tinysrgb&fit=max&fm=jpg&ixid=MnwxOTc1MDZ8MHwxfHNlYXJjaHwzfHxkZXNlcnR8ZW58MHwwfHx8MTYyMTUxOTI2OA&ixlib=rb-1.2.1&q=80&w=1080""
},
{
""name"": ""rect_container"",
""stroke"": ""grey"",
""backgroundColor"": ""rgba(255, 255, 255, 0.62)""
},
{
""name"": ""text_quote"",
""text"": ""Just witnessed the most breathtaking sunset over the Sahara. The way the light dances on the dunes, painting the sky in shades of orange and purple, is truly magical. Nature's artistry at its finest! #DesertAdventures #SaharaSkies"",
""textBackgroundColor"": ""rgba(246, 243, 243, 0)"",
""color"": ""#414141""
},
{
""name"": ""text_footer"",
""text"": ""2024-07-30 - Twitter - iPhone 16 Pro"",
""textBackgroundColor"": ""rgba(246, 243, 243, 0)"",
""color"": ""#666666""
},
{
""name"": ""circle_profile"",
""stroke"": ""grey"",
""src"": ""https://images.unsplash.com/photo-1520998116484-6eeb2f72b5b9?crop=entropy&cs=tinysrgb&fit=max&fm=jpg&ixid=MnwxOTc1MDZ8MHwxfHNlYXJjaHw2Mnx8aGFwcHl8ZW58MHwwfHx8MTYyMTY5MjkwNw&ixlib=rb-1.2.1&q=80&w=1080""
},
{
""name"": ""text_name"",
""text"": ""Sarah Wanderlust"",
""textBackgroundColor"": ""rgba(246, 243, 243, 0)"",
""color"": ""#4E4E4E""
},
{
""name"": ""text_twitter"",
""text"": ""@sarahexplores"",
""textBackgroundColor"": ""rgba(246, 243, 243, 0)"",
""color"": ""#4E4E4E""
}
]
}";
var buffer = System.Text.Encoding.UTF8.GetBytes(json_content);
var byteContent = new ByteArrayContent(buffer);
Console.WriteLine(json_content);
var client = new HttpClient();
client.DefaultRequestHeaders.Add("X-API-KEY", api_key);
var response = await client.PostAsync(url, byteContent);
var ret = await response.Content.ReadAsStringAsync();
var returnContent = JsonSerializer.Deserialize<ReturnContent>(ret);
if (returnContent.status == "success")
{
Console.WriteLine($"Downloading {returnContent.download_url}...");
var download_response = await client.GetAsync(returnContent.download_url);
using (var stream = await download_response.Content.ReadAsStreamAsync())
{
var fileInfo = new FileInfo("image.jpeg");
using (var fileStream = fileInfo.OpenWrite())
{
await stream.CopyToAsync(fileStream);
}
}
}
}
}
}using System;
using System.IO;
using System.Net.Http;
using System.Text;
using System.Text.Json;
using System.Threading.Tasks;
namespace csharp
{
class ReturnContent
{
public string download_url { get; set; }
public string status { get; set; }
}
class Program
{
static async Task Main(string[] args)
{
var api_key = "a9e4MjA2NTg6MTc3Njk6Uk1ZSzVjTWs1T3d6VE9Mdw=";
var template_id = "f4377b23b4aeeed0";
var url = $"https://rest.apitemplate.io/v2/create-image?template_id={template_id}";
var json_content = @"{
""overrides"": [
{
""name"": ""rect_image_bg"",
""stroke"": ""grey"",
""src"": ""https://images.unsplash.com/photo-1542401886-65d6c61db217?crop=entropy&cs=tinysrgb&fit=max&fm=jpg&ixid=MnwxOTc1MDZ8MHwxfHNlYXJjaHwzfHxkZXNlcnR8ZW58MHwwfHx8MTYyMTUxOTI2OA&ixlib=rb-1.2.1&q=80&w=1080""
},
{
""name"": ""rect_container"",
""stroke"": ""grey"",
""backgroundColor"": ""rgba(255, 255, 255, 0.62)""
},
{
""name"": ""text_quote"",
""text"": ""Just witnessed the most breathtaking sunset over the Sahara. The way the light dances on the dunes, painting the sky in shades of orange and purple, is truly magical. Nature's artistry at its finest! #DesertAdventures #SaharaSkies"",
""textBackgroundColor"": ""rgba(246, 243, 243, 0)"",
""color"": ""#414141""
},
{
""name"": ""text_footer"",
""text"": ""2024-07-30 - Twitter - iPhone 16 Pro"",
""textBackgroundColor"": ""rgba(246, 243, 243, 0)"",
""color"": ""#666666""
},
{
""name"": ""circle_profile"",
""stroke"": ""grey"",
""src"": ""https://images.unsplash.com/photo-1520998116484-6eeb2f72b5b9?crop=entropy&cs=tinysrgb&fit=max&fm=jpg&ixid=MnwxOTc1MDZ8MHwxfHNlYXJjaHw2Mnx8aGFwcHl8ZW58MHwwfHx8MTYyMTY5MjkwNw&ixlib=rb-1.2.1&q=80&w=1080""
},
{
""name"": ""text_name"",
""text"": ""Sarah Wanderlust"",
""textBackgroundColor"": ""rgba(246, 243, 243, 0)"",
""color"": ""#4E4E4E""
},
{
""name"": ""text_twitter"",
""text"": ""@sarahexplores"",
""textBackgroundColor"": ""rgba(246, 243, 243, 0)"",
""color"": ""#4E4E4E""
}
]
}";
var buffer = System.Text.Encoding.UTF8.GetBytes(json_content);
var byteContent = new ByteArrayContent(buffer);
Console.WriteLine(json_content);
var client = new HttpClient();
client.DefaultRequestHeaders.Add("X-API-KEY", api_key);
var response = await client.PostAsync(url, byteContent);
var ret = await response.Content.ReadAsStringAsync();
var returnContent = JsonSerializer.Deserialize<ReturnContent>(ret);
if (returnContent.status == "success")
{
Console.WriteLine($"Downloading {returnContent.download_url}...");
var download_response = await client.GetAsync(returnContent.download_url);
using (var stream = await download_response.Content.ReadAsStreamAsync())
{
var fileInfo = new FileInfo("image.jpeg");
using (var fileStream = fileInfo.OpenWrite())
{
await stream.CopyToAsync(fileStream);
}
}
}
}
}
}!a href="/static-assets/pdf/blog/apitemplate-io-comparison/apitemplate-io-comparison-14.webp">APITemplate io 和 IronPDF 对 C# PDF 库的比较:图 14
本示例生成的产品宣传图片具有动态内容、自定义背景颜色和嵌入式产品图片。
QR 代码生成
APITemplate 的内置 QR 代码生成功能为我的许多项目增色不少。 您可以用数据 URL 代替 QR 代码的内容。 下面是我使用它的一个更复杂的例子:
using System;
using System.IO;
using System.Net.Http;
using System.Text;
using System.Text.Json;
using System.Threading.Tasks;
namespace csharp
{
class ReturnContent
{
public string download_url { get; set; }
public string status { get; set; }
}
class Program
{
static async Task Main(string[] args)
{
var api_key = "API-Key";
var template_id = "Template-Key";
var url = $"https://rest.apitemplate.io/v2/create-image?template_id={template_id}";
var json_content = @"{
""overrides"": [
{
""name"": ""background-color"",
""stroke"": ""grey"",
""backgroundColor"": ""#FFFFFF""
},
{
""name"": ""qr_1"",
""content"": ""http://ironpdf.com/"",
""backgroundColor"": ""white"",
""color"": ""#000000""
}
]
}";
var buffer = System.Text.Encoding.UTF8.GetBytes(json_content);
var byteContent = new ByteArrayContent(buffer);
//Console.WriteLine(json_content);
var client = new HttpClient();
client.DefaultRequestHeaders.Add("X-API-KEY", api_key);
var response = await client.PostAsync(url, byteContent);
var ret = await response.Content.ReadAsStringAsync();
var returnContent = JsonSerializer.Deserialize<ReturnContent>(ret);
Console.WriteLine(returnContent.status);
if (returnContent.status == "success")
{
Console.WriteLine($"Downloading {returnContent.download_url}...");
var download_response = await client.GetAsync(returnContent.download_url);
using (var stream = await download_response.Content.ReadAsStreamAsync())
{
var fileInfo = new FileInfo(@"F:/QRimage.jpeg");
using (var fileStream = fileInfo.OpenWrite())
{
await stream.CopyToAsync(fileStream);
}
}
}
}
}
}using System;
using System.IO;
using System.Net.Http;
using System.Text;
using System.Text.Json;
using System.Threading.Tasks;
namespace csharp
{
class ReturnContent
{
public string download_url { get; set; }
public string status { get; set; }
}
class Program
{
static async Task Main(string[] args)
{
var api_key = "API-Key";
var template_id = "Template-Key";
var url = $"https://rest.apitemplate.io/v2/create-image?template_id={template_id}";
var json_content = @"{
""overrides"": [
{
""name"": ""background-color"",
""stroke"": ""grey"",
""backgroundColor"": ""#FFFFFF""
},
{
""name"": ""qr_1"",
""content"": ""http://ironpdf.com/"",
""backgroundColor"": ""white"",
""color"": ""#000000""
}
]
}";
var buffer = System.Text.Encoding.UTF8.GetBytes(json_content);
var byteContent = new ByteArrayContent(buffer);
//Console.WriteLine(json_content);
var client = new HttpClient();
client.DefaultRequestHeaders.Add("X-API-KEY", api_key);
var response = await client.PostAsync(url, byteContent);
var ret = await response.Content.ReadAsStringAsync();
var returnContent = JsonSerializer.Deserialize<ReturnContent>(ret);
Console.WriteLine(returnContent.status);
if (returnContent.status == "success")
{
Console.WriteLine($"Downloading {returnContent.download_url}...");
var download_response = await client.GetAsync(returnContent.download_url);
using (var stream = await download_response.Content.ReadAsStreamAsync())
{
var fileInfo = new FileInfo(@"F:/QRimage.jpeg");
using (var fileStream = fileInfo.OpenWrite())
{
await stream.CopyToAsync(fileStream);
}
}
}
}
}
}!a href="/static-assets/pdf/blog/apitemplate-io-comparison/apitemplate-io-comparison-15.webp">APITemplate io 和 IronPDF 对 C# PDF 库的比较:图 15
文档和支持
作为经常进行 PDF 生成和操作的 C# 开发人员,我发现文档和支持的质量直接影响项目成功。 让我们来探讨一下我使用 IronPDF 和 APITemplate 的文档和获得支持的体验。
IronPDF。。
文档
IronPdf 的文档内容全面、结构合理,对我的项目帮助很大。 以下是我的详细经历:IronPdf 文档的网址是 https://ironpdf.com/docs/,内容相当广泛。以下是我所欣赏的一些关键方面:
1.入门指南:文档一开始就提供了清晰的分步指南,介绍如何通过 NuGet 安装 IronPDF 并创建第一个 PDF。 这有助于我在最初的项目中快速上手和运行。
2.API 参考:API 参考非常全面,涵盖了所有类和方法。 每个条目都包含 C# 示例,我发现这些示例在实现特定功能时非常有价值。
3.代码示例:整个文档中包含大量代码片段和完整示例。 在我需要实现更复杂的 PDF 操作时,这些功能特别有帮助。
4.Tutorials and How-To Guides: IronPDF 为常见任务(如从 HTML 创建 PDF、添加水印或使用表单)提供详细的教程。 这些指导我完成了更高级的使用案例。
5.故障排除部分:文档包括一个故障排除部分,用于解决常见问题。 这为我在遇到错误或意外行为时节省了时间。
支持
IronPDF 的联系人反应迅速,根据我的经验,支持渠道非常有用:
1.电子邮件支持:当我遇到复杂问题时,我会使用他们的电子邮件支持。 响应时间通常在 24 小时之内,而且支持团队对产品非常了解。
2.社区论坛: IronPdf 维护着一个社区论坛,开发人员可以在此提出问题并分享解决方案。 我既找到了问题的答案,也根据自己的经验提供了解决方案。
3.Stack Overflow:IronPDF 团队积极监控 Stack Overflow 上的 [ironpdf] 标签。 我在那里发布的问题都得到了有用的回复。
4.定期更新: IronPDF 经常发布更新,包括错误修复和新功能。 更新日志很详细,可以帮助我了解每个版本的新内容或变化。
5.迁移指南:当主要版本之间发生突破性变化时,IronPDF 提供迁移指南。 这些对我的项目更新到新版本的库至关重要。
APITemplate
APITemplate 的文档和支持结构与 IronPDF 不同,反映了其作为云服务的性质。以下是我的经验:
文档
APITemplate 的文档可在 https://docs.apitemplate.io/reference/api-reference.html 上获取,其重点是 API 的使用。 以下是要点:
1.API 参考:文档提供了清晰的 API 参考,详细介绍了所有可用端点、所需参数和响应格式。 在将 APITemplate 集成到我的 C# 应用程序中时,这一直是我的首选资源。
2.身份验证:有一个关于身份验证的专门章节,清楚地解释了如何使用 API 密钥。 在我刚开始使用这项服务时,这一点至关重要。
支持
APITemplate 的支持结构更侧重于电子邮件支持:
1.电子邮件支持:当我遇到问题或疑问时,我会使用他们的电子邮件支持。 回复时间一般在 1-2 个工作日内。
2.常见问题部分: 文档包含一个常见问题部分,用于解决常见问题。 当我遇到问题时,这往往是我的第一站。
使用 Bootstrap 5 和 IronPDF 制作分析仪表板
IronPdf 的 Chrome V8 渲染引擎擅长渲染现代 Bootstrap 5 布局,非常适合生成包含业务指标和数据可视化的 PDF 报告。 与 APITemplate 基于 API 的方法不同,IronPdf 直接处理 HTML,完全支持 CSS3,包括 flexbox、CSS Grid 和自定义属性。
using IronPdf;
var renderer = new ChromePdfRenderer();
string analyticsDashboard = @"
<!DOCTYPE html>
<html>
<head>
<meta charset='utf-8'>
<meta name='viewport' content='width=device-width, initial-scale=1'>
<link href='https://cdn.jsdelivr.net/npm/bootstrap@5.3.0/dist/css/bootstrap.min.css' rel='stylesheet'>
<style>
.metric-card {
transition: transform 0.2s;
border-left: 4px solid #0d6efd;
}
.metric-card:hover { transform: translateY(-5px); }
.trend-up { color: #198754; }
.trend-down { color: #dc3545; }
@media print {
.metric-card { page-break-inside: avoid; }
}
</style>
</head>
<body class='bg-light'>
<div class='container py-5'>
<div class='row mb-4'>
<div class='col-12'>
<div class='card shadow-sm'>
<div class='card-body'>
<h1 class='display-6 mb-0'>Performance Dashboard</h1>
<p class='text-muted mb-0'>Q4 2024 Analytics Overview</p>
</div>
</div>
</div>
</div>
<div class='row g-4 mb-4'>
<div class='col-md-3'>
<div class='card metric-card shadow-sm h-100'>
<div class='card-body'>
<h6 class='text-muted text-uppercase mb-2'>Total Revenue</h6>
<h2 class='display-6 mb-3'>$2.4M</h2>
<div class='progress' style='height: 6px;'>
<div class='progress-bar bg-success' style='width: 85%'></div>
</div>
<small class='trend-up'>↑ 18% from last quarter</small>
</div>
</div>
</div>
<div class='col-md-3'>
<div class='card metric-card shadow-sm h-100'>
<div class='card-body'>
<h6 class='text-muted text-uppercase mb-2'>Active Users</h6>
<h2 class='display-6 mb-3'>48,592</h2>
<div class='progress' style='height: 6px;'>
<div class='progress-bar bg-primary' style='width: 72%'></div>
</div>
<small class='trend-up'>↑ 12% growth rate</small>
</div>
</div>
</div>
<div class='col-md-3'>
<div class='card metric-card shadow-sm h-100'>
<div class='card-body'>
<h6 class='text-muted text-uppercase mb-2'>Conversion Rate</h6>
<h2 class='display-6 mb-3'>3.8%</h2>
<div class='progress' style='height: 6px;'>
<div class='progress-bar bg-warning' style='width: 38%'></div>
</div>
<small class='trend-down'>↓ 2% needs attention</small>
</div>
</div>
</div>
<div class='col-md-3'>
<div class='card metric-card shadow-sm h-100'>
<div class='card-body'>
<h6 class='text-muted text-uppercase mb-2'>Satisfaction</h6>
<h2 class='display-6 mb-3'>4.7/5</h2>
<div class='progress' style='height: 6px;'>
<div class='progress-bar bg-success' style='width: 94%'></div>
</div>
<small class='trend-up'>↑ Excellent rating</small>
</div>
</div>
</div>
</div>
<div class='card shadow-sm'>
<div class='card-body'>
<h5 class='card-title mb-3'>Top Performing Products</h5>
<div class='table-responsive'>
<table class='table table-hover'>
<thead class='table-light'>
<tr>
<th>Product</th>
<th>Revenue</th>
<th>Units</th>
<th>Trend</th>
</tr>
</thead>
<tbody>
<tr>
<td><strong>Enterprise Suite</strong></td>
<td>$1,240,000</td>
<td>2,150</td>
<td><span class='badge bg-success'>+22%</span></td>
</tr>
<tr>
<td><strong>Professional Plan</strong></td>
<td>$820,000</td>
<td>4,890</td>
<td><span class='badge bg-success'>+15%</span></td>
</tr>
<tr>
<td><strong>Starter Package</strong></td>
<td>$340,000</td>
<td>8,240</td>
<td><span class='badge bg-warning'>+5%</span></td>
</tr>
</tbody>
</table>
</div>
</div>
</div>
</div>
</body>
</html>";
var pdf = renderer.RenderHtmlAsPdf(analyticsDashboard);
pdf.SaveAs("analytics-dashboard.pdf");using IronPdf;
var renderer = new ChromePdfRenderer();
string analyticsDashboard = @"
<!DOCTYPE html>
<html>
<head>
<meta charset='utf-8'>
<meta name='viewport' content='width=device-width, initial-scale=1'>
<link href='https://cdn.jsdelivr.net/npm/bootstrap@5.3.0/dist/css/bootstrap.min.css' rel='stylesheet'>
<style>
.metric-card {
transition: transform 0.2s;
border-left: 4px solid #0d6efd;
}
.metric-card:hover { transform: translateY(-5px); }
.trend-up { color: #198754; }
.trend-down { color: #dc3545; }
@media print {
.metric-card { page-break-inside: avoid; }
}
</style>
</head>
<body class='bg-light'>
<div class='container py-5'>
<div class='row mb-4'>
<div class='col-12'>
<div class='card shadow-sm'>
<div class='card-body'>
<h1 class='display-6 mb-0'>Performance Dashboard</h1>
<p class='text-muted mb-0'>Q4 2024 Analytics Overview</p>
</div>
</div>
</div>
</div>
<div class='row g-4 mb-4'>
<div class='col-md-3'>
<div class='card metric-card shadow-sm h-100'>
<div class='card-body'>
<h6 class='text-muted text-uppercase mb-2'>Total Revenue</h6>
<h2 class='display-6 mb-3'>$2.4M</h2>
<div class='progress' style='height: 6px;'>
<div class='progress-bar bg-success' style='width: 85%'></div>
</div>
<small class='trend-up'>↑ 18% from last quarter</small>
</div>
</div>
</div>
<div class='col-md-3'>
<div class='card metric-card shadow-sm h-100'>
<div class='card-body'>
<h6 class='text-muted text-uppercase mb-2'>Active Users</h6>
<h2 class='display-6 mb-3'>48,592</h2>
<div class='progress' style='height: 6px;'>
<div class='progress-bar bg-primary' style='width: 72%'></div>
</div>
<small class='trend-up'>↑ 12% growth rate</small>
</div>
</div>
</div>
<div class='col-md-3'>
<div class='card metric-card shadow-sm h-100'>
<div class='card-body'>
<h6 class='text-muted text-uppercase mb-2'>Conversion Rate</h6>
<h2 class='display-6 mb-3'>3.8%</h2>
<div class='progress' style='height: 6px;'>
<div class='progress-bar bg-warning' style='width: 38%'></div>
</div>
<small class='trend-down'>↓ 2% needs attention</small>
</div>
</div>
</div>
<div class='col-md-3'>
<div class='card metric-card shadow-sm h-100'>
<div class='card-body'>
<h6 class='text-muted text-uppercase mb-2'>Satisfaction</h6>
<h2 class='display-6 mb-3'>4.7/5</h2>
<div class='progress' style='height: 6px;'>
<div class='progress-bar bg-success' style='width: 94%'></div>
</div>
<small class='trend-up'>↑ Excellent rating</small>
</div>
</div>
</div>
</div>
<div class='card shadow-sm'>
<div class='card-body'>
<h5 class='card-title mb-3'>Top Performing Products</h5>
<div class='table-responsive'>
<table class='table table-hover'>
<thead class='table-light'>
<tr>
<th>Product</th>
<th>Revenue</th>
<th>Units</th>
<th>Trend</th>
</tr>
</thead>
<tbody>
<tr>
<td><strong>Enterprise Suite</strong></td>
<td>$1,240,000</td>
<td>2,150</td>
<td><span class='badge bg-success'>+22%</span></td>
</tr>
<tr>
<td><strong>Professional Plan</strong></td>
<td>$820,000</td>
<td>4,890</td>
<td><span class='badge bg-success'>+15%</span></td>
</tr>
<tr>
<td><strong>Starter Package</strong></td>
<td>$340,000</td>
<td>8,240</td>
<td><span class='badge bg-warning'>+5%</span></td>
</tr>
</tbody>
</table>
</div>
</div>
</div>
</div>
</body>
</html>";
var pdf = renderer.RenderHtmlAsPdf(analyticsDashboard);
pdf.SaveAs("analytics-dashboard.pdf");该代码可生成专业的分析仪表盘 PDF,其中包含度量卡、进度条和响应式表格。 IronPdf 的 Chrome 引擎可以完美呈现 Bootstrap 的柔性框布局、阴影和悬停效果--这些功能需要使用 APITemplate 等基于 API 的服务进行大量定制工作。
APITemplate 的主要优势:
- 直接的 HTML 渲染,支持完整的 Bootstrap
- 无需调用 API 或模板配置
- 完全兼容 CSS3,包括动画
- 无外部依赖的离线处理
有关 Bootstrap PDF 生成的更多信息,请参见 HTML 转 PDF Bootstrap 指南。
许可
IronPDF。。 定价和许可
!a href="/static-assets/pdf/blog/apitemplate-io-comparison/apitemplate-io-comparison-16.webp">APITemplate io 和 IronPDF 对 C# PDF 库的比较:图 16
IronPdf 提供不同的定价层级,以满足不同的需求:
- Lite:定价为$799 ,此级别适合单个开发人员处理单个项目。 这是一项一次性收费项目,小型项目或个人开发者都能负担得起。 2.专业版:价格为$1,199 ,此选项最多支持 10 位开发人员、10 个地点和 10 个项目。 该级别还包括一次性收费,为中小型团队提供了更大的灵活性。 3.无限制:对于$2,399 ,此级别允许无限制的开发人员、地点和项目。 这对于需要大量使用而没有限制的大型团队和企业来说是理想的。
IronPDF 还为大型组织和需要将 PDF 功能集成到商业产品中的组织提供企业和 OEM 再分发许可。 它还提供免费试用测试。
APITemplate 定价和许可
APITemplate 通过其基于 API 的 PDF 生成服务提供了一种不同的方法。其定价通常基于 API 调用的次数,因此对于不同的使用模式而言更为灵活:
1.基本计划:通常价格较低,但每月 API 调用次数有限。 这适合小型项目或只需生成少量 PDF 的企业。 2.标准计划:此计划包含更多 API 调用和附加功能,适合中型企业。 3.企业计划:专为高容量用户量身定制,此计划提供最多的 API 调用和高级功能,如优先支持和自定义集成。
APITemplate 的授权简单明了,通常采用按月或按年订购的模式。
关键区别
1.定价模式: IronPDF 采用一次性收费模式,从长远来看,这种模式具有成本效益,尤其适用于持续、大量使用的情况。 另一方面,APITemplate 采用的是基于订阅的模式,可以根据使用情况进行更灵活的扩展。 2.支持和更新: IronPDF 包含一年的支持和更新,并可选择延长此期限。 APITemplate 的订购计划通常包括持续支持和更新作为套餐的一部分。
为什么要选择 IronPDF? IronPDF 和 APITemplate 都提供从 HTML 内容生成 PDF 的功能,但 IronPDF 的实现更为强大和灵活。 下面是一个比较: ### IronPDF。。 ```csharp using IronPdf; var renderer = new ChromePdfRenderer(); var html = @"Dynamic ReportThis report was generated on:
Lorem ipsum dolor sit amet, consectetur adipiscing elit.
"; var pdf = renderer.RenderHtmlAsPdf(html); pdf.SaveAs("IronPDF_report.pdf"); ``` ### APITemplate ```csharp using System.Net.Http; using System.Text.Json; var apiKey = "your_api_key"; var templateId = "your_template_id"; var url = $"https://rest.apitemplate.io/v2/create-pdf?template_id={templateId}"; var data = new { header = "Dynamic Report", content = "Lorem ipsum dolor sit amet, consectetur adipiscing elit.", date = DateTime.Now.ToShortDateString() }; var json = JsonSerializer.Serialize(data); var content = new StringContent(json, System.Text.Encoding.UTF8, "application/json"); using var client = new HttpClient(); client.DefaultRequestHeaders.Add("X-API-KEY", apiKey); var response = await client.PostAsync(url, content); var pdfBytes = await response.Content.ReadAsByteArrayAsync(); File.WriteAllBytes("APITemplate_report.pdf", pdfBytes); ``` ### 关键区别 1. **JavaScript 支持:** IronPDF 完全支持在 HTML 中执行 JavaScript,从而可以动态生成内容(例如示例中的当前日期)。 APITemplate 通常要求预先提供所有数据。 2. **CSS 灵活性:**使用 IronPDF,您可以直接在 HTML 中完全控制 CSS 样式。 APITemplate 通常需要预定义模板,定制选项有限。 3.**性能:** IronPDF 在本地处理 HTML,从而加快 PDF 生成速度,尤其对于复杂文档而言。 APITemplate 基于云的方法可能会带来延迟。 4.**离线功能:** IronPDF 支持离线工作,这对于互联网连接受限或安全要求高的应用场景非常有用。 APITemplate 始终需要互联网连接。 5.**动态内容:** IronPDF 允许即时生成更动态的内容,而 APITemplate 通常需要预定义的模板结构。 6.**自定义:** IronPDF 提供对 PDF 生成过程更精细的控制,包括页面大小、边距和其他 PDF 特定设置的选项。 7.**一致性:** IronPDF 使用其自身的渲染引擎,确保在不同环境下呈现一致的渲染效果。而 APITemplate 的输出可能因其服务器配置而异。 ## 结论 在各种 C# 项目中广泛使用 IronPDF 和 APITemplate 之后,我逐渐体会到了每种工具的独特优势。 不过,对于我的大多数 PDF 相关任务而言,IronPDF 始终被证明是上佳之选。虽然 APITemplate 有其优点,特别是对于简单的、基于模板的文档生成,但我发现 IronPDF 的多功能性使其能够同样有效地处理这些任务,同时还能在需要时提供处理更复杂 PDF 操作的能力。 总之,虽然这两种工具都有其用武之地,但 IronPDF 始终被证明是功能更强大、更灵活、更具成本效益的 C# 开发 PDF 操作解决方案。 它强大的功能集、卓越的性能和全面的支持,使它成为我处理任何 PDF 相关任务(从最简单的文档生成到最复杂的 PDF 操作)的首选。请注意APITemplate 是其各自所有者的注册商标。 本网站与 APITemplate 无关,也未得到 APITemplate 的支持或赞助。 所有产品名称、徽标和品牌均为各自所有者的财产。 比较仅供参考,反映的是撰写时的公开信息。
This report was generated on:
Lorem ipsum dolor sit amet, consectetur adipiscing elit.
常见问题解答
云端和库生成 PDF 工具的关键差异是什么?
云端工具如 APITemplate 通过 API 调用提供 PDF 生成并需要互联网连接。相比之下,库工具如 IronPDF 可以整合到您的 C# 应用程序中,允许离线操作并提供更多对 PDF 创建和定制的控制。
IronPDF 如何在 C# 应用程序中处理 HTML 转换为 PDF?
IronPDF 允许使用诸如 RenderHtmlAsPdf 的方法无缝进行 HTML 到 PDF 的转换。它完全支持现代 web 标准,包括 CSS 和 JavaScript,确保高质量的 web 内容渲染为 PDF。
我可以使用 IronPDF 在 PDF 中生成动态内容吗?
可以,IronPDF 支持 JavaScript 执行,这使 PDF 中的动态内容生成成为可能。这特别适用于从具有动态数据的网页直接创建交互式 PDF。
使用 IronPDF 相对于基于订阅的服务有哪些优势?
IronPDF 提供一次性授权费用,为长期使用提供了具成本效益的解决方案。它允许离线操作并提供广泛的 PDF 操作功能,这可能比类似 APITemplate 的订阅服务更灵活和强大。
使用 IronPDF 的开发人员可以获得哪些支持?
IronPDF 提供详细文档,包括指南、API 参考和代码示例,提供全面支持。开发者还可以通过电子邮件支持、社区论坛和像 Stack Overflow 这样的平台上寻求帮助。
IronPDF 支持跨平台开发吗?
是的,IronPDF 兼容 .NET Standard,支持跨平台开发。这确保开发者可以无缝地将 IronPDF 集成到运行在不同操作系统的项目中。
IronPDF 如何确保生成 PDF 的安全性?
IronPDF 包括 PDF 加密和解密功能,允许开发者使用密码和数字签名对文档进行安全保护。 这些功能有助于维护 PDF 文档的机密性和完整性。
使用 IronPDF 的常见故障排除提示是什么?
遇到 IronPDF 的问题时,确保所有依赖项均已正确安装和更新。查看文档以了解兼容性和配置设置,并查看示例代码以验证实施实践。如果问题仍然存在,支持团队将可提供帮助。






