使用IRONPDF .NET PDF API 是 .NET 开发人员的指南。 Curtis Chau 已发布:十二月 18, 2025 下载 IronPDF NuGet 下载 DLL 下载 Windows 安装程序 免费试用 法学硕士副本 法学硕士副本 将页面复制为 Markdown 格式,用于 LLMs 在 ChatGPT 中打开 向 ChatGPT 咨询此页面 在双子座打开 向 Gemini 询问此页面 在双子座打开 向 Gemini 询问此页面 打开困惑 向 Perplexity 询问有关此页面的信息 分享 在 Facebook 上分享 分享到 X(Twitter) 在 LinkedIn 上分享 复制链接 电子邮件文章 如何使用 ASP.NET Core 和 IronPDF 构建集中式 PDF 生成服务 在开发现代应用程序时,.NET 开发人员可能需要构建集中式 PDF 生成服务。无论是生成发票、报告、证书还是合同,拥有专用的 .NET PDF API 都有助于高效地管理 PDF 文件。 那么它如何改善您的PDF生成任务呢? 它通过为您的桌面和 Web 应用程序提供一致性、可维护性和可扩展性来实现这一点。 从未有过如此轻松地管理文档内容、PDF页面和PDF表单字段。 在本教程中,您将学习如何使用 ASP.NET Core 和IronPDF (一个强大的 .NET PDF 库)构建可用于生产的 PDF API。 我们将创建可以从HTML生成PDF、合并文档、添加水印并处理Web API中各种实际PDF生成场景的RESTful端点。 为什么构建一个专门的PDF API? .NET PDF API 教程(面向 .NET 开发人员):图 1 - PDF API 架构图 在深入研究代码之前,让我们了解为什么创建一个专门的PDF API是有意义的: 集中式逻辑:所有 PDF 生成逻辑都集中在一个地方,使维护和更新更加容易。 微服务架构:非常适合面向服务的架构,其中不同的应用程序需要 PDF 功能。 性能优化:更易于扩展和优化专用服务,以处理大型 PDF 文件、多页和动态数据。 语言无关:任何客户端应用程序都可以使用该 API,而无需考虑编程语言。 输出一致性:确保您组织内的所有 PDF 文档保持一致的文档布局、段落格式和 PDF 内容。 准备好开始构建了吗? 下载IronPDF的免费试用版,并按此教程一起编程实现.NET Framework项目中的PDF文件创建。 IronPDF: 完整的.NET PDF库 .NET PDF API 教程(面向 .NET 开发人员):图 2 - 与 .NET PDF API 教程相关的 7 张图片中的第 2 张 IronPDF是 .NET 开发人员首选的 PDF 库,它提供了一套全面的功能,使 Web API 项目中的 PDF 生成变得简单可靠。 它基于 Chrome 渲染引擎构建,可确保像素级完美的HTML 到 PDF 转换,通常只需几行代码即可完成。 这在保持所有样式、JavaScript执行和响应布局的同时完成。 使IronPDF成为.NET PDF API开发的理想选择的关键能力有: 基于 Chrome 的渲染:利用 Google Chrome 的渲染引擎,准确地将 HTML 内容转换为 PDF 文档,并完全支持嵌入式图像和其他 Web 资源。 功能丰富:支持编辑带有数字签名、PDF 表单、注释、加密、压缩等功能的新文档和现有文档。 创建安全的 PDF 文档:使用加密、数字签名和文档保护来管理敏感的 PDF 内容。 多种输入格式:使用 HTML、URL、图像和Office 文档创建 PDF 文档。 高级操作:合并 PDF 页面、拆分文档、应用水印、创建交互式 PDF 表单以及以编程方式操作 PDF 文件。 跨平台支持:可在 Windows、 Linux 、macOS、 Docker和云平台上运行。 性能优化:异步操作、高效的内存管理和快速渲染。 如何设置您的PDF文档API项目? 让我们从创建一个新的ASP.NET Core Web API项目并安装必要的包开始。 前提条件 .NET 6.0 SDK或更高版本 Visual Studio 2022或Visual Studio Code Postman或类似的API测试工具,以测试您的PDF REST API 创建项目 首先,让我们创建一个项目,我们将在其中构建我们的PDF生成工具。 dotnet new webapi -n PdfApiService cd PdfApiService dotnet new webapi -n PdfApiService cd PdfApiService SHELL 安装 IronPDF。 下一步是通过NuGet将IronPDF添加到您的项目中: dotnet add package IronPDF dotnet add package IronPDF SHELL 或者,在Visual Studio中使用NuGet包管理器控制台: Install-Package IronPDF 项目结构 C#开发的一个重要方面是保持一个干净且结构良好的项目文件夹。 例如: .NET PDF API 教程(面向 .NET 开发人员):图 3 - 项目文件夹结构 如何创建您的第一个PDF端点? 让我们构建一个简单的端点,将HTML转换为PDF格式。 首先,创建服务接口和实现: 创建PDF服务 首先,我们将以下内容添加到IPdfService.cs文件中: public interface IPdfService { byte[] GeneratePdfFromHtml(string htmlContent); byte[] GeneratePdfFromUrl(string url); } public interface IPdfService { byte[] GeneratePdfFromHtml(string htmlContent); byte[] GeneratePdfFromUrl(string url); } IRON VB CONVERTER ERROR developers@ironsoftware.com $vbLabelText $csharpLabel 在PdfService.cs文件中,我们将添加以下代码: using IronPdf; public class PdfService : IPdfService { private readonly ChromePdfRenderer _renderer; public PdfService() { _renderer = new ChromePdfRenderer(); // Configure rendering options for optimal PDF generation in .NET _renderer.RenderingOptions.MarginTop = 20; _renderer.RenderingOptions.MarginBottom = 20; _renderer.RenderingOptions.PrintHtmlBackgrounds = true; } public byte[] GeneratePdfFromHtml(string htmlContent) { // Generate PDF from HTML using the .NET PDF API var pdf = _renderer.RenderHtmlAsPdf(htmlContent); return pdf.BinaryData; } public byte[] GeneratePdfFromUrl(string url) { // Convert URL to PDF in the REST API var pdf = _renderer.RenderUrlAsPdf(url); return pdf.BinaryData; } } using IronPdf; public class PdfService : IPdfService { private readonly ChromePdfRenderer _renderer; public PdfService() { _renderer = new ChromePdfRenderer(); // Configure rendering options for optimal PDF generation in .NET _renderer.RenderingOptions.MarginTop = 20; _renderer.RenderingOptions.MarginBottom = 20; _renderer.RenderingOptions.PrintHtmlBackgrounds = true; } public byte[] GeneratePdfFromHtml(string htmlContent) { // Generate PDF from HTML using the .NET PDF API var pdf = _renderer.RenderHtmlAsPdf(htmlContent); return pdf.BinaryData; } public byte[] GeneratePdfFromUrl(string url) { // Convert URL to PDF in the REST API var pdf = _renderer.RenderUrlAsPdf(url); return pdf.BinaryData; } } IRON VB CONVERTER ERROR developers@ironsoftware.com $vbLabelText $csharpLabel PdfService负责将 HTML 转换为 PDF 的核心过程。 该类利用 IronPDF 的ChromePdfRenderer ,设置了合理的默认值,例如页面边距和背景渲染,以生成精美的最终文档。 当控制器传递原始HTML时,服务使用IronPDF将其呈现为专业质量的PDF,并将结果返回为字节数据,准备好下载。 此外,它还可以通过将URL直接转换为PDF来处理整个网页。 创建控制器 现在是为我们的API创建控制器的时间了。 这将提供一个可以从HTML生成PDF文件的API端点。 然后,能够下载并将PDF文档保存到您的系统中,以便进一步使用或共享。 // Controllers/PdfController.cs using Microsoft.AspNetCore.Mvc; [ApiController] [Route("api/[controller]")] public class PdfController : ControllerBase { private readonly IPdfService _pdfService; public PdfController(IPdfService pdfService) { _pdfService = pdfService; } [HttpPost("html-to-pdf")] public IActionResult ConvertHtmlToPdf([FromBody] HtmlRequest request) { try { var pdfBytes = _pdfService.GeneratePdfFromHtml(request.HtmlContent); // Return as downloadable file return File(pdfBytes, "application/pdf", "document.pdf"); } catch (Exception ex) { return BadRequest($"Error generating PDF: {ex.Message}"); } } } // Controllers/PdfController.cs using Microsoft.AspNetCore.Mvc; [ApiController] [Route("api/[controller]")] public class PdfController : ControllerBase { private readonly IPdfService _pdfService; public PdfController(IPdfService pdfService) { _pdfService = pdfService; } [HttpPost("html-to-pdf")] public IActionResult ConvertHtmlToPdf([FromBody] HtmlRequest request) { try { var pdfBytes = _pdfService.GeneratePdfFromHtml(request.HtmlContent); // Return as downloadable file return File(pdfBytes, "application/pdf", "document.pdf"); } catch (Exception ex) { return BadRequest($"Error generating PDF: {ex.Message}"); } } } IRON VB CONVERTER ERROR developers@ironsoftware.com $vbLabelText $csharpLabel 然后,在HtmlRequest.cs文件中,我们将添加以下代码: // Models/HtmlRequest.cs public class HtmlRequest { public string HtmlContent { get; set; } public string FileName { get; set; } = "document.pdf"; } // Models/HtmlRequest.cs public class HtmlRequest { public string HtmlContent { get; set; } public string FileName { get; set; } = "document.pdf"; } IRON VB CONVERTER ERROR developers@ironsoftware.com $vbLabelText $csharpLabel 在第一个文件中,我们设置了一个简单的API端点,将HTML转换为可下载的PDF。 当有人通过简单的 POST 请求向api/pdf/html-to-pdf路由发送 HTML 内容时, PdfController会将将其转换为 PDF 的任务传递给专用服务。 PDF 文件生成后,控制器会将其作为可供下载的文件返回给用户。该请求本身使用HtmlRequest模型构建,其中包含原始 HTML 代码以及最终文档的可选文件名。 简而言之,此设置使得客户端可以轻松发送HTML并立即获得一个精美的PDF作为返回。 注册服务 更新Program.cs文件以注册 PDF 服务: var builder = WebApplication.CreateBuilder(args); builder.Services.AddControllers(); builder.Services.AddEndpointsApiExplorer(); builder.Services.AddSwaggerGen(); // Register PDF service builder.Services.AddSingleton<IPdfService, PdfService>(); var app = builder.Build(); if (app.Environment.IsDevelopment()) { app.UseSwagger(); app.UseSwaggerUI(); } app.UseHttpsRedirection(); app.MapControllers(); app.Run(); var builder = WebApplication.CreateBuilder(args); builder.Services.AddControllers(); builder.Services.AddEndpointsApiExplorer(); builder.Services.AddSwaggerGen(); // Register PDF service builder.Services.AddSingleton<IPdfService, PdfService>(); var app = builder.Build(); if (app.Environment.IsDevelopment()) { app.UseSwagger(); app.UseSwaggerUI(); } app.UseHttpsRedirection(); app.MapControllers(); app.Run(); IRON VB CONVERTER ERROR developers@ironsoftware.com $vbLabelText $csharpLabel 如何处理不同的响应类型? 您的API应该支持基于客户端需求以不同方式返回PDF: [HttpPost("generate")] public IActionResult GeneratePdf([FromBody] PdfRequest request) { var pdfBytes = _pdfService.GeneratePdfFromHtml(request.HtmlContent); switch (request.ResponseType?.ToLower()) { case "base64": return Ok(new { data = Convert.ToBase64String(pdfBytes), filename = request.FileName }); case "inline": return File(pdfBytes, "application/pdf"); default: // download return File(pdfBytes, "application/pdf", request.FileName); } } [HttpPost("generate")] public IActionResult GeneratePdf([FromBody] PdfRequest request) { var pdfBytes = _pdfService.GeneratePdfFromHtml(request.HtmlContent); switch (request.ResponseType?.ToLower()) { case "base64": return Ok(new { data = Convert.ToBase64String(pdfBytes), filename = request.FileName }); case "inline": return File(pdfBytes, "application/pdf"); default: // download return File(pdfBytes, "application/pdf", request.FileName); } } IRON VB CONVERTER ERROR developers@ironsoftware.com $vbLabelText $csharpLabel 在这里,我们在控制器中添加了一个更灵活的PDF生成端点。 GeneratePdf方法不会强制下载文件,而是允许客户端选择如何返回结果。 此选项提供灵活性,允许PDF以多种格式显示:作为可下载文件,直接在浏览器中,或编码为Base64字符串以便在API中轻松使用。 该请求由PdfRequest模型定义,该模型基于早期的HtmlRequest模型,并添加了ResponseType选项。 总之,这使用户能够更好地控制如何接收他们的PDF,使API更加多样化和用户友好。 现在,当我们运行程序时,我们将在Swagger上看到此输出。 .NET PDF API 教程(面向 .NET 开发人员):图 4 - Swagger UI 如何实现常见的PDF操作? 让我们扩展我们的服务以处理各种PDF生成场景: URL到PDF转换 [HttpPost("url-to-pdf")] public async Task<IActionResult> ConvertUrlToPdf([FromBody] UrlRequest request) { try { var pdfBytes = await Task.Run(() => _pdfService.GeneratePdfFromUrl(request.Url)); return File(pdfBytes, "application/pdf", $"{request.FileName ?? "website"}.pdf"); } catch (Exception ex) { return BadRequest($"Failed to convert URL: {ex.Message}"); } } public class UrlRequest { public string Url { get; set; } public string FileName { get; set; } } [HttpPost("url-to-pdf")] public async Task<IActionResult> ConvertUrlToPdf([FromBody] UrlRequest request) { try { var pdfBytes = await Task.Run(() => _pdfService.GeneratePdfFromUrl(request.Url)); return File(pdfBytes, "application/pdf", $"{request.FileName ?? "website"}.pdf"); } catch (Exception ex) { return BadRequest($"Failed to convert URL: {ex.Message}"); } } public class UrlRequest { public string Url { get; set; } public string FileName { get; set; } } IRON VB CONVERTER ERROR developers@ironsoftware.com $vbLabelText $csharpLabel 此端点允许客户端发送一个URL并获取该网页的可下载PDF。 当收到 POST /api/pdf/url-to-pdf请求时,控制器使用_pdfService在后台将给定的 URL 转换为 PDF 字节,然后将其作为文件下载返回。 如果在转换过程中出现问题,它会优雅地响应一个清晰的错误信息。 让我们尝试使用网址"https://www.apple.com/nz"并测试POST请求。下面是我们获得的输出。 输出 .NET PDF API 教程(面向 .NET 开发人员):图 5 - PDF 输出 URL 添加自定义水印 public byte[] AddWatermarkFromFile(string filePath, string watermarkText) { // Load PDF directly from file var pdf = PdfDocument.FromFile(filePath); pdf.ApplyWatermark( $"<h1 style='color:red;font-size:72px;'>{watermarkText}</h1>", 75, IronPdf.Editing.VerticalAlignment.Middle, IronPdf.Editing.HorizontalAlignment.Center ); return pdf.BinaryData; } public byte[] AddWatermarkFromFile(string filePath, string watermarkText) { // Load PDF directly from file var pdf = PdfDocument.FromFile(filePath); pdf.ApplyWatermark( $"<h1 style='color:red;font-size:72px;'>{watermarkText}</h1>", 75, IronPdf.Editing.VerticalAlignment.Middle, IronPdf.Editing.HorizontalAlignment.Center ); return pdf.BinaryData; } IRON VB CONVERTER ERROR developers@ironsoftware.com $vbLabelText $csharpLabel 在这里,我们只是手动加载一个本地的文件以进行测试。 然而,您可以调整这个,以便您的PDF API生成PDF文档,然后轻松地应用自定义水印。 水印输出 .NET PDF API 教程(面向 .NET 开发人员):图 6 - 上述代码示例中的水印输出 如何使用模板添加动态数据 对于真实世界的应用程序,您通常需要从模板生成带有动态数据的PDFs: [HttpPost("from-template")] public IActionResult GenerateFromTemplate([FromBody] TemplateRequest request) { // Simple template replacement var html = request.Template; foreach (var item in request.Data) { html = html.Replace($"{{{{{item.Key}}}}}", item.Value); } var pdfBytes = _pdfService.GeneratePdfFromHtml(html); return File(pdfBytes, "application/pdf", request.FileName); } public class TemplateRequest { public string Template { get; set; } public Dictionary<string, string> Data { get; set; } public string FileName { get; set; } = "document.pdf"; } [HttpPost("from-template")] public IActionResult GenerateFromTemplate([FromBody] TemplateRequest request) { // Simple template replacement var html = request.Template; foreach (var item in request.Data) { html = html.Replace($"{{{{{item.Key}}}}}", item.Value); } var pdfBytes = _pdfService.GeneratePdfFromHtml(html); return File(pdfBytes, "application/pdf", request.FileName); } public class TemplateRequest { public string Template { get; set; } public Dictionary<string, string> Data { get; set; } public string FileName { get; set; } = "document.pdf"; } IRON VB CONVERTER ERROR developers@ironsoftware.com $vbLabelText $csharpLabel 对于更高级的模板场景,请查看IronPDF的HTML到PDF文档。 您还可以探索CSHTML到PDF转换用于MVC应用程序和Razor到PDF用于Blazor应用程序。 如何优化性能? 在构建生产PDF API时,性能至关重要。 以下是关键的优化策略: 异步操作 当构建涉及使用I/O操作的项目时,明智的做法是使用异步编码。 如果您的PDF内容来自外部资源,这尤其有用,例如: 下载 HTML 页面 ( RenderUrlAsPdf ) 通过HTTP获取图像、CSS或字体 读取/写入磁盘或云存储的文件 这些操作可以阻塞线程,但使用异步可以防止您的API线程空闲等待。 例: public async Task<byte[]> GeneratePdfFromHtmlAsync(string htmlContent) { return await Task.Run(() => { var pdf = _renderer.RenderHtmlAsPdf(htmlContent); return pdf.BinaryData; }); } public async Task<byte[]> GeneratePdfFromHtmlAsync(string htmlContent) { return await Task.Run(() => { var pdf = _renderer.RenderHtmlAsPdf(htmlContent); return pdf.BinaryData; }); } IRON VB CONVERTER ERROR developers@ironsoftware.com $vbLabelText $csharpLabel 渲染选项 配置IronPDF以获得最佳性能: _renderer.RenderingOptions.EnableJavaScript = false; // If JS not needed _renderer.RenderingOptions.CssMediaType = PdfCssMediaType.Print; _renderer.RenderingOptions.RenderDelay = 0; // Remove if no JS _renderer.RenderingOptions.Timeout = 30; // Set reasonable timeout _renderer.RenderingOptions.EnableJavaScript = false; // If JS not needed _renderer.RenderingOptions.CssMediaType = PdfCssMediaType.Print; _renderer.RenderingOptions.RenderDelay = 0; // Remove if no JS _renderer.RenderingOptions.Timeout = 30; // Set reasonable timeout IRON VB CONVERTER ERROR developers@ironsoftware.com $vbLabelText $csharpLabel 如何保护您的PDF API? 对于任何生产API,安全性都是至关重要的。 这里是一个简单的API密钥身份验证方法: // Middleware/ApiKeyMiddleware.cs public class ApiKeyMiddleware { private readonly RequestDelegate _next; private const string ApiKeyHeader = "X-API-Key"; public ApiKeyMiddleware(RequestDelegate next) { _next = next; } public async Task InvokeAsync(HttpContext context) { if (!context.Request.Headers.TryGetValue(ApiKeyHeader, out var apiKey)) { context.Response.StatusCode = 401; await context.Response.WriteAsync("API Key required"); return; } // Validate API key (in production, check against database) var validApiKey = context.RequestServices .GetRequiredService<IConfiguration>()["ApiKey"]; if (apiKey != validApiKey) { context.Response.StatusCode = 403; await context.Response.WriteAsync("Invalid API Key"); return; } await _next(context); } } // In Program.cs app.UseMiddleware<ApiKeyMiddleware>(); // Middleware/ApiKeyMiddleware.cs public class ApiKeyMiddleware { private readonly RequestDelegate _next; private const string ApiKeyHeader = "X-API-Key"; public ApiKeyMiddleware(RequestDelegate next) { _next = next; } public async Task InvokeAsync(HttpContext context) { if (!context.Request.Headers.TryGetValue(ApiKeyHeader, out var apiKey)) { context.Response.StatusCode = 401; await context.Response.WriteAsync("API Key required"); return; } // Validate API key (in production, check against database) var validApiKey = context.RequestServices .GetRequiredService<IConfiguration>()["ApiKey"]; if (apiKey != validApiKey) { context.Response.StatusCode = 403; await context.Response.WriteAsync("Invalid API Key"); return; } await _next(context); } } // In Program.cs app.UseMiddleware<ApiKeyMiddleware>(); IRON VB CONVERTER ERROR developers@ironsoftware.com $vbLabelText $csharpLabel 对于更高级的身份验证场景,请考虑: JWT身份验证 - API身份验证的行业标准 OAuth 2.0 - 用于第三方集成 Azure AD集成 - 企业身份验证 API速率限制 - 防止滥用并确保公平使用 实际案例:发票生成API 让我们构建一个实际的发票生成端点,演示完整的实现。 此示例展示了如何使用生产.NET PDF API生成具有动态数据的专业发票。 立即开始使用 IronPDF。 免费开始 首先,我们将在我们的Models文件夹中创建一个新文件。 在这里,我把我的文件命名为Invoice.cs 。 然后,将以下代码添加到您的新文件中。 public class Invoice { public string InvoiceNumber { get; set; } public DateTime Date { get; set; } public string CustomerName { get; set; } public string CustomerAddress { get; set; } public List<InvoiceItem> Items { get; set; } public decimal Tax { get; set; } } public class InvoiceItem { public string Description { get; set; } public int Quantity { get; set; } public decimal UnitPrice { get; set; } public decimal Total => Quantity * UnitPrice; } public class Invoice { public string InvoiceNumber { get; set; } public DateTime Date { get; set; } public string CustomerName { get; set; } public string CustomerAddress { get; set; } public List<InvoiceItem> Items { get; set; } public decimal Tax { get; set; } } public class InvoiceItem { public string Description { get; set; } public int Quantity { get; set; } public decimal UnitPrice { get; set; } public decimal Total => Quantity * UnitPrice; } IRON VB CONVERTER ERROR developers@ironsoftware.com $vbLabelText $csharpLabel 然后,我们将需要为我们的发票生成器创建一个新的服务文件。 在您的Services文件夹中,添加以下代码。 我新建了一个名为InvoiceService.cs的文件。 这段代码将处理我们的发票PDF文件的样式和布局。 public class InvoiceService { private readonly ChromePdfRenderer _renderer; public InvoiceService() { _renderer = new ChromePdfRenderer(); _renderer.RenderingOptions.MarginTop = 10; _renderer.RenderingOptions.MarginBottom = 10; _renderer.RenderingOptions.PrintHtmlBackgrounds = true; } public byte[] GenerateInvoice(Invoice invoice) { var html = BuildInvoiceHtml(invoice); // Add footer with page numbers _renderer.RenderingOptions.HtmlFooter = new HtmlHeaderFooter { MaxHeight = 15, HtmlFragment = "<center><i>{page} of {total-pages}</i></center>", DrawDividerLine = true }; var pdf = _renderer.RenderHtmlAsPdf(html); return pdf.BinaryData; } private string BuildInvoiceHtml(Invoice invoice) { var subtotal = invoice.Items.Sum(i => i.Total); var taxAmount = subtotal * (invoice.Tax / 100); var total = subtotal + taxAmount; var itemsHtml = string.Join("", invoice.Items.Select(item => $@"<tr> <td>{item.Description}</td> <td class='text-center'>{item.Quantity}</td> <td class='text-right'>${item.UnitPrice:F2}</td> <td class='text-right'>${item.Total:F2}</td> </tr>")); return $@" <!DOCTYPE html> <html> <head> <style> body {{ font-family: Arial, sans-serif; }} .invoice-header {{ background-color: #f8f9fa; padding: 20px; margin-bottom: 20px; }} table {{ width: 100%; border-collapse: collapse; }} th, td {{ padding: 10px; border-bottom: 1px solid #ddd; }} th {{ background-color: #007bff; color: white; }} .text-right {{ text-align: right; }} .text-center {{ text-align: center; }} .total-section {{ margin-top: 20px; text-align: right; }} </style> </head> <body> <div class='invoice-header'> <h1>Invoice #{invoice.InvoiceNumber}</h1> <p>Date: {invoice.Date:yyyy-MM-dd}</p> </div> <div> <h3>Bill To:</h3> <p>{invoice.CustomerName}<br/>{invoice.CustomerAddress}</p> </div> <table> <thead> <tr> <th>Description</th> <th>Quantity</th> <th>Unit Price</th> <th>Total</th> </tr> </thead> <tbody> {itemsHtml} </tbody> </table> <div class='total-section'> <p>Subtotal: ${subtotal:F2}</p> <p>Tax ({invoice.Tax}%): ${taxAmount:F2}</p> <h3>Total: ${total:F2}</h3> </div> </body> </html>"; } } public class InvoiceService { private readonly ChromePdfRenderer _renderer; public InvoiceService() { _renderer = new ChromePdfRenderer(); _renderer.RenderingOptions.MarginTop = 10; _renderer.RenderingOptions.MarginBottom = 10; _renderer.RenderingOptions.PrintHtmlBackgrounds = true; } public byte[] GenerateInvoice(Invoice invoice) { var html = BuildInvoiceHtml(invoice); // Add footer with page numbers _renderer.RenderingOptions.HtmlFooter = new HtmlHeaderFooter { MaxHeight = 15, HtmlFragment = "<center><i>{page} of {total-pages}</i></center>", DrawDividerLine = true }; var pdf = _renderer.RenderHtmlAsPdf(html); return pdf.BinaryData; } private string BuildInvoiceHtml(Invoice invoice) { var subtotal = invoice.Items.Sum(i => i.Total); var taxAmount = subtotal * (invoice.Tax / 100); var total = subtotal + taxAmount; var itemsHtml = string.Join("", invoice.Items.Select(item => $@"<tr> <td>{item.Description}</td> <td class='text-center'>{item.Quantity}</td> <td class='text-right'>${item.UnitPrice:F2}</td> <td class='text-right'>${item.Total:F2}</td> </tr>")); return $@" <!DOCTYPE html> <html> <head> <style> body {{ font-family: Arial, sans-serif; }} .invoice-header {{ background-color: #f8f9fa; padding: 20px; margin-bottom: 20px; }} table {{ width: 100%; border-collapse: collapse; }} th, td {{ padding: 10px; border-bottom: 1px solid #ddd; }} th {{ background-color: #007bff; color: white; }} .text-right {{ text-align: right; }} .text-center {{ text-align: center; }} .total-section {{ margin-top: 20px; text-align: right; }} </style> </head> <body> <div class='invoice-header'> <h1>Invoice #{invoice.InvoiceNumber}</h1> <p>Date: {invoice.Date:yyyy-MM-dd}</p> </div> <div> <h3>Bill To:</h3> <p>{invoice.CustomerName}<br/>{invoice.CustomerAddress}</p> </div> <table> <thead> <tr> <th>Description</th> <th>Quantity</th> <th>Unit Price</th> <th>Total</th> </tr> </thead> <tbody> {itemsHtml} </tbody> </table> <div class='total-section'> <p>Subtotal: ${subtotal:F2}</p> <p>Tax ({invoice.Tax}%): ${taxAmount:F2}</p> <h3>Total: ${total:F2}</h3> </div> </body> </html>"; } } IRON VB CONVERTER ERROR developers@ironsoftware.com $vbLabelText $csharpLabel 最后,您将需要创建一个新的控制器,以便通过API访问并创建一个新的发票。 [ApiController] [Route("api/[controller]")] public class InvoiceController : ControllerBase { private readonly InvoiceService _invoiceService; public InvoiceController(InvoiceService invoiceService) { _invoiceService = invoiceService; } [HttpPost("generate")] public IActionResult GenerateInvoice([FromBody] Invoice invoice) { try { ```cs public IActionResult GeneratePDF(Invoice invoice) { try { var pdfBytes = _invoiceService.GenerateInvoice(invoice); var fileName = $"Invoice_{invoice.InvoiceNumber}.pdf"; return File(pdfBytes, "application/pdf", fileName); } catch (Exception ex) { return StatusCode(500, $"Error generating invoice: {ex.Message}"); } } [ApiController] [Route("api/[controller]")] public class InvoiceController : ControllerBase { private readonly InvoiceService _invoiceService; public InvoiceController(InvoiceService invoiceService) { _invoiceService = invoiceService; } [HttpPost("generate")] public IActionResult GenerateInvoice([FromBody] Invoice invoice) { try { ```cs public IActionResult GeneratePDF(Invoice invoice) { try { var pdfBytes = _invoiceService.GenerateInvoice(invoice); var fileName = $"Invoice_{invoice.InvoiceNumber}.pdf"; return File(pdfBytes, "application/pdf", fileName); } catch (Exception ex) { return StatusCode(500, $"Error generating invoice: {ex.Message}"); } } IRON VB CONVERTER ERROR developers@ironsoftware.com $vbLabelText $csharpLabel 发票输出 .NET PDF API 教程(面向 .NET 开发人员):图 7 - PDF 发票输出 容器部署注意事项 虽然本教程侧重于本地开发,但这里是关于将您的PDF API容器化的简要概述: 基础Dockerfile FROM mcr.microsoft.com/dotnet/aspnet:6.0 AS base WORKDIR /app EXPOSE 80 FROM mcr.microsoft.com/dotnet/sdk:6.0 AS build WORKDIR /src COPY ["PdfApiService.csproj", "."] RUN dotnet restore COPY . . RUN dotnet build -c Release -o /app/build FROM build AS publish RUN dotnet publish -c Release -o /app/publish FROM base AS final WORKDIR /app COPY --from=publish /app/publish . # IronPDF requires additional dependencies on Linux RUN apt-get update && apt-get install -y \ libgdiplus \ libc6-dev \ libx11-dev \ && rm -rf /var/lib/apt/lists/* ENTRYPOINT ["dotnet", "PdfApiService.dll"] 有关您的.NET PDF API的详细部署指南,请参阅: IronPDF Docker文档 - 完整的容器化指南 IronPDF Azure部署 - Azure Functions和App Service IronPDF AWS部署 - Lambda和EC2部署 IronPDF Linux设置 - Linux特定配置 错误处理最佳实践 为了设计更具容错性的程序,最佳实践是实施全局错误处理程序,以获得一致的错误响应,例如下面所示: // Middleware/ErrorHandlingMiddleware.cs public class ErrorHandlingMiddleware { private readonly RequestDelegate _next; public ErrorHandlingMiddleware(RequestDelegate next) { _next = next; } public async Task InvokeAsync(HttpContext context) { try { await _next(context); } catch (Exception ex) { await HandleExceptionAsync(context, ex); } } private static async Task HandleExceptionAsync(HttpContext context, Exception ex) { context.Response.ContentType = "application/json"; context.Response.StatusCode = 500; var response = new { error = "An error occurred processing your request", message = ex.Message }; await context.Response.WriteAsync(JsonSerializer.Serialize(response)); } } // Middleware/ErrorHandlingMiddleware.cs public class ErrorHandlingMiddleware { private readonly RequestDelegate _next; public ErrorHandlingMiddleware(RequestDelegate next) { _next = next; } public async Task InvokeAsync(HttpContext context) { try { await _next(context); } catch (Exception ex) { await HandleExceptionAsync(context, ex); } } private static async Task HandleExceptionAsync(HttpContext context, Exception ex) { context.Response.ContentType = "application/json"; context.Response.StatusCode = 500; var response = new { error = "An error occurred processing your request", message = ex.Message }; await context.Response.WriteAsync(JsonSerializer.Serialize(response)); } } IRON VB CONVERTER ERROR developers@ironsoftware.com $vbLabelText $csharpLabel 对于特定的IronPDF故障排除场景,请参阅IronPDF故障排除指南。 结论 您现在已经构建了一个强大的.NET PDF API,使用ASP.NET Core和IronPDF可以处理多种文档生成场景。 这个REST API为您的应用程序提供集中化PDF操作的坚实基础。 关键要点: IronPDF 通过其基于 Chrome 的渲染方式,使 Web API 项目中的 PDF 生成变得简单。 您可以使用 IronPDF 的高级编辑工具轻松调整 Web API 以编辑现有的 PDF 文档。 RESTful 设计原则确保您的 PDF API 直观易用且易于维护。 适当的错误处理和安全措施对于生产至关重要。 通过异步操作和缓存进行性能优化,提高了可扩展性。 您将获得对桌面和 Web 应用程序的支持,以及可扩展的文档解决方案。 IronPDF允许开发人员高效地创建PDF文档、保存PDF文件和转换HTML,使其成为现代.NET Framework应用程序中的必备PDF文档API。 下一步 准备好在您的生产.NET PDF API中实施IronPDF了吗? 以下是您的下一步操作: 1.开始免费试用- 在您的开发环境中测试 IronPDF 的全部功能。 2.探索高级功能- 查看数字签名、 PDF 表单和其他高级 PDF 功能。 3.自信扩展- 查看满足您生产 API 需求的许可选项。 今天就构建您的.NET PDF API,并通过IronPDF在整个应用程序生态系统中简化文档生成! 常见问题解答 IronPDF 在 .NET 应用程序中的用途是什么? IronPDF 用于在 .NET 应用程序中生成、处理和转换 PDF,是创建集中式 PDF 服务的理想工具。 IronPDF 如何与 ASP.NET Core 集成? 通过安装 IronPDF NuGet 包,可以将 IronPDF 与 ASP.NET Core 集成,从而构建集中式 PDF 生成服务。 IronPDF 生成 PDF 的主要功能是什么? IronPDF 的主要功能包括 HTML 到 PDF 的转换、合并和拆分 PDF、添加页眉和页脚以及提取文本和图像。 IronPdf 能否处理复杂的 PDF 布局? 是的,IronPDF 能够将 HTML 和 CSS 内容转换为准确渲染的 PDF 文档,因此可以处理复杂的 PDF 布局。 是否可以使用 IronPDF 定制 PDF 创建? 是的,IronPDF 允许在创建 PDF 时进行自定义,包括设置页面大小、页边距以及添加水印或注释。 IronPDF 支持 PDF 安全功能吗? IronPDF 支持密码保护和加密等 PDF 安全功能,以确保生成的 PDF 文档的安全。 IronPdf 可将哪些格式转换为 PDF? IronPDF 可以将各种格式的文件转换成 PDF,包括 HTML、URL 和 ASPX 文件,使其成为适用于不同用例的多功能工具。 IronPDF 如何处理大规模 PDF 生成? IronPDF 针对性能进行了优化,可在 .NET 应用程序中高效处理大规模 PDF 生成任务。 IronPDF 可以用于云应用吗? 是的,IronPDF 可用于基于云的应用程序,支持在 Azure 和 AWS 等平台上部署可扩展的 PDF 服务。 IronPDF for .NET 支持哪些版本? IronPDF 支持多个 .NET 版本,包括 .NET Core 和 .NET Framework,确保与各种项目兼容。 Curtis Chau 立即与工程团队聊天 技术作家 Curtis Chau 拥有卡尔顿大学的计算机科学学士学位,专注于前端开发,精通 Node.js、TypeScript、JavaScript 和 React。他热衷于打造直观且美观的用户界面,喜欢使用现代框架并创建结构良好、视觉吸引力强的手册。除了开发之外,Curtis 对物联网 (IoT) 有浓厚的兴趣,探索将硬件和软件集成的新方法。在空闲时间,他喜欢玩游戏和构建 Discord 机器人,将他对技术的热爱与创造力相结合。 相关文章 已发布十二月 18, 2025 如何使用 Aspose C# 和 IronPDF 创建 PDF 通过这本专为开发人员设计的分步指南,了解如何使用 Aspose C# 和 IronPDF 创建 PDF。 阅读更多 已发布十二月 18, 2025 使用 IronPDF 创建 .NET Core PDF 生成器 使用 IronPDF 在 .NET Core 中构建强大的 PDF 生成器。将 HTML 转换为 PDF,创建发票,并通过像素完美的渲染生成报告。 阅读更多 已发布十二月 18, 2025 如何使用 IronPDF 在 C# 中合并两个 PDF 字节数组 使用 IronPDF 在 C# 中合并两个 PDF 字节数组。学习通过简单的代码示例从字节数组、内存流和数据库合并多个 PDF 文件。 阅读更多 使用 IronPDF 创建 .NET Core PDF...
已发布十二月 18, 2025 如何使用 Aspose C# 和 IronPDF 创建 PDF 通过这本专为开发人员设计的分步指南,了解如何使用 Aspose C# 和 IronPDF 创建 PDF。 阅读更多
已发布十二月 18, 2025 使用 IronPDF 创建 .NET Core PDF 生成器 使用 IronPDF 在 .NET Core 中构建强大的 PDF 生成器。将 HTML 转换为 PDF,创建发票,并通过像素完美的渲染生成报告。 阅读更多
已发布十二月 18, 2025 如何使用 IronPDF 在 C# 中合并两个 PDF 字节数组 使用 IronPDF 在 C# 中合并两个 PDF 字节数组。学习通过简单的代码示例从字节数组、内存流和数据库合并多个 PDF 文件。 阅读更多