Convert HTML to PDF

李建毅 (Joe Lee) 2025/07/14 12:29:05
15

 

1. NuGet 引用 iText 套件 

iText NuGet

 

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

 

李建毅 (Joe Lee)