們在開發(fā)各種管理系統(tǒng)的時候,不免需要將一些報表導(dǎo)出為PDF,這使用率應(yīng)該來說是還相當(dāng)廣的,今天,小編將給大家推薦一個HTML轉(zhuǎn)PDF的利器,神器,有了他,如虎添翼。
什么html2pdf,pdflib,FPDF這些可能也有不少人用過,但,我推薦的不是這個,也是我們的:wkhtmltopdf
wkhtmltopdf
并且wkhtmltoimage
是開源的(LGPLv3)命令行工具來渲染HTML到使用Qt WebKit渲染引擎PDF和各種圖像格式。這些運行完全“無頭”,不需要顯示或顯示服務(wù)。
還有一個C庫,如果你是這樣的事情。
我如何使用它?
下載預(yù)編譯的二進(jìn)制文件或從源代碼構(gòu)建
創(chuàng)建您想要轉(zhuǎn)換為PDF(或圖像)的HTML文檔
通過該工具運行您的HTML文檔。
例如,如果我真的很喜歡Google今天對他們的徽標(biāo)所做的處理,并希望以PDF形式永久捕獲它:
wkhtmltopdf http://google.com google.pdf
其他選項
這很好,我一直想把Google的主頁變成PDF,但是我也想要一個目錄。
有很多命令行選項。查看自動生成的wkhtmltopdf手冊。
獲取核心
命令行工具很棒,但我想要一個C庫。
沒問題。檢查圖書館的文件。
真實世界的例子?
正如我們所說,如果您今天真的很喜歡Google的主頁,并且希望將其保存為PDF,則可以使用wkhtmltopdf。
說真的,你可以用它來生成發(fā)票,生成生日賀卡,或其他各種有趣的事情。只是用你的想象力!
wkhtmltopdf,wkhtmltopdf可以直接把任何一個可以在瀏覽器中瀏覽的網(wǎng)頁直接轉(zhuǎn)換成一個pdf,首先說明一下它不是一個C#類 其他語類的方法封裝,而是一個把html頁面轉(zhuǎn)換成pdf的一個軟件(需要安裝在服務(wù)器上),但是它并不是一個簡單的桌面軟件,而且它直接cmd批處理的,我們可以很簡便的調(diào)用它。
今天我通過一個asp .net core mvc的例子給大家介紹下他的使用方法:
首先,我們先在https://wkhtmltopdf.org/downloads.html 下載相應(yīng)的服務(wù)器系統(tǒng) wkhtmltopdf軟件
當(dāng)然,在https://github.com/wkhtmltopdf/wkhtmltopdf 我們也可以查到一些具體的應(yīng)用例子
我在先nuget添加了:https://github.com/cp79shark/Shark.PdfConvert,這個封裝了.net core調(diào)用wkhtmltopdf的常用操作方法,可以直接快速引用。
什么是Shark.PdfConvert?
Shark.PdfConvert是WkHtmlToPdf工具的一個簡單的.NET Core(也是目標(biāo)net451)包裝器。大多數(shù)選項通過PdfConversionSettings對象公開,其他可以通過使用自定義覆蓋來指定所需的配置區(qū)域。
轉(zhuǎn)換設(shè)置默認(rèn)值是為Windows環(huán)境設(shè)置的,并假定您已安裝WkHTMLToPDF(x64)工具。您可以通過重寫PdfConversionSettings來覆蓋工具的路徑。PdfToolPath。
您將需要安裝/下載WkHtmlToPdf,它不嵌入在NuGet包中
示例1:靜態(tài)HTML內(nèi)容
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獲取內(nèi)容
PdfConvert.Convert(new PdfConversionSettings{ Title = "My Static Content from URL", ContentUrl = "http://www.lipsum.com/", OutputPath = @"C:\temp\temp-url.pdf"});
示例3:使用流進(jìn)行輸出和輸入
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 = "導(dǎo)出PDF出錯!" + ex.Message
});
}
finally
{
ms.Close();
fileStream.Close();
}
return Json(new
{
status = 1,
message = "PDF導(dǎo)出成功!",
url = Request.Scheme + "://" + Request.Host.ToUriComponent() + "/" + saveFilePath
});
}
這就是我的具體生成實現(xiàn)方法。
導(dǎo)出PDF界面
導(dǎo)出后的PDF
CMSYOU分享PHPCMS V9模板風(fēng)格管理設(shè)置技巧之后,我們繼續(xù)分享一篇關(guān)于自定義PHPCMS文章URL的技巧:Phpcms V9文章內(nèi)容頁自定義HTML網(wǎng)址。
這一方法,改變html默認(rèn)采用數(shù)字生成的地址,可以自定義成字母、單詞、拼音,對于網(wǎng)址的識別性、SEO,有很大幫助!
下面是來自rhongsheng發(fā)布的教程,分享在此。
用過2008版的網(wǎng)友都知道,內(nèi)容模型在發(fā)布內(nèi)容的時候可以自定義生成的HTML文件名,這個功能對于SEO來說非常有好處,但是到了V9之后卻很遺憾,這個功能卻沒有了,現(xiàn)在你只要對V9進(jìn)行一個小小的修改即可令V9重新?lián)碛?8版的自定義HTML文件名的功能,操作方法如下:
1、修改你需要設(shè)置的模型,添加一個字段,配置如下: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實體轉(zhuǎn)換為普通字符,我們可以使用PHP htmlspecialchars_decode()函數(shù)將特殊的HTML實體轉(zhuǎn)換為正常字符,如&,<,>(即&,<,>)等HTML實體字符恢復(fù)到正常字符。
下面我們就結(jié)合代碼示例,為大家介紹PHP將HTML實體轉(zhuǎn)換為普通字符的實現(xiàn)方法。
代碼示例如下:
<?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;
輸出結(jié)果如下:
htmlspecialchars_decode函數(shù)表示將特殊的 HTML 實體轉(zhuǎn)換回普通字符。
說明 :
string htmlspecialchars_decode ( string $string [, int $flags = ENT_COMPAT | ENT_HTML401 ] )
其參數(shù):string表示要解碼的字符串,flags表示用下列標(biāo)記中的一個或多個作為一個位掩碼,來指定如何處理引號和使用哪種文檔類型。默認(rèn)為 ENT_COMPAT | ENT_HTML401。
此函數(shù)的作用和 htmlspecialchars() 剛好相反。它將特殊的HTML實體轉(zhuǎn)換回普通字符。
被轉(zhuǎn)換的實體有:&, " (沒有設(shè)置ENT_NOQUOTES 時), ' (設(shè)置了 ENT_QUOTES 時), < 以及>。
該htmlspecialchars_decode()函數(shù)與htmlspecialchars()將特殊HTML字符轉(zhuǎn)換為HTML實體的函數(shù)相反。
本篇文章就是關(guān)于PHP將HTML實體轉(zhuǎn)換為普通字符的方法介紹,簡單易懂,希望對需要的朋友有所幫助!
以上就是PHP怎么將HTML實體轉(zhuǎn)換為普通字符的詳細(xì)內(nèi)容,更多請關(guān)注其它相關(guān)文章!
更多技巧請《轉(zhuǎn)發(fā) + 關(guān)注》哦!
*請認(rèn)真填寫需求信息,我們會在24小時內(nèi)與您取得聯(lián)系。