- vừa được xem lúc

Cách tạo file PDF từ mẫu (template) trong C#

0 0 1

Người đăng: Gung Typical

Theo Viblo Asia

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). image.png

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#.

image.png

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ới
  • RenderHtmlAsPdf() chuyển chuỗi HTML thành tài liệu PDF
  • SaveAs() lưu file PDF ra ổ đĩa

Output: image.png

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: image.png

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.

Bình luận

Bài viết tương tự

- vừa được xem lúc

Generate PDF với gem Prawn

Giới thiệu. Chào mọi người .

0 0 24

- vừa được xem lúc

Top 5 thu viện PDF cho react

Ngày nay, có rát nhiều ứng dụng web cung cấp các tùy chọn xem PDF có sẵn cho người dùng của họ. Tuy nhiên, việc chọn một thư viện cho việc đps không phải là dễ dàng vì chúng ta sẽ cần nhiều hơn là chỉ

0 0 66

- vừa được xem lúc

Các bài viết ngắn phần 27

What we look for in resume. Ở góc nhìn nhà tuyển dụng, thì mong muốn điều gì ở ứng viên? Hay cách bạn nên xây dựng hồ sơ cá nhân (CV, linkedin profile, .

0 0 21