Tạo tài liệu PDF một cách linh hoạt là một nhiệm vụ phổ biến trong các ứng dụng hiện đại, đặc biệt là đối với hóa đơn, báo cáo, hợp đồng và chứng chỉ. Trong bài viết này, chúng ta sẽ khám phá cách tạo các file PDF từ các mẫu có sẵn trong C# sử dụng thư viện IronPDF. Chúng ta sẽ đi qua các bước tạo mẫu, chèn dữ liệu, định dạng, và tạo đầu ra một cách có cấu trúc và sát với thực tế.
Thay vì tạo bố cục PDF thủ công bằng code, ta sẽ sử dụng các mẫu được chuẩn bị sẵn có thể tái sử dụng cho nhiều tài liệu khác nhau. Điều này giúp quy trình sạch hơn, đầu ra chuyên nghiệp hơn, và dễ mở rộng cho các nâng cấp sau này.
Tại sao nên dùng mẫu PDF?
Mẫu (template) giúp bạn thiết kế bố cục tài liệu độc lập với logic của mã nguồn. Bằng cách dùng nội dung HTML, bạn có thể định nghĩa sẵn kiểu dáng, cấu trúc và các placeholder (chỗ trống dữ liệu) rồi kết nối chúng với mô hình dữ liệu. Cách làm này cải thiện khả năng tái sử dụng và đảm bảo tính nhất quán giữa các tài liệu.
Đặc biệt hữu ích khi bạn cần:
- Tạo báo cáo PDF dựa trên dữ liệu người dùng
- Thêm hình ảnh hoặc logo động
- Kiểm soát bố cục bằng CSS (ví dụ: lề, kích thước chữ, ngắt trang)
- Làm việc với nội dung web hoặc xuất trang web thành PDF
Mẫu PDF thường được viết bằng HTML/CSS, giúp dễ dàng kiểm soát thiết kế và tách biệt vai trò của lập trình viên và nhà thiết kế.
Công cụ và thư viện sử dụng
Trong hướng dẫn này, chúng ta sử dụng IronPDF — một thư viện tạo PDF mạnh mẽ cho C#, hỗ trợ:
- Kết xuất HTML và Razor view thành PDF
- Chèn dữ liệu động vào mẫu
- Nạp HTML từ chuỗi, file hoặc URL
- Hỗ trợ CSS và JavaScript
Cài đặt môi trường
Mở dự án của bạn trong Visual Studio, cài đặt IronPDF thông qua NuGet:
Install-Package IronPdf
IronPDF hỗ trợ .NET Framework, .NET Core, .NET 5/6/7+ và hoạt động đa nền tảng (Windows, Linux, macOS).
Bước 1: Tạo file HTML mẫu
Chúng ta khuyến nghị tạo một file .html
riêng thay vì nhúng HTML trực tiếp trong code C#. Điều này giúp code gọn hơn và dễ bảo trì.
📄 invoice-template.html
:
<!DOCTYPE html>
<html>
<head> <meta charset="UTF-8"> <style> body { font-family: Arial, sans-serif; padding: 40px; } h1 { color: #333; } table { width: 100%; border-collapse: collapse; margin-top: 20px; } th, td { padding: 12px; border: 1px solid #ccc; } </style>
</head>
<body> <h1>Invoice #{{InvoiceNumber}}</h1> <p><strong>Date:</strong> {{Date}}</p> <p><strong>Customer:</strong> {{CustomerName}}</p> <table> <thead> <tr><th>Item</th><th>Quantity</th><th>Price</th></tr> </thead> <tbody> {{Items}} </tbody> </table> <p><strong>Total:</strong> {{Total}}</p>
</body>
</html>
Giải thích:
- Đây là một file HTML đơn giản có dùng các placeholder như
{{InvoiceNumber}}
,{{CustomerName}}
, và{{Items}}
. Sau này chúng ta sẽ thay thế các phần này bằng dữ liệu thật từ C#.
Bước 2: Nạp và điền dữ liệu vào mẫu bằng C#
📄 Code ví dụ:
using System.Text; // Step 1: Load HTML template from file
string templatePath = "invoice-template.html";
string htmlTemplate = File.ReadAllText(templatePath); // Step 2: Define data
string invoiceNumber = "INV-1001";
string date = DateTime.Now.ToShortDateString();
string customer = "John Doe";
var items = new List<(string Name, int Qty, decimal Price)>
{ ("Laptop", 1, 999.99m), ("Mouse", 2, 25.50m)
}; // Step 3: Generate HTML rows for items
StringBuilder itemRows = new StringBuilder();
decimal total = 0; foreach (var item in items)
{ total += item.Qty * item.Price; itemRows.AppendLine( $"<tr><td>{item.Name}</td><td>{item.Qty}</td><td>${item.Price:F2}</td></tr>");
} // Step 4: Replace placeholders with actual data
string populatedHtml = htmlTemplate .Replace("{{InvoiceNumber}}", invoiceNumber) .Replace("{{Date}}", date) .Replace("{{CustomerName}}", customer) .Replace("{{Items}}", itemRows.ToString()) .Replace("{{Total}}", $"${total:F2}");
Giải thích:
File.ReadAllText()
để đọc file HTML mẫu- Dữ liệu hóa đơn được lưu trong biến và danh sách
- Dùng
StringBuilder
để tạo các dòng HTML cho bảng sản phẩm - Dùng
.Replace()
để thay thế các placeholder bằng dữ liệu thật
Bước 3: Chuyển đổi HTML thành PDF
📄 Chuyển HTML sang PDF:
using IronPdf; var renderer = new ChromePdfRenderer(); PdfDocument pdf = renderer.RenderHtmlAsPdf(populatedHtml); // Save the PDF to file pdf.SaveAs("Invoice.pdf");
Giải thích:
ChromePdfRenderer()
tạo trình kết xuất mớiRenderHtmlAsPdf()
chuyển chuỗi HTML thành tài liệu PDFSaveAs()
lưu file PDF ra ổ đĩa
Output:
Tùy chọn: Thêm Header và Footer
Để tài liệu trông chuyên nghiệp hơn, bạn có thể thêm đầu/trang chân cho mỗi trang:
📄 Ví dụ:
var renderer = new ChromePdfRenderer(); renderer.RenderingOptions.TextHeader.CenterText = "ACME Corporation Invoice";
renderer.RenderingOptions.TextFooter.DrawDividerLine = true;
PdfDocument pdf = renderer.RenderHtmlAsPdf(populatedHtml); // Save the PDF to file
pdf.SaveAs("Invoice.pdf");
Giải thích:
- Thêm tiêu đề ở giữa mỗi trang và vạch phân cách chân trang.
Output:
Lưu ý khi xử lý lỗi và best practice
- Placeholder thiếu: Đảm bảo thay thế hết
{{...}}
- Mã hóa: Dùng UTF-8 cho các file HTML
- Hình ảnh/phông chữ: Chèn base64 hoặc đảm bảo liên kết hoạt động
- Bọc quá trình render trong
try-catch
để xử lý lỗi
Tính năng nâng cao của IronPDF
- Gộp/tách PDF
- Điền form PDF
- Ký số và mã hóa
- Chuyển PDF thành ảnh
- Chạy JavaScript trong HTML
- Kết xuất đa luồng cho xử lý hàng loạt
Ứng dụng thực tế
Mẫu PDF rất phổ biến trong:
- Thương mại điện tử – Hóa đơn, đơn hàng
- Nhân sự – Phiếu lương, thư mời
- Pháp lý – Hợp đồng, mẫu thỏa thuận
- Giáo dục – Bằng cấp, thẻ học sinh
- Y tế – Kết quả xét nghiệm, đơn thuốc
Kết luận
Tạo PDF từ mẫu trong C# là cách tiếp cận thực tiễn và có thể mở rộng cho các tài liệu động. Bằng việc tách nội dung (HTML) khỏi logic (C#), bạn sẽ có quy trình chuyên nghiệp, dễ bảo trì, và dễ mở rộng.
IronPDF giúp quá trình này trở nên dễ dàng và mạnh mẽ, dù bạn đang xây dựng ứng dụng web, desktop hay dịch vụ nền.