前言

  最近由于项目的需求问题,涉及到了在.Net Core中导出PDF的一个问题,最后选择方式是后端拼接到Html页面然后再通过Html导出到PDF。中间也尝试了许多的NuGet包、但是并不如意,可用并且好用的的比较少。下面将最近最几天尝试的使用方法分享给大家。

NuGet包

Select.HtmlToPdf.NetCore        简单好用,缺点是仅支持Windows,部署Linux不支持

HtmlToPDFCore             免费 支持Windows Linux  但是功能简单,样式不稳定

PdfSharpCore            Html内容转PDF较为麻烦

DinkToPdf           依赖wkhtmltopdf,需要附带exe应用程序

iTextSharp             5.0以后的收费了,而且NuGet包最低都在5.0以上,也就是收费

iTextSharp.LGPLv2.Core       Html内容转PDF太复杂

PDF.Core                收费 

HTML-Renderer.Core        较久没有维护支持,不兼容

HTML-Renderer.PdfSharp       可以使用但是不兼容Core

Spire.PDF               收费

ExpertPdf.HtmlToPdf.NetCore   收费

hiqpdf.free             免费不兼容Core

Select.HtmlToPdf.NetCore 操作案例

  还有一些其他的没有列举出来,但是部分都是收费的,而且还有部分都是需要依赖wkhtmltopdf做PDF导出,最后尝试使用的还是Select.HtmlToPdf.NetCore 。但是也仅限在Windows平台。但是使用确实比较方便。我们看下具体操作:

  首先安装Select.HtmlToPdf.NetCore NuGet包

  

  我们首先看下简单的一个Html内容和Url导出为PDF文件的例子:

  

        //获取项目路径使用
IHostingEnvironment hostingEnv;
public ValuesController(IHostingEnvironment hostingEnv)
{
this.hostingEnv = hostingEnv;
} /// <summary>
/// Html导出PDF
/// </summary>
/// <returns></returns>
[HttpGet]
public ActionResult<IEnumerable<string>> Get()
{
//测试Html素材
string htmlString = @"<!DOCTYPE html>
<html>
<head>
<meta charset='utf-8' />
<title></title>
<style>
body {
margin: 0;
padding: 0;
min-width: 2000px;
}
.m_table {
border-collapse: separate;
margin: 100px auto 0;
min-width: 1900px;
text-align: center;
font: 500 17px '微软雅黑';
border-spacing: 0;
border: 1px solid #EBEEF5;
} .m_table th {
background-color: #F7F3F7;
} .m_table th,
.m_table td {
border-right: 1px solid #EBEEF5;
border-bottom: 1px solid #EBEEF5;
padding: 5px;
height: 60px;
width: 60px;
}
</style>
</head> <body> <table class='m_table'>
<tr>
<th colspan='9' style='text-align:center;font-size:28px;'>期末学生综合评价表1</th>
</tr>
<tr>
<th colspan='9' style='text-align:center;font-size:23px;'>班级:一年级一班 姓名:测试 班主任:测试</th>
</tr>
<tr>
<th rowspan='2' style='text-align:center;font-size:24px;'>学科</th>
<th colspan='2' rowspan='2' style='text-align:center;font-size:24px;'>过程性评价</th>
<th colspan='2' rowspan='2' style='text-align:center;font-size:24px;'>表现性评价</th>
<th colspan='2' style='text-align:center;font-size:20px;'>考试性评价</th>
<th colspan='2' style='text-align:center;font-size:20px;'>综合性评价</th>
</tr>
<tr>
<th style='text-align:center;font-size:18px;'>卷面分</th>
<th style='text-align:center;font-size:18px;'>权重分</th>
<th style='text-align:center;font-size:18px;'>总分</th>
<th style='text-align:center;font-size:18px;'>等级</th>
</tr>
<tr><td> 数学 </td><td> 作业评价/4 </td><td> 课堂表现/4 </td><td> 学科必选/10 </td><td> 学科自选/7 </td><td> 98 </td><td> 68.6 </td><td> 93.6 </td><td> A </td></tr><tr><td> 英语 </td><td> 作业评价/4.5 </td><td> 课堂表现/5 </td><td> 学科必选/1.7 </td><td> 学科自选/1.7 </td><td> 59 </td><td> 41.3 </td><td> 54.2 </td><td> D </td></tr><tr><td> 英语 </td><td> 作业评价/4.5 </td><td> 课堂表现/5 </td><td> 学科必选/1.7 </td><td> 学科自选/1.7 </td><td> 59 </td><td> 41.3 </td><td> 54.2 </td><td> D </td></tr><tr><td> 英语 </td><td> 作业评价/4.5 </td><td> 课堂表现/5 </td><td> 学科必选/1.7 </td><td> 学科自选/1.7 </td><td> 59 </td><td> 41.3 </td><td> 54.2 </td><td> D </td></tr><tr><td> 英语 </td><td> 作业评价/4.5 </td><td> 课堂表现/5 </td><td> 学科必选/1.7 </td><td> 学科自选/1.7 </td><td> 59 </td><td> 41.3 </td><td> 54.2 </td><td> D </td></tr>
</table>
</body>
</html>";
HtmlToPdf Renderer = new HtmlToPdf();
//设置Pdf参数
Renderer.Options.PdfPageOrientation = PdfPageOrientation.Landscape;//设置页面方式-横向 PdfPageOrientation.Portrait 竖向
Renderer.Options.PdfPageSize = PdfPageSize.A4;//设置页面大小,30种页面大小可以选择
Renderer.Options.MarginTop = ; //上下左右边距设置
Renderer.Options.MarginBottom = ;
Renderer.Options.MarginLeft = ;
Renderer.Options.MarginRight = ; //设置更多额参数可以去HtmlToPdfOptions里面选择设置
var docHtml = Renderer.ConvertHtmlString(htmlString);//根据html内容导出PDF
var docUrl = Renderer.ConvertUrl("https://fanyi.baidu.com/#en/zh/");//根据url路径导出PDF
string webRootPath = hostingEnv.ContentRootPath; //获取项目运行绝对路径
var path = $"/ExportPDF/{DateTime.Now.ToString("yyyyMMdd")}/";//文件相对路径
var savepathHtml = $"{webRootPath}{path}{Guid.NewGuid().ToString()}-Html.pdf";//保存绝对路径
if (!Directory.Exists(Path.GetDirectoryName(webRootPath + path)))
{
Directory.CreateDirectory(Path.GetDirectoryName(webRootPath + path));
}
docHtml.Save(savepathHtml);
var savepathUrl = $"{webRootPath}{path}{Guid.NewGuid().ToString()}-Url.pdf";//保存绝对路径
docUrl.Save(savepathUrl); return new string[] { savepathHtml, savepathUrl };
}

  下面我们看Html内容导出一个PDF文件多个页面的例子:

  

        /// <summary>
/// Html导出PDF一个文件多页
/// </summary>
/// <param name="PageSize"></param>
/// <returns></returns>
[HttpGet("HtmlToPdfList")]
public ActionResult<string> HtmlToPdfList(int PageSize = )
{
//测试Html素材
string htmlString = @"<!DOCTYPE html>
<html>
<head>
<meta charset='utf-8' />
<title></title>
<style>
body {
margin: 0;
padding: 0;
min-width: 2000px;
}
.m_table {
border-collapse: separate;
margin: 100px auto 0;
min-width: 1900px;
text-align: center;
font: 500 17px '微软雅黑';
border-spacing: 0;
border: 1px solid #EBEEF5;
} .m_table th {
background-color: #F7F3F7;
} .m_table th,
.m_table td {
border-right: 1px solid #EBEEF5;
border-bottom: 1px solid #EBEEF5;
padding: 5px;
height: 60px;
width: 60px;
}
</style>
</head> <body> <table class='m_table'>
<tr>
<th colspan='9' style='text-align:center;font-size:28px;'>期末学生综合评价表1</th>
</tr>
<tr>
<th colspan='9' style='text-align:center;font-size:23px;'>班级:一年级一班 姓名:测试 班主任:测试</th>
</tr>
<tr>
<th rowspan='2' style='text-align:center;font-size:24px;'>学科</th>
<th colspan='2' rowspan='2' style='text-align:center;font-size:24px;'>过程性评价</th>
<th colspan='2' rowspan='2' style='text-align:center;font-size:24px;'>表现性评价</th>
<th colspan='2' style='text-align:center;font-size:20px;'>考试性评价</th>
<th colspan='2' style='text-align:center;font-size:20px;'>综合性评价</th>
</tr>
<tr>
<th style='text-align:center;font-size:18px;'>卷面分</th>
<th style='text-align:center;font-size:18px;'>权重分</th>
<th style='text-align:center;font-size:18px;'>总分</th>
<th style='text-align:center;font-size:18px;'>等级</th>
</tr> <tr><td> 数学 </td><td> 作业评价/4 </td><td> 课堂表现/4 </td><td> 学科必选/10 </td><td> 学科自选/7 </td><td> 98 </td><td> 68.6 </td><td> 93.6 </td><td> A </td></tr><tr><td> 英语 </td><td> 作业评价/4.5 </td><td> 课堂表现/5 </td><td> 学科必选/1.7 </td><td> 学科自选/1.7 </td><td> 59 </td><td> 41.3 </td><td> 54.2 </td><td> D </td></tr><tr><td> 英语 </td><td> 作业评价/4.5 </td><td> 课堂表现/5 </td><td> 学科必选/1.7 </td><td> 学科自选/1.7 </td><td> 59 </td><td> 41.3 </td><td> 54.2 </td><td> D </td></tr><tr><td> 英语 </td><td> 作业评价/4.5 </td><td> 课堂表现/5 </td><td> 学科必选/1.7 </td><td> 学科自选/1.7 </td><td> 59 </td><td> 41.3 </td><td> 54.2 </td><td> D </td></tr><tr><td> 英语 </td><td> 作业评价/4.5 </td><td> 课堂表现/5 </td><td> 学科必选/1.7 </td><td> 学科自选/1.7 </td><td> 59 </td><td> 41.3 </td><td> 54.2 </td><td> D </td></tr>
</table>
</body>
</html>";
PdfDocument docHtml = null;
for (int j = ; j < PageSize; j++)
{
HtmlToPdf Renderer = new HtmlToPdf();
//设置Pdf参数
Renderer.Options.PdfPageOrientation = PdfPageOrientation.Landscape;//设置页面方式-横向 PdfPageOrientation.Portrait 竖向
Renderer.Options.PdfPageSize = PdfPageSize.A4;//设置页面大小,30种页面大小可以选择
Renderer.Options.MarginTop = ; //上下左右边距设置
Renderer.Options.MarginBottom = ;
Renderer.Options.MarginLeft = ;
Renderer.Options.MarginRight = ;
//设置更多额参数可以去HtmlToPdfOptions里面选择设置 if (docHtml == null)
docHtml = Renderer.ConvertHtmlString(htmlString);//根据html内容导出PDF
else
//在上一个pdf元素页面下面追加Pdf页面,官方文档对于一个pdf文件打印多页的处理提供了分页符,在你想打印一页的元素外面加上 <div style="font-size: 28px; page-break-after: always">元素
//也就是分页符,但是试用感觉效果并不理想,下面这个Append追加一个pdf页面效果会更好点,但是可能会损耗一些性能
docHtml.Append(Renderer.ConvertHtmlString(htmlString));
}
string webRootPath = hostingEnv.ContentRootPath; //获取项目运行绝对路径
var path = $"/ExportPDF/{DateTime.Now.ToString("yyyyMMdd")}/";//文件相对路径
var savepathHtml = $"{webRootPath}{path}{Guid.NewGuid().ToString()}-Html.pdf";//保存绝对路径
if (!Directory.Exists(Path.GetDirectoryName(webRootPath + path)))
{
Directory.CreateDirectory(Path.GetDirectoryName(webRootPath + path));
}
docHtml.Save(savepathHtml);
return savepathHtml;
}

  整个项目Git地址


 世界上那些最容易的事情中,拖延时间最不费力。坚韧是成功的一大要素,只要在门上敲得够久够大声,终会把人唤醒的。

     欢迎大家扫描下方二维码,和我一起学习更多的知识

.Net Core 导出Html到PDF的更多相关文章

  1. Magicodes.IE已支持导出Word、Pdf和Html

    关于Magicodes.IE 导入导出通用库,通过导入导出DTO模型来控制导入和导出,支持Excel.Word.Pdf和Html. GitHub地址:https://github.com/xin-la ...

  2. 导出excel和PDF小结 vba

    最近接触了一个关于Access工具的项目,所以整理下需要使用的方法. 功能要求简介: 1.将数据表中的数据导出到excel和PDF 2.并根据某个字段名称分sheet输出. 3.无模板方式 方案简介: ...

  3. 【转】Java通过IText导出word和pdf

    原帖地址:http://blog.csdn.net/zwx19921215/article/details/34439851 最近做的项目中需要用到把Highcharts图表导出word和pdf的功能 ...

  4. BarTender 2016如何导出模板为pdf文件?

    最近有小伙伴来问,BarTender 2016能不能导出模板为pdf文件?这个是可以的,之前针对BarTender 10.1就介绍过一种方法了.本文,小编再针对BarTender 2016给大家讲下如 ...

  5. NET Core MVC中创建PDF

    使用Rotativa在ASP.NET Core MVC中创建PDF 在本文中,我们将学习如何使用Rotativa.AspNetCore工具从ASP.NET Core中的视图创建PDF.如果您使用ASP ...

  6. jquery插件导出excel和pdf(解决中文乱码问题)

    参考文件:http://jackyrong.iteye.com/blog/2169683 https://my.oschina.net/aruan/blog/418980 https://segmen ...

  7. 如何在ASP.NET Core 中快速构建PDF文档

    比如我们需要ASP.NET Core 中需要通过PDF来进行某些简单的报表开发,随着这并不难,但还是会手忙脚乱的去搜索一些资料,那么恭喜您,这篇帖子会帮助到您,我们就不会再去浪费一些宝贵的时间. 在本 ...

  8. C#&.Net干货分享- iTextSharp导出数据源到PDF

    namespace Frame.ITextSharp{    /// <summary>    /// iTextSharp导出数据源到PDF    /// </summary> ...

  9. C# Net Core 使用 itextsharp.lgplv2.core 把Html转PDF

    C# Net Core 使用 itextsharp.lgplv2.core 把Html转PDF 只支持英文(中文我不知道怎么弄,懂的朋友帮我看一下)!!!!![补充:评论区的小伙伴已解决] 引入包it ...

随机推荐

  1. laravel5.*安装使用Redis以及解决Class 'Predis\Client' not found和Fatal error: Non-static method Redis::set() cannot be called statically错误

    https://phpartisan.cn/news/35.html laravel中我们可以很简单的使用Redis,如何在服务器安装Redis以及原创访问你们可以访问Ubuntu 设置Redis密码 ...

  2. Python--day24--多继承

    如果本生没有func方法的话就调用距离自己最近的基类的方法 钻石继承: 查找方法的顺序:如下例的找func方法(广度优先) 例1: 例2: 漏斗继承: 小乌龟继承问题:(最顶端的节点F是最后查找的) ...

  3. js(二) 实现省市联动(json)

    通过HTML页面的city的select选取的value值,从json里面获取相对应的键值对,最后将值拼接到下拉框中 function x1(th) { //通过传入的th的value获取相对应的ci ...

  4. 符合阿里巴巴代码规范的checkstyle检测文件

    一.安装与简介 eclipse和idea都有对应的插件,找到插件安装界面.搜索checkstyle,点击安装后,重启IDE即可.(网上有很多安装教程,就不重复制造轮子了) 二.导入配置文件 在chec ...

  5. .NET C#与Java比较——Servlet

    目录 1. Servlet 和 Ashx(一般处理程序) 2. Servlet 和 JSP 3. Servlet的生命周期 4. Java Filter 和 HttpModule,ActionFilt ...

  6. nginx调用PHP有sock方式和端口方式

    nginx调用PHP有sock方式和端口方式 1.确认nginx已经调用了php;2.先确认你的nginx使用什么方式调用PHP:3.如果使用端口方式,端口对不对应,如果使用SOCK方式,那么路径对不 ...

  7. WPF 托盘显示

    本文告诉大家如何在 WPF 实现在托盘显示,同时托盘可以右击打开菜单,双击执行指定的代码 NotifyIcon WPF 通过 Nuget 安装 Hardcodet.NotifyIcon.Wpf 可以快 ...

  8. linux PCI 寻址

    每个 PCI 外设有一个总线号, 一个设备号, 一个功能号标识. PCI 规范允许单个系统占 用多达 256 个总线, 但是因为 256 个总线对许多大系统是不够的, Linux 现在支持 PCI 域 ...

  9. JQuery仿购物网站放大镜特效所遇问题及思考

    JQuery仿购物网站放大镜特效所遇问题及思考 先贴下效果图,然后描述起来也就不会不知道我在说什么了. 我碰到的问题一: 一开始我自己总结了是因为两个小原因导致的①使用了mouseover,mouse ...

  10. vagrant在windows下的安装和配置(二)

    在(一)中安装和配置好后 框框中的信息是登录vagrant up后的系统用的 我这里登录用的是xshell-----下载一个xshell然后安装 打开xshell 按确定之后生成一个新的会话,然后登录 ...