什么html2pdf,pdflib,FPDF这些可能也有不少人用过,但,我推举的不是这个,也是我们的:wkhtmltopdf

wkhtmltopdf并且wkhtmltoimage是开源的(LGPLv3)命令行工具来渲染HTML到利用Qt WebKit渲染引擎PDF和各种图像格式。
这些运行完备“无头”,不须要显示或显示做事。

还有一个C库,如果你是这样的事情。

html转php工具不得不懂的HTML转PDF神器支撑NETC phpjava等 Java

我如何利用它?

下载预编译的二进制文件或从源代码构建

创建您想要转换为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 CustomArgs 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

});

}

这便是我的详细天生实现方法。

导出PDF界面

导出后的PDF