动态创建 PDF 文档是 Web 应用程序中的常见要求,无论是生成发票、证书、报告还是任何其他类型的文档。在本指南中,我们将介绍使用 iText7 库在 .NET Core Web API 中生成 PDF 的过程。我们将创建一个示例项目来演示生成证书 PDF 的过程。
一. 设置您的 .NET Core Web API 项
1.创建新的 Web API 项目
打开终端或命令提示符并运行以下命令来创建一个新的 Web API 项目。
dotnet new webapi -n PdfGenerationDemo
cd PdfGenerationDemo
2.安装必要的 NuGet 包
我们将使用 iText7 生成 PDF。使用以下命令安装它。
dotnet add package itext7
二.创建模型
创建一个模型来表示证书所需的数据。在 Models 文件夹中添加一个新类 CertificationModel.cs。
namespace PdfGenerationDemo.Models
{
public class CertificateModel
{
public string Full_Name { get; set; }
public string University_Name { get; set; }
public string Mobile_Number { get; set; }
public string Email { get; set; }
public string CampName { get; set; }
public string From_Date { get; set; }
public string To_Date { get; set; }
public string Description { get; set; }
public string Duration { get; set; }
public string Institute_Name { get; set; }
public string Nss_Logo { get; set; }
public string ProfileImageBase64 { get; set; }
}
}
三.创建控制器
在 Controllers 文件夹中添加一个新的控制器 CertificationController.cs。
using Microsoft.AspNetCore.Mvc;
using PdfGenerationDemo.Models;
using System;
using System.IO;
using System.Threading.Tasks;
using iText.Html2pdf;
using iText.Kernel.Pdf;
namespace PdfGenerationDemo.Controllers
{
[Route("api/[controller]")]
[ApiController]
public class CertificateController : ControllerBase
{
[HttpPost]
[Route("GenerateCertificate")]
public async Task<IActionResult> GenerateCertificate([FromBody] CertificateModel request)
{
if (request == null)
{
return BadRequest("Invalid request data.");
}
try
{
byte[] pdfBytes = GeneratePDF(request);
string base64String = Convert.ToBase64String(pdfBytes);
return Ok(new { Success = true, PdfBase64 = base64String });
}
catch (Exception ex)
{
return StatusCode(500, $"Internal server error: {ex.Message}");
}
}
private byte[] GeneratePDF(CertificateModel request)
{
string body = Template_Body(request);
using (MemoryStream outputStream = new MemoryStream())
{
PdfWriter writer = new PdfWriter(outputStream);
PdfDocument pdfDoc = new PdfDocument(writer);
pdfDoc.SetDefaultPageSize(iText.Kernel.Geom.PageSize.A4);
HtmlConverter.ConvertToPdf(body, pdfDoc);
return outputStream.ToArray();
}
}
private string Template_Body(CertificateModel request)
{
string logoBase64 = request.Logo;
string photoBase64 = Convert.ToBase64String(Convert.FromBase64String(request.ProfileImageBase64));
return $@"
<html>
<head>
<style type='text/css'>
body, html {{
margin: 0;
padding: 0;
width: 100%;
height: 100%;
font-family: Georgia, serif;
}}
.container {{
border: 15px solid #888;
width: 90%;
margin: 0 auto;
padding: 20px;
background-color: white;
box-shadow: 0 0 10px rgba(0,0,0,0.5);
text-align: center;
}}
.logo img {{
width: 300px;
margin-bottom: 15px;
}}
.marquee {{
color: tan;
font-size: 36px;
margin: 10px 0;
}}
.assignment {{
font-size: 20px;
margin: 20px 0;
}}
.person {{
border-bottom: 2px solid black;
font-size: 24px;
font-style: italic;
margin: 20px auto;
width: 80%;
display: inline-block;
}}
.details {{
font-size: 18px;
margin: 20px 0;
}}
.photo img {{
border: 1px solid #ddd;
border-radius: 100%;
padding: 0px;
width: 150px;
}}
.reason {{
margin: 20px 0;
font-size: 18px;
}}
.signature {{
margin-top: 50px;
font-size: 18px;
}}
.signature .sig-line {{
border-bottom: 1px solid black;
width: 50%;
margin: 20px auto;
}}
.footer {{
font-size: 14px;
color: #aaa;
margin-top: 30px;
}}
</style>
</head>
<body>
<div class='container'>
<div class='logo'>
<img src='data:image/png;base64,{logoBase64}' alt='Logo'>
</div>
<div class='marquee'>
Certificate of NSS
</div>
<div class='assignment'>
{request.University_Name}
</div>
<div class='assignment'>
This certificate is presented to
</div>
<div class='photo'>
<img src='data:image/jpeg;base64,{photoBase64}' alt='Student Photo'>
</div>
<div class='person'>
{request.Full_Name}
</div>
<div class='details'>
<p>Number: {request.Mobile_Number}</p>
<p>Email: {request.Email}</p>
<p>Camp Name: {request.CampName}</p>
<p>Camp Time: {request.From_Date} To {request.To_Date}</p>
<p>Description: {request.Description}</p>
</div>
<div class='reason'>
For Participation in Camp of {request.Duration} With College<br />
</div>
<div class='reason'>
{request.Institute_Name}<br />
</div>
<div class='signature'>
<p>Authorized Signature</p>
<div class='sig-line'></div>
</div>
<div class='footer'>
<p>© 2024 An Organization. All Rights Reserved.</p>
</div>
</div>
</body>
</html>";
}
}
}
四.测试 API
您可以使用 Postman 等工具测试 API。操作方法如下。
1.运行你的项目
dotnet run
2.获取响应
响应将包含生成的 PDF 的 base64 编码字符串。
响应将包含生成的 PDF 的 base64 编码字符串。
五.结论
在本指南中,我们介绍了如何使用 iText7 库在 .NET Core Web API 中生成 PDF。我们介绍了设置项目、创建模型、编写控制器和测试 API 的过程。此方法可以根据需要进行扩展和定制,以适应涉及动态 PDF 生成的各种用例。