日本不卡不码高清免费观看,久久国产精品久久w女人spa,黄色aa久久,三上悠亚国产精品一区二区三区

您的位置:首頁技術文章
文章詳情頁

詳解如何使用Net將HTML簡歷導出為PDF格式

瀏覽:376日期:2022-06-11 09:21:06
目錄
  • 正文
  • 使用Select.HtmlToPdf.NetCore
  • 效果圖展示
    • 首先使用ChatGPT生成個人簡歷信息
    • 代碼部分
    • pdfReport.css :

正文

現在有許多將HTML導出PDF的第三方包,這里介紹使用的是Select.HtmlToPdf.NetCore

使用Select.HtmlToPdf.NetCore

  • 整體思路是將cshtml內容讀出來,然后再轉為Pdf文檔
  • 讀取cshtml內容有兩種方法,第一種使用第三方包 RazorEngine.NetCore,第二種使用官方方法進行讀取。(注意兩種方法的cshtml內容略有不同)

效果圖展示

我把所有的源代碼都上傳到了我的個人Github,有需要的請自取:github.com/WeiMing0803…

首先使用ChatGPT生成個人簡歷信息

代碼部分

HomeController.cs :

public async Task<IActionResult> ToPdf(){    PdfDocument pdfDocument = new PdfDocument();    HtmlToPdf converter = new HtmlToPdf();//實例化一個html到pdf轉換器對象    converter.Options.PdfPageOrientation = PdfPageOrientation.Portrait;//設置頁面方向    converter.Options.PdfPageSize = PdfPageSize.A4;//設置頁面大小    converter.Options.MarginTop = 10;//設置頁邊距    converter.Options.MarginBottom = 10;    converter.Options.MarginLeft = 10;    converter.Options.MarginRight = 10;    PdfReportModel model = new PdfReportModel { Name = "彭于晏", Email = "pengyuyan@outlook.com" };    //string htmlResult = readByEngineRazor(model);//第一種方法,使用RazorEngine.NetCore讀取Cshtml文件    string htmlResult = await readCshtml(model);//第二種方法    if (!string.IsNullOrEmpty(htmlResult))    {pdfDocument = converter.ConvertHtmlString(htmlResult);    }    string savePath = Path.Combine(Environment.GetFolderPath(Environment.SpecialFolder.Desktop), $@"ExportPDF\{DateTime.Now.ToString("yyyyMMdd")}");    Directory.CreateDirectory(savePath);    string filename = Path.Combine(savePath, $"{DateTime.Now.ToString("yyyyMMddHHmmssffff")}.pdf");    pdfDocument.Save(filename);    byte[] bytes = System.IO.File.ReadAllBytes(filename);    return File(bytes, "application/pdf", Path.GetFileName(filename));} private string readByEngineRazor(PdfReportModel model){    string template = System.IO.File.ReadAllText("Views/Report/PdfReport.cshtml");    string htmlResult = Engine.Razor.RunCompile(template, "PdfReport", typeof(PdfReportModel), model);    return htmlResult;}private async Task<string> readCshtml(PdfReportModel model){    string htmlResult = await _viewRenderService.RenderToStringAsync("Report/PdfReport", model);    return htmlResult;}

TemplateGadgetProvider.cs :

public class TemplateGadgetProvider{    public static TemplateGadgetProvider _instance;    public static TemplateGadgetProvider Instance    {get{    if (_instance == null)_instance = new TemplateGadgetProvider();    return _instance;}    }    public string Load(string virtualPath)    {return File.ReadAllText(virtualPath);    }}

pdfReport.css :

Css樣式文件:

html {    font-family: "Open Sans", sans-serif;    background: whitesmoke;}a {    text-decoration: none;    color: black;}hr {    background: grey;}#container {    position: relative;    display: flex;}#profile {    flex: 15%;    display: block;    position: relative;    margin: 5% 2% 0 10%;    width: 100%;    height: 100%;}#info-cards {    flex: 55%;    display: block;    margin-top: 5%;    margin-right: 10%;    width: 100%;    height: 100%;}#image {    position: relative;    overflow: hidden;}#image,#profile-photo {    position: relative;    width: 80px;    height: 80px;    border-radius: 10px;}    #image > a {position: absolute;top: 0;left: 0;background: rgba(0, 0, 0, 0.5) !important;height: 100%;width: 100%;display: none;    }#image > a > i {    -webkit-text-stroke: 1px #ffffffdd;    padding: 40%;}    #image:hover a {display: block;    }#name {    font-size: 23px !important;    line-height: 20px !important;}#about,.card > ul > li {    padding: 0 0 0 15px;    position: relative;    display: inline-block;    width: 100%;}#about {    font-size: 20px !important;    padding: 0 !important;}    #name,    #about > p {font-weight: bolder;font-family: "Open Sans", sans-serif;    }#email {    font-size: 15px !important;    font-weight: bold !important;    font-family: "Cutive Mono", monospace;}#college,#email,#year-graduation,#education,#more-about,#telephone,#fax {    color: #555;    font-size: 13.5px;}strong,span {    color: black;    font-size: 16px;}#social-links,#about {    display: inline-block;}#social-links {    margin-bottom: 12px;}    #social-links a {margin: 0 10px;    }#edit-intro {    display: block;    color: #097bbf;    font-family: "Nunito", sans-serif;}.fab {    font-size: 1.1em;}.fab,.fas {    color: whitesmoke;}#about > a {    top: 4px;    right: 8px;}.edit {    top: 19px;    right: 10px;}#about > a,.edit {    position: absolute;    font-size: 15px !important;}.stroke-transparent {    -webkit-text-stroke: 1px #000;    -webkit-text-fill-color: transparent;}.blue {    color: #097bbf !important;    font-size: 13px;}.stroke-transparent-blue {    -webkit-text-stroke: 1px #097bbf;    -webkit-text-fill-color: transparent;}.card {    box-shadow: 0 3px 10px 0 rgba(0, 0, 0, .1);    overflow-x: hidden;    margin-bottom: 30px;    padding: 15px 30px 30px 30px;    background-color: #fff;}    .card > p {color: #0e141e;font-weight: bolder;font-size: 18px;line-height: 2;    }.card > p > i {    font-size: 18px;}    .card > a {font-weight: 400;font-size: 15px;margin: 0;margin-left: 25px;padding: 0;border: 0;height: auto;background: transparent;color: #097bbf;outline: none;cursor: pointer;    }    .card > ul {list-style-type: none;    }.tags {    font-size: 17px;    font-weight: bolder;}    .tags ~ a {display: none !important;    }    .tags span {font-size: 14px;font-weight: normal;color: #0e141e;    }.tags span span {    color: #738f93;}@media screen and (max-width:1090px) {    #profile {margin-left: 5%;    }}@media screen and (max-width:850px) {    #container {display: block;    }    #profile {width: 90%;    }    .card {margin: 0 5%;margin-bottom: 30px;    }}

PdfReport.cshtml :

使用RazorEngine.NetCore需要修改下面兩處地方

刪除 @model PdfReportModel

@Html.Raw(@style) 修改為 @@Raw(@style)

視圖文件:點擊查看詳細內容

@using exportPdf.common@model PdfReportModel   <!DOCTYPE html><html lang="en"><head>    <meta charset="UTF-8">    <meta http-equiv="X-UA-Compatible" content="IE=edge">    <meta name="viewport" content="width=device-width, initial-scale=1.0">    <title>Document</title>    @{string style = TemplateGadgetProvider.Instance.Load(@"wwwroot\css\pdfReport.css");    }    <style>@Html.Raw(@style)</style></head><body>    <div id="inner-nav"></div>    <div id="container"><div id="profile">    <div id="image"><img id="profile-photo" src="https://img2023.cnblogs.com/blog/233608/202303/233608-20230308165653594-2049775608.jpg"><a href="#" rel="external nofollow"  rel="external nofollow"  rel="external nofollow"  rel="external nofollow"  rel="external nofollow" ><i></i></a>    </div>    <p id="name">@Model.Name<br><span id="email">@Model.Email</span></p>    <p id="designation">前端開發工程師<br><span id="college">天將降大任于斯人也,必先苦其心志,勞其筋骨,餓其體膚,空乏其身,行拂亂其所為也,所以動心忍性,增益其所不能。——《孟子》 </span></p>    <div id="social-links"><a href="#" rel="external nofollow"  rel="external nofollow"  rel="external nofollow"  rel="external nofollow"  rel="external nofollow" ><i></i></a><a><i       ></i></a><a><i       ></i></a><a><i       ></i></a></div>    <a id="edit-intro" href="#" rel="external nofollow"  rel="external nofollow"  rel="external nofollow"  rel="external nofollow"  rel="external nofollow" ><i></i>  </a>    <hr width="100%">    <div id="about"><p>個人詳情</p><a href="#" rel="external nofollow"  rel="external nofollow"  rel="external nofollow"  rel="external nofollow"  rel="external nofollow" ><i></i></a>    </div>    <p id="year-graduation">預計畢業年份<br><strong>2023年6月</strong></p>    <p id="education">學歷<br><strong>湖南大學 本科</strong></p>    <p id="more-about">專業<br><strong> 計算機科學與技術專業</strong></p>    <p id="telephone">電話<br><strong>0532-2271351</strong></p>    <p id="fax">傳真<br><strong>+91-532-25453441</strong></p></div><div id="info-cards">    <div><p><i></i>   專業技能</p><ul>    <li><p>1. 熟練掌握HTML、CSS、JavaScript等前端基礎技術</p>    </li>    <li><p>2. 熟悉jQuery、Bootstrap等常用前端框架和庫</p>    </li>    <li><p>3. 了解Node.js、Express等后端開發技術</p>    </li>    <li><p>4. 掌握Git、Webpack等常用開發工具</p>    </li>    <li><p>5. 具備良好的編碼風格和文檔習慣</p>    </li></ul>    </div>    <div><p><i></i>   工作檢驗</p><ul>    <li><p>1. 依帆網站首頁制作(個人項目)<br>    - 使用HTML、CSS、JavaScript實現了一個響應式的網站首頁<br>    - 使用Bootstrap進行布局和樣式美化,使用jQuery實現輪播圖和導航欄效果<br>    - 使用Webpack進行打包和優化,使用Git進行版本控制和部署</p>    </li>    <li><p>2. 藝風網站后臺管理系統(實習項目)<br>    - 參與了一個基于Node.js和Express的后臺管理系統的開發<br>    - 負責前端頁面的編寫,使用EJS模板引擎渲染數據<br>    - 使用Ajax和Fetch進行數據交互,使用Element UI組件庫提升用戶體驗<br>    - 遵循MVC架構,使用Mongoose操作MongoDB數據庫</p>    </li></ul>    </div>    <div><p><i></i>   自我評價</p><ul>    <li><p>具備較強的學習能力和邏輯思維能力,喜歡接觸新技術和新知識</p>    </li>    <li><p>具備良好的溝通能力和團隊協作能力,能夠積極配合團隊完成任務</p>    </li>    <li><p>具備一定的創新能力和解決問題能力,能夠針對不同需求提出合理方案</p>    </li></ul><a href="#" rel="external nofollow"  rel="external nofollow"  rel="external nofollow"  rel="external nofollow"  rel="external nofollow" >+ Add new</a>    </div></div>    </div></body></html>


ViewRenderService :

public class ViewRenderService{    private readonly IRazorViewEngine _razorViewEngine;    private readonly ITempDataProvider _tempDataProvider;    private readonly IServiceProvider _serviceProvider;    public ViewRenderService(IRazorViewEngine razorViewEngine,ITempDataProvider tempDataProvider,IServiceProvider serviceProvider)    {_razorViewEngine = razorViewEngine;_tempDataProvider = tempDataProvider;_serviceProvider = serviceProvider;    }    public async Task&lt;string&gt; RenderToStringAsync(string viewName, object model)    {var httpContext = new DefaultHttpContext { RequestServices = _serviceProvider };var actionContext = new ActionContext(httpContext, new RouteData(), new ActionDescriptor());using (var sw = new StringWriter()){    var viewResult = _razorViewEngine.FindView(actionContext, viewName, false);    if (viewResult.View == null)    {throw new ArgumentNullException($"{viewName} does not match any available view");    }    var viewDictionary = new ViewDataDictionary(new EmptyModelMetadataProvider(), new ModelStateDictionary())    {Model = model    };    var viewContext = new ViewContext(actionContext,viewResult.View,viewDictionary,new TempDataDictionary(actionContext.HttpContext, _tempDataProvider),sw,new HtmlHelperOptions()    );    await viewResult.View.RenderAsync(viewContext);    return sw.ToString();}    }}

Program.cs :

builder.Services.AddTransient<ViewRenderService>();

以上就是使用Select.HtmlToPdf.NetCore將HTML導出為PDF的全部內容!

更多關于Net HTML導出為PDF格式的資料請關注其它相關文章!

標簽: ASP.NET
日本不卡不码高清免费观看,久久国产精品久久w女人spa,黄色aa久久,三上悠亚国产精品一区二区三区
成人小电影网站| 久久在线电影| 99亚洲精品| 国产精品av久久久久久麻豆网| 国产aⅴ精品一区二区四区| 美女视频网站久久| 美腿丝袜在线亚洲一区| 国产日韩欧美中文在线| 欧美日韩精品一区二区三区视频| 婷婷丁香综合| 午夜在线精品| 日韩激情一区二区| 国产精品亚洲二区| 国产一区二区三区亚洲| 波多野结衣久久精品| 日韩欧美二区| 欧美a级片一区| 国产精品日韩久久久| 综合一区av| 国产精品亚洲产品| www.51av欧美视频| 国产在线成人| 亚洲毛片视频| 精品午夜久久| 国产传媒在线观看| 国产一区久久| 日韩在线观看一区二区三区| 91成人精品观看| yellow在线观看网址| 亚洲精品午夜av福利久久蜜桃| 国产午夜精品一区二区三区欧美| 婷婷成人av| 久久亚洲精精品中文字幕| 亚洲天堂一区二区| 视频一区二区中文字幕| 国产欧美日本| 久久婷婷亚洲| 亚洲精品第一| 国产99在线| 午夜视频精品| 欧美亚洲tv| 久久黄色影院| 日本一区福利在线| 国产精品毛片久久| 久久国产88| 久久不见久久见免费视频7| 日韩亚洲一区在线| 蜜臀久久久久久久| 久久久久黄色| 亚洲一区二区三区免费在线观看| 国产精品宾馆| 激情综合网站| 国产精品地址| 91成人精品视频| 天海翼亚洲一区二区三区| 久久一区视频| 99国产精品视频免费观看一公开| 国产精品视频一区视频二区| 免费成人网www| 欧美精品97| 国产亚洲福利| 91视频一区| 少妇精品久久久一区二区| 性欧美videohd高精| 日韩av中文字幕一区| 欧美亚洲国产精品久久| 国产欧美另类| 日韩高清不卡在线| 99久久九九| 欧美性www| 99香蕉国产精品偷在线观看 | 在线综合欧美| 国产一区二区三区国产精品| 蜜臀av亚洲一区中文字幕| 韩国一区二区三区视频| 免费在线观看精品| 国产精品www994| 亚洲专区欧美专区| 久久精品免费一区二区三区| 国产欧美日韩视频在线| 免费视频久久| 99精品网站| 国产精品欧美大片| 亚洲色图网站| 一区福利视频| 午夜av成人| 成人在线黄色| 国产欧美日韩一区二区三区四区| 蜜臀av亚洲一区中文字幕| 蜜臀av免费一区二区三区| 精品国产乱码| 国产精品亚洲四区在线观看| 美国三级日本三级久久99| 国产综合精品| 日韩不卡视频在线观看| 欧美丰满日韩| 精品日韩一区| 久久国产三级| 亚洲va久久| 一区二区91| 蜜桃av一区| 一区三区视频| 99视频一区| 在线视频日韩| 性色av一区二区怡红| 免费视频一区三区| 欧美性感美女一区二区| 日韩欧美二区| 久久精品免费一区二区三区| 97se综合| 电影亚洲精品噜噜在线观看| 91亚洲成人| 国产成人精品999在线观看| 欧美aⅴ一区二区三区视频| 国产精品麻豆成人av电影艾秋| 日韩二区在线观看| 日韩不卡一二三区| 国产欧美日韩| 麻豆精品视频在线观看视频| 国产精品xxxav免费视频| 国产福利资源一区| 精品国产一区二区三区噜噜噜| 免费在线播放第一区高清av| 国产精品久久久久av蜜臀| 国产精品国产三级在线观看| 国产情侣久久| 蜜桃久久久久| 久久久久97| 国产一区二区三区四区二区| 精品久久免费| 五月激情久久| 伊人久久亚洲美女图片| 久久午夜视频| 日韩极品在线观看| 国产精品一页| 精品无人区麻豆乱码久久久 | 亚洲伊人av| 久久久久91| 国产亚洲网站| 日韩一区二区三区免费视频 | 亚洲免费专区| 欧美精品三级在线| 国产精品尤物| 国产在线看片免费视频在线观看| 久久久国产精品一区二区中文| 午夜av一区| 亚洲乱亚洲高清| 久久精品xxxxx| 国产精品99一区二区三区| 日韩在线二区| 久久不射网站| 日本不卡视频一二三区| 国产精品传媒麻豆hd| 麻豆mv在线观看| 亚洲国产日韩欧美在线| 香蕉久久久久久| 免费在线播放第一区高清av| 中文另类视频| 一区二区电影在线观看| 国产精品毛片视频| 欧美日韩免费看片| 美女被久久久| 麻豆久久久久久久| 99视频精品全部免费在线视频| 在线亚洲自拍| 国产伦精品一区二区三区视频 | 日本高清久久| 激情综合婷婷| 日韩午夜电影| 国产精久久一区二区| 久久久亚洲一区| 日韩精品成人在线观看| 欧美少妇精品| 日韩一区网站| 成人日韩在线| 免费在线观看不卡| 精品视频一区二区三区四区五区| 欧美日韩一区二区综合| 亚洲精品日本| 丁香六月综合| 日韩福利视频网| 99视频精品视频高清免费| 天堂久久一区| 另类中文字幕国产精品| 日韩欧美美女在线观看| 国产不卡一区| 亚洲日本久久| 亚洲天堂免费电影| 少妇精品久久久| 欧美成a人国产精品高清乱码在线观看片在线观看久 | 美国三级日本三级久久99| 久久久精品久久久久久96| 老牛国内精品亚洲成av人片| 欧美日韩一区二区三区不卡视频| 99久久精品网| 蜜桃一区二区三区| 国产亚洲精品精品国产亚洲综合| 老牛国产精品一区的观看方式| 国产精品免费99久久久| 青草久久视频|