网站首页 > 技术文章 正文
我们在开发各种管理系统的时候,不免需要将一些报表导出为PDF,这使用率应该来说是还相当广的,今天,小编将给大家推荐一个HTML转PDF的利器,神器,有了他,如虎添翼。
什么html2pdf,pdflib,FPDF这些可能也有不少人用过,但,我推荐的不是这个,也是我们的:wkhtmltopdf
wkhtmltopdf
并且wkhtmltoimage
是开源的(LGPLv3)命令行工具来渲染HTML到使用Qt WebKit渲染引擎PDF和各种图像格式。这些运行完全“无头”,不需要显示或显示服务。
还有一个C库,如果你是这样的事情。
我如何使用它?
下载预编译的二进制文件或从源代码构建
创建您想要转换为PDF(或图像)的HTML文档
通过该工具运行您的HTML文档。
例如,如果我真的很喜欢Google今天对他们的徽标所做的处理,并希望以PDF形式永久捕获它:
wkhtmltopdf http://google.com google.pdf
其他选项
这很好,我一直想把Google的主页变成PDF,但是我也想要一个目录。
有很多命令行选项。查看自动生成的wkhtmltopdf手册。
获取核心
命令行工具很棒,但我想要一个C库。
没问题。检查图书馆的文件。
真实世界的例子?
正如我们所说,如果您今天真的很喜欢Google的主页,并且希望将其保存为PDF,则可以使用wkhtmltopdf。
说真的,你可以用它来生成发票,生成生日贺卡,或其他各种有趣的事情。只是用你的想象力!
wkhtmltopdf,wkhtmltopdf可以直接把任何一个可以在浏览器中浏览的网页直接转换成一个pdf,首先说明一下它不是一个C#类 其他语类的方法封装,而是一个把html页面转换成pdf的一个软件(需要安装在服务器上),但是它并不是一个简单的桌面软件,而且它直接cmd批处理的,我们可以很简便的调用它。
今天我通过一个asp .net core mvc的例子给大家介绍下他的使用方法:
首先,我们先在https://wkhtmltopdf.org/downloads.html 下载相应的服务器系统 wkhtmltopdf软件
当然,在https://github.com/wkhtmltopdf/wkhtmltopdf 我们也可以查到一些具体的应用例子
我在先nuget添加了:https://github.com/cp79shark/Shark.PdfConvert,这个封装了.net core调用wkhtmltopdf的常用操作方法,可以直接快速引用。
什么是Shark.PdfConvert?
Shark.PdfConvert是WkHtmlToPdf工具的一个简单的.NET Core(也是目标net451)包装器。大多数选项通过PdfConversionSettings对象公开,其他可以通过使用自定义覆盖来指定所需的配置区域。
转换设置默认值是为Windows环境设置的,并假定您已安装WkHTMLToPDF(x64)工具。您可以通过重写PdfConversionSettings来覆盖工具的路径。PdfToolPath。
您将需要安装/下载WkHtmlToPdf,它不嵌入在NuGet包中
示例1:静态HTML内容
PdfConvert.Convert(new PdfConversionSettings{ Title = "My Static Content", Content = @"<h1>Lorem ipsum dolor sit amet consectetuer adipiscing elit I SHOULD BE RED BY JAVASCRIPT</h1> <script>document.querySelector('h1').style.color = 'rgb(128,0,0)';</script>", OutputPath = @"C:\temp\temp.pdf"});
示例2:从URL获取内容
PdfConvert.Convert(new PdfConversionSettings{ Title = "My Static Content from URL", ContentUrl = "http://www.lipsum.com/", OutputPath = @"C:\temp\temp-url.pdf"});
示例3:使用流进行输出和输入
PdfConversionSettings config = new PdfConversionSettings{ Title = "Streaming my HTML to PDF"};using (var fileStream = new FileStream(Path.GetTempFileName() + ".pdf", FileMode.Create)){ var task = new System.Net.Http.HttpClient().GetStreamAsync("http://www.google.com"); task.Wait(); using (var inputStream = task.Result) { PdfConvert.Convert(config, fileStream, inputStream); }}
样品4:混合和匹配
PdfConversionSettings config = new PdfConversionSettings{ Title = "A little bit of Everything", GenerateToc = true, TocHeaderText = "Table of MY Contents", PageCoverUrl = "https://blackrockdigital.github.io/startbootstrap-landing-page/", ContentUrl = "http://www.lipsum.com/", PageHeaderHtml = @" <!DOCTYPE html> <html><body> <div style=""background-color: red; color: white; text-align: center; width: 100vw;"">SECRET SAUCE</div> </body></html>"};using (var fileStream = new FileStream(Path.GetTempFileName() + ".pdf", FileMode.Create)){ PdfConvert.Convert(config, fileStream);}
示例5:MVC控制器操作中的用法
public IActionResult ConvertToPdf([FromBody] PdfConversionSettings model) { // TAKE CARE WHEN Accepting the Conversion Settings from user land, it would be best // to just NOT DO it, accept your own custom model and map the parameters as needed. // If you insist, then you could do something like the following to prevent malicious code execution // in my testing the Custom*Args members are not a valid attack vector, PdfToolPath certainly is, never* trust // the client#if DEBUG // set path to executable, UNSAFE DEBUG USE ONLY FOR TESTING model.PdfToolPath = model.PdfToolPath ?? _host.ContentRootPath + @"\wkhtmltopdf.exe";#else // set path to executable model.PdfToolPath = _host.ContentRootPath + @"\wkhtmltopdf.exe";#endif if (model.OutputFilename.EndsWith(".pdf") == false) model.OutputFilename = model.OutputFilename + ".pdf"; var memoryStream = new MemoryStream(); PdfConvert.Convert(model, memoryStream); return new FileContentResult(memoryStream.ToArray(), MimeTypes.Pdf) { FileDownloadName = model.OutputFileName };}
在Controller中的
[HttpPost]
public async Task<IActionResult> ExportPdf(PdfConversionSettings model)
{
var saveFilePath = "/upload/"+ model.Title + ".pdf";
model.PdfToolPath = FileHelper.MapPath("wkhtmltox/wkhtmltopdf.exe");
model.OutputPath = FileHelper.MapPath(saveFilePath);
FileHelper.DeleteFile(saveFilePath);
var ms= new MemoryStream();
var head = @"
<!DOCTYPE html><head><meta http-equiv=""Content-Type"" content=""text/html; charset=utf-8"" />
<meta name=""viewport"" content=""width=device-width,minimum-scale=1.0,maximum-scale=1.0,initial-scale=1.0,user-scalable=no"">
<meta name=""apple-mobile-web-app-capable"" content=""yes"" />
<title></title>
<link rel=""stylesheet"" type=""text/css"" href=""/lib/art-dialog/css/dialog.css"" />
<link rel=""stylesheet"" type=""text/css"" href=""/admin/skin/icon/iconfont.css"" />
<link rel=""stylesheet"" type=""text/css"" href=""/admin/skin/default/style.css"" />
<style type=""text/css"">
h1{line-height:70px;margin-top:20px;font-size:40px;font-weight:bold;text-align:center;}
body,div,p {line-height:50px; font-family: 'Microsoft YaHei';font-size:25px;}
img{text-align:center;width:120%;height:400px;}
table,tr,td{height:40px;}
</style></head><body>";
model.PageWidth = 210;
model.PageHeight = 297;
//model.Margins = new PdfPageMargins { Top = 100, Left = 20 };
//model.Size = PdfPageSize.A4;
model.Content = head + model.Content + "</body></html>";
PdfConvert.Convert(model, ms);
FileStream fileStream = null;
try
{
fileStream = new FileStream(model.OutputPath, FileMode.Create);
ms.WriteTo(fileStream);
}
catch(Exception ex)
{
return Json(new
{
status = 0,
message = "导出PDF出错!" + ex.Message
});
}
finally
{
ms.Close();
fileStream.Close();
}
return Json(new
{
status = 1,
message = "PDF导出成功!",
url = Request.Scheme + "://" + Request.Host.ToUriComponent() + "/" + saveFilePath
});
}
这就是我的具体生成实现方法。
猜你喜欢
- 2024-10-26 从零学大数据之Java篇第二十五章:文件操作详解
- 2024-10-26 springmvc集成ireport生成pdf(三)
- 2024-10-26 Github上最热门的11个Java开源项目你会了吗
- 2024-10-26 Java 合并、拆分PDF文档 java pdf文件合并
- 2024-10-26 有没有什么方法能将PDF转为HTML呢?PDF转HTML的最佳6个方法
- 2024-10-26 springmvc集成ireport生成pdf(二)
- 2024-10-26 java如何高效地读取一个超大文件?(四种方式分析对比)
- 2024-10-26 一个支持将html转为PDF、图片,且支持PDF加水印的项目
- 2024-10-26 Java 导出数据库表信息生成Word文档
- 2024-10-26 请查收!使用Aspose.PDF在.NET中将HTML文件转换为PDF完整指南
你 发表评论:
欢迎- 最近发表
- 标签列表
-
- oraclesql优化 (66)
- 类的加载机制 (75)
- feignclient (62)
- 一致性hash算法 (71)
- dockfile (66)
- 锁机制 (57)
- javaresponse (60)
- 查看hive版本 (59)
- phpworkerman (57)
- spark算子 (58)
- vue双向绑定的原理 (68)
- springbootget请求 (58)
- docker网络三种模式 (67)
- spring控制反转 (71)
- data:image/jpeg (69)
- base64 (69)
- java分页 (64)
- kibanadocker (60)
- qabstracttablemodel (62)
- java生成pdf文件 (69)
- deletelater (62)
- com.aspose.words (58)
- android.mk (62)
- qopengl (73)
- epoch_millis (61)
本文暂时没有评论,来添加一个吧(●'◡'●)