整合營銷服務(wù)商

          電腦端+手機(jī)端+微信端=數(shù)據(jù)同步管理

          免費咨詢熱線:

          不得不懂的HTML轉(zhuǎn)PDF神器,支持.NET,C ,php,java等

          們在開發(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庫,如果你是這樣的事情。

          我如何使用它?

          1. 下載預(yù)編譯的二進(jìn)制文件或從源代碼構(gòu)建

          2. 創(chuàng)建您想要轉(zhuǎn)換為PDF(或圖像)的HTML文檔

          3. 通過該工具運行您的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)注》哦!


          主站蜘蛛池模板: 亚洲无码一区二区三区| 精品一区二区三区免费| 一区二区三区美女视频| 色妞AV永久一区二区国产AV| 精品人妻少妇一区二区三区不卡| 国产精品无码不卡一区二区三区| 日韩一区二区在线视频| 无码少妇一区二区三区| 亚洲Aⅴ无码一区二区二三区软件| 中文字幕在线视频一区| 日韩一区二区在线播放| 国产精品毛片VA一区二区三区 | 无码av不卡一区二区三区| 亚洲香蕉久久一区二区三区四区| 国产婷婷色一区二区三区| 一区二区三区视频在线播放| 夜夜精品视频一区二区| 精品午夜福利无人区乱码一区| 高清一区二区三区日本久| 看电影来5566一区.二区| 亚洲综合国产一区二区三区| 国产精品毛片a∨一区二区三区| 国产一区二区三区不卡在线观看| 精品国产免费观看一区| 日韩精品一区二区三区在线观看l| 一色一伦一区二区三区| 精品欧美一区二区在线观看| 九九无码人妻一区二区三区| 亚洲一区二区观看播放| 黑巨人与欧美精品一区| 四虎在线观看一区二区| 欧洲精品码一区二区三区| 国产肥熟女视频一区二区三区| 国产精品伦子一区二区三区| 武侠古典一区二区三区中文| 久久精品国产第一区二区| 午夜天堂一区人妻| 亚洲欧洲日韩国产一区二区三区| 人妻视频一区二区三区免费| 欧洲精品码一区二区三区免费看| 一区二区三区在线免费 |