天天看點

NetCore實戰:基于html生成pdf檔案案例講解

#頭條創作挑戰賽#

NetCore實戰:基于html生成pdf檔案案例講解

一、WkHtmlToPdfDotNet介紹

WkHtmlToPdfDotNet是基于本地 wkhtmltopdf封裝的.NET Core類庫,主要通過webkit引擎實作html頁面轉換為pdf檔案。并且支援在Windows、Docker、Linux、MacOSX運作。

主要功能實作線上URL轉pdf檔案或者html代碼直接轉換為pdf檔案,并對css樣式、圖檔等很好的支援,導出的pdf檔案和網站相差不大。

今天給大家通過實際的案例給大家介紹一下如何使用它,感興趣的朋友可以一起來學習一下!

官網:https://github.com/HakanL/WkHtmlToPdf-DotNet

二、安裝

1、使用Visual Studio 2019及以上版本建立一個.NET Core控制台程式。

2、安裝WkHtmlToPdfDotNet依賴包

指令方式安裝

工具→NuGet包管理器→程式包管理器控制包

安裝指令如下:

Install-Package Haukcode.WkHtmlToPdfDotNet           

直接通過Nuget包搜尋安裝

工具→NuGet包管理器→管了解決方案的NuGet程式包

3、實作代碼

using System;

using System.IO;

using WkHtmlToPdfDotNet;

namespace HtmlToPdf

{

    class Program

    {

        // https://github.com/HakanL/WkHtmlToPdf-DotNet

        // 安裝依賴包 Install-Package Haukcode.WkHtmlToPdfDotNet




        static void Main(string[] args)

        {

            //ConvertHtmlToPdf();

            ConvertUrlToPdf();

        }

        /// <summary>

        /// 基于html導出pdf

        /// </summary>

        private static void ConvertHtmlToPdf()

        {

            

            var converter = new BasicConverter(new PdfTools());

            // 綁定轉換過程中處理事件日志

            converter.PhaseChanged += Converter_PhaseChanged;

            converter.ProgressChanged += Converter_ProgressChanged;

            converter.Finished += Converter_Finished;

            converter.Warning += Converter_Warning;

            converter.Error += Converter_Error;

            // pdf 樣式設定

            var doc = new HtmlToPdfDocument()

            {

                GlobalSettings = {

                    ColorMode = ColorMode.Color,

                    Orientation = Orientation.Landscape,

                    PaperSize = PaperKind.A4,

                },

                Objects = {

                    new ObjectSettings() {

                        PagesCount = true,

                        HtmlContent = @" <p style='color:red'>hello</p><h2>測試</h2><img src='https://www.baidu.com/img/pc_675fe66eab33abff35a2669768c43d95.png' alt=''>",

                        WebSettings = { DefaultEncoding = "utf-8" },

                        HeaderSettings = { FontSize = 9, Right = "Page [page] of [toPage]", Line = false },

                        FooterSettings = { FontSize = 9, Right = "Page [page] of [toPage]" }

                    }

                }

            };

            // 轉換為二進制

            byte[] pdf = converter.Convert(doc);

            // 判斷目錄是否存在,不存在則建立

            if (!Directory.Exists("Files"))

            {

                Directory.CreateDirectory("Files");

            }

            // 檔案儲存

            using (var stream = new FileStream(Path.Combine("Files", DateTime.UtcNow.Ticks.ToString() + ".pdf"), FileMode.Create))

            {

                stream.Write(pdf, 0, pdf.Length);

            }

        }




        /// <summary>

        /// 基于url導出pdf

        /// </summary>

        private static void ConvertUrlToPdf()

        {




            var converter = new BasicConverter(new PdfTools());

            // 綁定轉換過程中處理事件日志

            converter.PhaseChanged += Converter_PhaseChanged;

            converter.ProgressChanged += Converter_ProgressChanged;

            converter.Finished += Converter_Finished;

            converter.Warning += Converter_Warning;

            converter.Error += Converter_Error;

            // pdf 樣式設定

            var doc = new HtmlToPdfDocument()

            {

                GlobalSettings = {

                    PaperSize = PaperKind.A3, // 紙張類型

                    Orientation = Orientation.Landscape,

                },

                // 支援多個網址

                Objects = {

                    new ObjectSettings()

                    {

                        Page = "http://baidu.com/",

                    },

                     new ObjectSettings()

                    {

                        Page = "https://www.163.com/dy/article/HJVSIG920511DTU9.html?clickfrom=w_yw_zgzz",




                    }

                }

            };




            // 轉換為二進制

            byte[] pdf = converter.Convert(doc);

            // 判斷目錄是否存在,不存在則建立

            if (!Directory.Exists("FilesHtml"))

            {

                Directory.CreateDirectory("FilesHtml");

            }

            // 檔案儲存

            using (var stream = new FileStream(Path.Combine("FilesHtml", DateTime.UtcNow.Ticks.ToString() + ".pdf"), FileMode.Create))

            {

                stream.Write(pdf, 0, pdf.Length);

            }

        }







        /// <summary>

        /// 轉換産生錯誤日志輸出

        /// </summary>

        /// <param name="sender"></param>

        /// <param name="e"></param>

        private static void Converter_Error(object sender, WkHtmlToPdfDotNet.EventDefinitions.ErrorArgs e)

        {

            Console.WriteLine("[轉換錯誤] {0}", e.Message);

        }

        /// <summary>

        /// 轉換産生警告日志輸出

        /// </summary>

        /// <param name="sender"></param>

        /// <param name="e"></param>




        private static void Converter_Warning(object sender, WkHtmlToPdfDotNet.EventDefinitions.WarningArgs e)

        {

            Console.WriteLine("[警告] {0}", e.Message);

        }

        /// <summary>

        /// 轉轉完成日志輸出

        /// </summary>

        /// <param name="sender"></param>

        /// <param name="e"></param>

        private static void Converter_Finished(object sender, WkHtmlToPdfDotNet.EventDefinitions.FinishedArgs e)

        {

            Console.WriteLine("轉換 {0} ", e.Success ? "成功" : "失敗");

        }

        /// <summary>

        /// 轉換進度日志輸出

        /// </summary>

        /// <param name="sender"></param>

        /// <param name="e"></param>

        private static void Converter_ProgressChanged(object sender, WkHtmlToPdfDotNet.EventDefinitions.ProgressChangedArgs e)

        {

            Console.WriteLine("轉換進度 {0}", e.Description);

        }

        /// <summary>

        /// 轉換階段日志輸入

        /// </summary>

        /// <param name="sender"></param>

        /// <param name="e"></param>

        private static void Converter_PhaseChanged(object sender, WkHtmlToPdfDotNet.EventDefinitions.PhaseChangedArgs e)

        {

            Console.WriteLine("階段進度 {0} - {1}", e.CurrentPhase, e.Description);

        }







    }

}
           

三、運作效果

基于線上url方式導出效果

NetCore實戰:基于html生成pdf檔案案例講解

直接拼接html方式導出效果

NetCore實戰:基于html生成pdf檔案案例講解