现在有许多将HTML导出PDF的第三方包,这里介绍使用的是Select.HtmlToPdf.NetCore

使用Select.HtmlToPdf.NetCore

  1. 整体思路是将cshtml内容读出来,然后再转为Pdf文档
  2. 读取cshtml内容有两种方法,第一种使用第三方包 RazorEngine.NetCore,第二种使用官方方法进行读取。(注意两种方法的cshtml内容略有不同)

效果图展示

在线演示地址

我把所有的源代码都上传到了我的个人Github,有需要的请自取:https://github.com/WeiMing0803/ExportPdf

首先使用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需要修改下面两处地方

  1. 删除 @model PdfReportModel
  2. @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" alt="Profile-Image">
<a href="#"><i class="fas fa-pen stroke-transparent"></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="#"><i class="fab fa-facebook-f stroke-transparent"></i></a><a><i
class="fab fa-twitter stroke-transparent"></i></a><a><i
class="fab fa-linkedin-in stroke-transparent"></i></a><a><i
class="fab fa-github stroke-transparent"></i></a></div>
<a id="edit-intro" href="#"><i class="fas fa-pen-alt blue"></i>&nbsp;&nbsp;</a>
<hr width="100%">
<div id="about">
<p style="display:inline;">个人详情</p>
<a href="#"><i class="fas fa-pen stroke-transparent-blue"></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 class="card">
<p><i class="fas fa-briefcase stroke-transparent"></i>&nbsp;&nbsp;&nbsp;专业技能</p>
<ul>
<li>
<p class="tags">1. 熟练掌握HTML、CSS、JavaScript等前端基础技术</p>
</li>
<li>
<p class="tags">2. 熟悉jQuery、Bootstrap等常用前端框架和库</p>
</li>
<li>
<p class="tags">3. 了解Node.js、Express等后端开发技术</p>
</li>
<li>
<p class="tags">4. 掌握Git、Webpack等常用开发工具</p>
</li>
<li>
<p class="tags">5. 具备良好的编码风格和文档习惯</p>
</li>
</ul>
</div>
<div class="card">
<p><i class="fas fa-briefcase stroke-transparent"></i>&nbsp;&nbsp;&nbsp;工作检验</p>
<ul>
<li>
<p class="tags">1. 依帆网站首页制作(个人项目)<br>
- 使用HTML、CSS、JavaScript实现了一个响应式的网站首页<br>
- 使用Bootstrap进行布局和样式美化,使用jQuery实现轮播图和导航栏效果<br>
- 使用Webpack进行打包和优化,使用Git进行版本控制和部署</p>
</li>
<li>
<p class="tags">2. 艺风网站后台管理系统(实习项目)<br>
- 参与了一个基于Node.js和Express的后台管理系统的开发<br>
- 负责前端页面的编写,使用EJS模板引擎渲染数据<br>
- 使用Ajax和Fetch进行数据交互,使用Element UI组件库提升用户体验<br>
- 遵循MVC架构,使用Mongoose操作MongoDB数据库</p>
</li>
</ul>
</div>
<div class="card">
<p><i class="fas fa-graduation-cap stroke-transparent"></i>&nbsp;&nbsp;&nbsp;自我评价</p>
<ul>
<li>
<p class="tags">具备较强的学习能力和逻辑思维能力,喜欢接触新技术和新知识</p>
</li>
<li>
<p class="tags">具备良好的沟通能力和团队协作能力,能够积极配合团队完成任务</p>
</li>
<li>
<p class="tags">具备一定的创新能力和解决问题能力,能够针对不同需求提出合理方案</p>
</li>
</ul>
<a href="#">+ 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<string> 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的全部内容!

作者:百宝门-明维

原文地址:https://blog.baibaomen.com/97-2/

使用Net将HTML简历导出为PDF格式的更多相关文章

  1. Confluence 导出为 PDF 格式 - 导出多个页面或者整个空间

    使用 Confluence 的空间导出功能,你可以将多个页面或者整个 Confluence 站点转换为 PDF 文件. 希望使用空间导出功能,你需要 导出空间(Export Space)权限.请查看 ...

  2. Django分析之导出为PDF文件

    最近在公司一直忙着做exe安装包,以及为程序添加新功能,好久没有继续来写关于Django的东西了….难得这个周末清闲,来了解了解Django的一些小功能也是极好的了~ 那今天就来看看在Django的视 ...

  3. Studio for Winforms FlexGrid:导出到 PDF 文件

    本篇文章主要介绍如何导出 FlexGrid 到 PDF 格式文件.本文源于论坛用户,有多个用户提出如何把 FlexGrid 导出到 PDF 文件的需求.在这里共享给大家. 当前,ComponentOn ...

  4. 将LibreOffice文档批量转成PDF格式

    使用如下命令可以将文档一次性批量导出为pdf格式: -name -I /program/soffice.exe --headless --convert-to pdf '{}' find命令的-max ...

  5. 如何将在线电子书保存为pdf格式

    网上有很多免费的在线电子书籍,没有pdf格式,不方便离线阅读,也不方便做记录,所以找了几个将在线内容制作成pdf文件的方法. 一.如果网站上的书籍内容没有分页,所有内容都直接显示出来了,最简单,直接将 ...

  6. 把页面上的图表导出为pdf文件,分享一种请求下载文件的方法

    最近客户提出一个需求,就是把页面上的图表导出为pdf文件. 找了很多资料.终于有了点头绪.最主要是参考了HighCharts的做法.http://www.hcharts.cn/ 实现原理:把页面图表的 ...

  7. 将w3cplus网站中的文章页面提取并导出为pdf文档

    最近在看一些关于CSS3方面的知识,主要是平时看到网页中有很多用CSS3实现的很炫的效果,所以就打算系统的学习一下.在网上找到很多的文章,但都没有一个好的整理性,比较凌乱.昨天看到w3cplus网站中 ...

  8. 推荐一款自己的软件作品[豆约翰博客备份专家],新浪博客,QQ空间,CSDN,cnblogs博客备份,导出CHM,PDF(转载)

    推荐一款自己的软件作品[豆约翰博客备份专 豆约翰博客备份专家是完全免费,功能强大的博客备份工具,博客电子书(PDF,CHM和TXT)生成工具,博文离线浏览工具,软件界面美观大方,支持多个主流博客网站( ...

  9. 导出文本、表格、图像到PDF格式文件中(学习整理)

    1.测试例子: 需要导入的外部jar包: 相关API http://www.coderanch.com/how-to/javadoc/itext-2.1.7/com/lowagie/text/pack ...

  10. 文本导出到pdf文件

    程序中数据导出是经常有的需求,今天学习把文本导出到pdf文件.主要是用QPrinter,QPainter TextEditToPdf::TextEditToPdf(QWidget *parent, Q ...

随机推荐

  1. L2 Gracia Final OpCodz

    [83] Gracia Final Client 00 SendLogOut 01 RequestAttack 03 RequestStartPledgeWar 04 RequestReplyStar ...

  2. 2020-2021第一学期2024"DCDD"小组第十一周讨论

    2020-2021第一学期"DCDD"第十一周讨论 小组名称:DCDD 小组成员:20202403孟凡斌.20202411陈书桓.20202416刘铭睿.20202420黄椿淇 照 ...

  3. Oracle添加约束

    约束 -contraint Oracle中约束类型:主键约束,唯一约束,非空约束,外键约束,check约束,下述主要是alter的方法去添加约束,也可以在建表时直接添加约束 主键约束 alter ta ...

  4. 医学分割 不确定性 2019 MICCAI

    z今天分享一篇发表在MICCAI 2019上的论文: Uncertainty-aware Self-ensembling Model for Semi-supervised 3D Left Atriu ...

  5. Linux ~ jenkins 直接安装

    前置条件: 1. Jenkins是由java编写的,所以最好安装java8以上的环境 开始安装: 1. 配置yum源,将jenkins导入yum源 sudo wget -O /etc/yum.repo ...

  6. Day12-面向对象初识

    面向对象编程 Java的核心思想就是OOP 一.面向过程&面向对象 面向过程思想: 步骤清晰简单,第一步做什么,第二步做什么...... 面对过程适合处理一些较为简单的问题 面向对象思想: 物 ...

  7. lightgbm与贷款违约预测项目

    lightgbm histogram算法 将连续的浮点值离散成k个离散值,构造宽度为k的histogram leaf-wise生长策略 每次在所有叶子中找到分裂增益最大的一个叶子,一般也是数据量最大的 ...

  8. 【Linux】Ubuntu随笔

    Ubuntu声明环境变量时使用 export JAVA_HOME=/xx/xx/xx,当需要引用时要写成 $JAVA_HOME 所以配置环境变量并声明方法如下: vim ~/.bashrc expor ...

  9. 20200926--图像旋转(奥赛一本通P96 9 多维数组)

    输入一个n行m列的黑白图像,将它顺时针旋转90度后输出. 输入:第1行包含两个整数n和m(1<=n<=100,1<=m<=100),表示图像包含像素点的行数和列数. 接下来n行 ...

  10. swing编程

    在界面中放入图片:路径以项目路径为准  img包一般放在项目文件夹下 package adapter;import java.awt.Color;import java.awt.Dimension;i ...