Asp.net MVC Razor視圖模版動態渲染PDF,Razor模版生成靜態Html

Asp.net MVC Razor視圖模版動態渲染PDF,Razor模版生成靜態Html

 

1.前言

 

    上一篇文章我開源了輪子Asp.net Core 3.1 Razor視圖模版動態渲染PDF,然後,很多小夥伴有很多私信找我了。那麼我下面就簡單的給大家說一下,關於小夥伴問的這些問題。

  • 我項目的電子簽章部分程式碼可否開源?

  答:我項目電子簽章也是使用第三方的電子簽章,電子簽章並不是自己實現的,項目裡面的電子簽章程式碼無非也是對接第三方的介面。這部分程式碼開源出去也沒有什麼意義。我們是使用數字廣東的方案,如果您也是使用該數字簽章,可以私下溝通我看看能不能幫助您。

  • 電子簽章實現難不難,怎麼實現自己的電子簽章?

  答:電子簽章要實現,估計不是太難,按照我的理解,當然我沒有具體深入研究(如果這裡我有妄自菲薄的意思,請諒解,畢竟我能力有限,只是按照我的理解來分析),我個人覺得電子簽章應該就是利用數字證書給PDF簽名,然後加密保護文檔,然後校驗文檔的真偽,就要考慮怎麼驗證這個文檔沒有被刪改,是當初我們簽章的這個文檔,而且這個簽名不能被偽造。個人覺得不是很複雜,但是,電子簽章的法律有效性卻不是這麼簡單的。按照國家法律規定,利用的簽名平台應該有資質的,國家認可的第三方簽章平台,也就是說,私人自己製作的簽章,打起官司來,很難得到法律支援。

  • 項目為什麼CSS樣式不起效?

  答:你是否使用了外鏈的CSS樣式,因為渲染Razor視圖是在後台渲染,無法找到外鏈的文件路徑,就使用不了外鏈的CSS樣式,內嵌和內聯CSS樣式都沒啥問題的。

  • 用word或者excel模版他不香嗎?為什麼要搞個這個東西?

  答:無非是多一個方案,具體你使用什麼完全是你自己說了算,你覺得其他方案好就用,你覺得本方案能幫助你就用,不好就不用,我又不收你半毛線,還是想說的是,你其他的方案,能有用CSS那麼容易做出來漂亮的表單效果嗎?

  • 圖片支援嗎?

  答:圖片要轉Base64編碼,不支援外連接圖片。

  • 前端預覽PDF用什麼插件?

  答:我目前不用插件,新一代瀏覽器都支援PDF直接預覽,直接就能渲染成PDF呈現,當然你也可以自己集成PDF.JS.我大概看了下,集成也很方便。我之所以不集成,是考慮到我的項目有可能使用IE低版本的情況,PDF.JS可能不支援。所以乾脆直接把PDF流推送給瀏覽器,瀏覽器要是能預覽,就直接呈現,不能預覽就下載。

  • 項目支援net Framework嗎?為啥報錯?

  答:這個問題問的有點多,所以本文後續就以這個再說一下本輪子在net45下的使用。還是那句話,有不對的,歡迎您指正,覺得對你有用的就用,無用的就直接忽視,我又不收你半毛線。

  • 可以用本項目生成靜態Html嗎?容易被搜索引擎抓取。

  答:可以,後面演示

 

  2.依賴項目

  <PackageReference Include=”TuesPechkin” Version=”2.1.1″ />
  <PackageReference Include=”TuesPechkin.Wkhtmltox.Win32″ Version=”0.12.2.1″ />
  <PackageReference Include=”RazorEngine” Version=”3.9.3″ />
  <PackageReference Include=”System.ComponentModel.Annotations” Version=”4.5.0″ />
  <PackageReference Include=”Microsoft.AspNet.Mvc” Version=”5.2.3″ />
  <PackageReference Include=”Nito.AsyncEx” Version=”4.0.1″ />
  <PackageReference Include=”Newtonsoft.Json” Version=”12.0.3″ />
  <Reference Include=”Nito.AsyncEx.Concurrent” Version=”4.0.1″ />
  <Reference Include=”Nito.AsyncEx.Enlightenment” Version=”4.0.1″ />

 

     3.核心程式碼

    TuesPechkin插件,首先說一下這個TuesPechkin插件,他其實是利用TuesPechkin.Wkhtmltox進程來轉換的。這個插件使用還是要小心的,使用不當可能有執行緒安全問題,會使得當前工作進程掛起。在IIS下面使用也要注意使用32位的插件。具體使用請看作者的說明://github.com/tuespetre/TuesPechkin/blob/develop/README.md

 

 

 

 插件初始化程式碼:

 

  private static readonly IConverter PdfConverter = new ThreadSafeConverter(new RemotingToolset<PdfToolset>(
            new Win32EmbeddedDeployment(
                new TempFolderDeployment())));

  

 切記IIS和多執行緒一定要靜態單例。使用

 Win32EmbeddedDeployment

ThreadSafeConverter
這兩個類。其他的可能讓你進程掛起的成為可能。
還要用到遠程工具集的PDF工具集。


Razor 轉Html程式碼,主要有兩種方式:


第一種使用RazorEngine來轉換:這個主要是傳遞Razor模版進去,轉換。

   protected string RunCompileRazorTemplate(object model,string razorTemplateStr)
        {
            if(string.IsNullOrWhiteSpace(razorTemplateStr))
                throw new ArgumentException("Razor模版不能為空");

            var htmlString= Engine.Razor.RunCompile(razorTemplateStr, razorTemplateStr.GetHashCode().ToString(), null, model);
            return htmlString;
        }

 

第二種使用ViewEngine。這個主要是自動查找Asp.net MVC裡面的View下面的Razor,目前我們項目就是使用這個。

 

var viewName = context.RouteData.Values["action"].ToString();
            var result = ViewEngines.Engines.FindView(context, viewName, null);
           
            IExportPdfByHtmlTemplate exportPdfByHtmlTemplate = new PdfByHtmlTemplateExporter ();
#endif
            if (result.View == null)
                throw new ArgumentException($"名稱為:{viewName}的視圖不存在,請檢查!");
             context.HttpContext.Response.ContentType = "application/pdf";
            //context.HttpContext.Response.Headers.Add("Content-Disposition", "attachment; filename=test.pdf");                    
            var html = "";
            using (var stringWriter = new StringWriter())
            {

#if !NET45
                var viewDictionary = new ViewDataDictionary(new EmptyModelMetadataProvider(), new ModelStateDictionary()) { Model = Value };
                var viewContext = new ViewContext(context, result.View, viewDictionary, new TempDataDictionary(context.HttpContext, tempDataProvider), stringWriter, new HtmlHelperOptions());

                await result.View.RenderAsync(viewContext);
#else
                var viewDictionary = new ViewDataDictionary(new ModelStateDictionary()) { Model = Value };
                var viewContext = new ViewContext(context, result.View, viewDictionary, context.Controller.TempData, stringWriter);
                result.View.Render(viewContext, stringWriter);
                result.ViewEngine.ReleaseView(context, result.View);
#endif
                html = stringWriter.ToString();

            }

 

推送PDF流給客戶端,預覽PDF主要程式碼

 

          context.HttpContext.Response.ContentType = "application/pdf";
    context.HttpContext.Response.AddHeader("Content-Length", buff.Length.ToString());
            context.HttpContext.Response.AddHeader("Content-Disposition", "filename=電子簽章PDF-"+DateTime.Now.ToString()+".pdf");
            context.HttpContext.Response.BinaryWrite(buff);
            context.HttpContext.Response.Flush();
            context.HttpContext.Response.Close();
            context.HttpContext.Response.End();

  

 這裡要注意三個地方,不然一定會踩坑。

Content-Length要設置,不然Google瀏覽器可能無法下載預覽的PDF。
Content-Disposition不能要attachment,否則可能直接下載不是預覽。
ContentType 要設置"application/pdf"


Razor轉靜態Html

還有一部分人問我怎麼利用本插件Razor模版動態生成靜態Html,這樣容易被百度爬蟲錄取。
其實這部分核心程式碼就是幾句程式碼,非常簡單。本項目直接用下面介面即可生成html字元轉,自行保存就可以了。

 public interface IHtmlByRazorTemplateExporter
    {
        Task<string> ExportHtmlByRazorTemplateAsync<T>(T data, string htmlTemplate) where T : class;
        string ExportHtmlByRazorTemplate<T>(T data, string htmlTemplate) where T : class;
    }

  

核心:

 

   protected string RunCompileRazorTemplate(object model,string razorTemplateStr)
        {
            if(string.IsNullOrWhiteSpace(razorTemplateStr))
                throw new ArgumentException("Razor模版不能為空");

            var htmlString= Engine.Razor.RunCompile(razorTemplateStr, razorTemplateStr.GetHashCode().ToString(), null, model);
            return htmlString;
        }

 

  4.使用方式

  •  目前本項目已經打包成nuget,並上傳,使用可以直接項目右鍵->管理NuGet程式包,查找,然後下載安裝。

 

  •  也可以使用命令安裝。install-package JESAI.HtmlTemplate.Pdf.net45

 

  • 或者直接fork本倉庫自己打包,並根據自己情況修改使用。

 

自定打包可以修改項目目標框架。項目右鍵->屬性->應用程式,目標框架,修改

 

 

 

如發現不能修改,可以,項目->右鍵->編輯項目文件

 

 

 

然後編譯,就可以使用了。

 

具體使用

方式一:

 

 

 方式二:

 

 

 

 

Razor視圖模版程式碼:

<!DOCTYPE html>

<html lang="en" xmlns="//www.w3.org/1999/xhtml">

<head>
    <meta charset="utf-8" />
    <title></title>
</head>

<body>
    <table border="1" style="background-color:gray;width:800px;height:500px;">
        <tr>
            <td>姓名</td>
            <td>@Model.Name</td>
            <td>性別</td>
            <td>@Model.Sex</td>
        </tr>
        <tr>
            <td>年齡</td>
            <td>@Model.Age</td>
            <td>班級</td>
            <td>@Model.Class</td>
        </tr>
        <tr>
            <td>住址</td>
            <td>@Model.Address</td>
            <td>電話</td>
            <td>@Model.Tel</td>
        </tr>
        <tr>
            <td clospan="2">住址</td>
            <td>@Model.Des</td>
        </tr>
    </table>
    <img src="data:image/jpg;base64,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" />
</body>
</html>

 

 

 

  5.運行效果

 

 

 

  6.項目程式碼

 程式碼託管://gitee.com/Jesai/JESAI.HtmlTemplate.Pdf

Tags: