前言

  最近由于项目的需求问题,涉及到了在.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. hibernate中因双向依赖而造成的json怪相--springmvc项目

    简单说一下Jackson 如果想要详细了解一下Jackson,可以去其github上的项目主页查看其版本情况以及各项功能.除此以外,需要格外提一下Jackson的版本问题.Jackson目前主流版本有 ...

  2. P1105 数列

    题目描述 给定一个正整数 \(k(2 \le k \le 15)\) ,把所有k的方幂及所有有限个互不相等的k的方幂之和构成一个递增的序列,例如,当 \(k = 3\) 时,这个序列是: 1,3,4, ...

  3. 解决:javac: 无效的目标发行版: 1.8

    原 解决:javac: 无效的目标发行版: 1.8 2017年06月14日 16:21:12 代码也文艺 阅读数 44795 版权声明:本文为博主原创文章,未经博主允许不得转载. https://bl ...

  4. 基于AutoIt3的打印机安装

    #Region ;**** 编译指令由 AutoIt3Wrapper 选项编译窗口创建 **** #AutoIt3Wrapper_Icon=favicon.ico #AutoIt3Wrapper_Co ...

  5. 【16.50%】【CF 44G】Shooting Gallery

    time limit per test 5 seconds memory limit per test 256 megabytes input standard input output standa ...

  6. JUnit4---Hamcrest匹配器常用方法总结

    一.Hamcrest是什么? Hamcrest is a library of matchers, which can be combined in to create flexible expres ...

  7. javascript拷贝

    function copy(obj){ //浅拷贝 var result = {}; for(var attr in obj){ result[attr] = obj[attr]; } return ...

  8. 开篇 | 揭秘 Flink 1.9 新架构,Blink Planner 你会用了吗?

    本文为 Apache Flink 新版本重大功能特性解读之 Flink SQL 系列文章的开篇,Flink SQL 系列文章由其核心贡献者们分享,涵盖基础知识.实践.调优.内部实现等各个方面,带你由浅 ...

  9. POJ 3111 K Best 最大化平均值 [二分]

    1.题意:给一共N个物品,每个物品有重量W,价值V,要你选出K个出来,使得他们的平均单位重量的价值最高 2.分析:题意为最大化平均值问题,由于每个物品的重量不同所以无法直接按单位价值贪心,但是目标值有 ...

  10. 前端——JS

    目录 JavaScript概述 ECMAScript和JavaScript的关系 ECMAScript的历史 JavaScript引入方式 Script标签内写代码 引入额外的JS文件 JavaScr ...