Convert HTML to PDF
2025/07/14 12:29:05
0
15
1. NuGet 引用 iText 套件
2. 利用 iText 套件 由 html 產生 pdf (但會因特殊字形而亂碼, 例: 中文字)
using iText.Html2pdf;
using iText.Html2pdf.Resolver.Font;
using iText.Kernel.Geom;
using iText.Kernel.Pdf;
using iText.Layout.Font;
/// <summary>
/// html to pdf
/// </summary>
/// <param name="path"></param>
/// <param name="htmlContent"></param>
/// <param name="pageSize"></param>
private void ConvertHtmlToPdf(string path, string htmlContent, PageSize? pageSize = null)
{
// 接下來把html語法輸出為PDF
if (string.IsNullOrWhiteSpace(path))
path = $"C:\\pdf\\{DateTime.Now.ToString("yyyyMMddHHmmsss")}";
ConvertHtmlToPdf(new PdfWriter(path), htmlContent, pageSize);
}
/// <summary>
/// html to pdf
/// </summary>
/// <param name="stream"></param>
/// <param name="htmlContent"></param>
/// <param name="pageSize"></param>
private void ConvertHtmlToPdf(MemoryStream stream, string htmlContent, PageSize? pageSize = null)
{
// 接下來把html語法輸出為PDF
if (stream == null)
stream = new MemoryStream();
ConvertHtmlToPdf(new PdfWriter(stream), htmlContent, pageSize);
}
/// <summary>
/// html to pdf
/// </summary>
/// <param name="pw"></param>
/// <param name="htmlContent"></param>
/// <param name="pageSize"></param>
private void ConvertHtmlToPdf(PdfWriter pw, string htmlContent, PageSize? pageSize)
{
ConverterProperties properties = new ConverterProperties();
// 接下來把html語法輸出為PDF
PdfDocument doc = new PdfDocument(pw);
// PageSize為A4
if (pageSize != null)
doc.SetDefaultPageSize(pageSize);
// 是讀html語法的關鍵,需要再下載itext7.pdfhtml
HtmlConverter.ConvertToPdf(htmlContent, doc, AddPdfFont(properties));
}
/// <summary>
/// 產生 pdf 字型檔
/// </summary>
/// <param name="properties"></param>
/// <returns></returns>
private ConverterProperties AddPdfFont(ConverterProperties? properties = null)
{
if (properties == null)
properties = new ConverterProperties();
// 第三個參數需為True,先抓主機的預設,讓中文可以顯示
DefaultFontProvider provider = new DefaultFontProvider(true, true, true);
FontProvider fontprovider = new FontProvider(provider.GetDefaultFontFamily());
// 加入微軟正黑體
fontprovider.AddFont("C:/Windows/Fonts/msjh.ttc,1");
properties.SetFontProvider(fontprovider);
return properties;
}
3. 範本
html 原始檔 附件--範本.pdf
轉出後 附件--範本.txt
4. 執行範例
public void Main()
{
var path = "C:\\範本.pdf";
var htmlContent = FileHelper.ReadFileText("C:\\範本.html");
ConvertHtmlToPdf(path, htmlContent);
using (var stream = new MemoryStream())
{
ConvertHtmlToPdf(stream, htmlContent);
}
}
5. 授權方式
AGPLv3 - GNU AFFERO GENERAL PUBLIC LICENSE
https://itextpdf.com/how-buy/legal/agpl-gnu-affero-general-public-license
6. 參考
https://wthomasu.pixnet.net/blog/post/48573028
https://kb.itextpdf.com/itext/chapter-6-using-fonts-in-pdfhtml