整合营销服务商

电脑端+手机端+微信端=数据同步管理

免费咨询热线:

不得不懂的HTML转PDF神器,支持.NET,C ,php,java等

们在开发各种管理系统的时候,不免需要将一些报表导出为PDF,这使用率应该来说是还相当广的,今天,小编将给大家推荐一个HTML转PDF的利器,神器,有了他,如虎添翼。

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

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

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

我如何使用它?

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

  2. 创建您想要转换为PDF(或图像)的HTML文档

  3. 通过该工具运行您的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

});

}


这就是我的具体生成实现方法。

导出PDF界面

导出后的PDF

CMSYOU分享PHPCMS V9模板风格管理设置技巧之后,我们继续分享一篇关于自定义PHPCMS文章URL的技巧:Phpcms V9文章内容页自定义HTML网址。

这一方法,改变html默认采用数字生成的地址,可以自定义成字母、单词、拼音,对于网址的识别性、SEO,有很大帮助!

下面是来自rhongsheng发布的教程,分享在此。

用过2008版的网友都知道,内容模型在发布内容的时候可以自定义生成的HTML文件名,这个功能对于SEO来说非常有好处,但是到了V9之后却很遗憾,这个功能却没有了,现在你只要对V9进行一个小小的修改即可令V9重新拥有08版的自定义HTML文件名的功能,操作方法如下:

1、修改你需要设置的模型,添加一个字段,配置如下:

2、打开/phpcms/modules/content/create_html.php,找到代码

$urls = $this->url->show($r['id'], '', $r['catid'],$r['inputtime']);

批量替换成

$urls = $this->url->show($r['id'], '', $r['catid'],$r['inputtime'], $r['prefix']);

共三处

3、打开/phpcms/modules/content/classes/url.class.php,找到代码

.$day = date('d',$time);


在其下方插入

$tmp_id = $content_ishtml && $prefix ? $prefix : $id; //增加自定义HTML文件名支持

找到

$urls = str_replace(array('{$categorydir}','{$catdir}','{$year}','{$month}','{$day}','{$catid}','{$id}','{$page}'),array($categorydir,$catdir,$year,$month,$day,$catid,$id,$page),$urlrule);

修改为

$urls = str_replace(array('{$categorydir}','{$catdir}','{$year}','{$month}','{$day}','{$catid}','{$id}','{$page}'),array($categorydir,$catdir,$year,$month,$day,$catid,$tmp_id,$page),$urlrule);

完毕。

Enjoy it!

HP将HTML实体转换为普通字符,我们可以使用PHP htmlspecialchars_decode()函数将特殊的HTML实体转换为正常字符,如&,<,>(即&,<,>)等HTML实体字符恢复到正常字符。



下面我们就结合代码示例,为大家介绍PHP将HTML实体转换为普通字符的实现方法。

代码示例如下:

<?php
$my_str = "I'm good & <b>"boy "</b>.";
echo htmlspecialchars_decode($my_str);
echo "<br>";
echo htmlspecialchars_decode($my_str, ENT_QUOTES);
echo "<br>";
echo $my_str;

输出结果如下:



htmlspecialchars_decode函数表示将特殊的 HTML 实体转换回普通字符。

说明 :

string htmlspecialchars_decode ( string $string [, int $flags = ENT_COMPAT | ENT_HTML401 ] )

其参数:string表示要解码的字符串,flags表示用下列标记中的一个或多个作为一个位掩码,来指定如何处理引号和使用哪种文档类型。默认为 ENT_COMPAT | ENT_HTML401。

此函数的作用和 htmlspecialchars() 刚好相反。它将特殊的HTML实体转换回普通字符。

被转换的实体有:&, " (没有设置ENT_NOQUOTES 时), ' (设置了 ENT_QUOTES 时), < 以及>。

该htmlspecialchars_decode()函数与htmlspecialchars()将特殊HTML字符转换为HTML实体的函数相反。

本篇文章就是关于PHP将HTML实体转换为普通字符的方法介绍,简单易懂,希望对需要的朋友有所帮助!

以上就是PHP怎么将HTML实体转换为普通字符的详细内容,更多请关注其它相关文章!

更多技巧请《转发 + 关注》哦!