2011-07-17 92 views
0

我正在生成HTML文件,我想從最終文件創建PDF。我使用下面的生成HTML文件:如何使用WkHTMLToSharp/wkhtmltopdf與C中的圖像將HTML文件轉換爲PDF#

public static void WriteHTML(string cFile, List<Movie> mList) 
    { 
     int lineID = 0; 
     string strHeader, strMovie, strGenre, tmpGenre = null; 

     string strPDF = null; 

     // initiates streamwriter for catalog output file 
     FileStream fs = new FileStream(cFile, FileMode.Create); 
     StreamWriter catalog = new StreamWriter(fs); 

     strHeader = "<style type=\"text/css\">\r\n" + "<!--\r\n" + "tr#odd {\r\n" + " background-color:#e2e2e2;\r\n" + " vertical-align:top;\r\n" + "}\r\n" + "\r\n" + "tr#even {\r\n" + " vertical-align:top;\r\n" + "}\r\n" + "div#title {\r\n" + " font-size:16px;\r\n" + " font-weight:bold;\r\n" + "}\r\n" + "\r\n" + "div#mpaa {\r\n" + " font-size:10px;\r\n" + "}\r\n" + "\r\n" + "div#genre {\r\n" + " font-size:12px;\r\n" + " font-style:italic;\r\n" + "}\r\n" + "\r\n" + "div#plot {\r\n" + " height: 63px;\r\n" + " font-size:12px;\r\n" + " overflow:hidden;\r\n" + "}\r\n" + "-->\r\n" + "</style>\r\n" + "\r\n" + "<html>\r\n" + " <body>\r\n" + "  <table>\r\n"; 
     catalog.WriteLine(strHeader); 
     strPDF = strHeader; 

     foreach (Movie m in mList) 
     { 
      tmpGenre = null; 

      strMovie = lineID == 0 ? "   <tr id=\"odd\" style=\"page-break-inside:avoid\">\r\n" : "   <tr id=\"even\" style=\"page-break-inside:avoid\">\r\n"; 
      catalog.WriteLine(strMovie); 
      strPDF += strMovie; 

      foreach (string genre in m.Genres) 
       tmpGenre += ", <a href=\"" + genre + ".html\" target=\"_blank\">" + genre + "</a>"; 
      strGenre = tmpGenre != null ? tmpGenre.Substring(2) : null; 

      strMovie = "    <td>\r\n" + "     <img src=\".\\images\\" + m.ImageFile + "\" width=\"75\" height=\"110\">\r\n" + "    </td>\r\n" + "    <td>\r\n" + "     <div id=\"title\">" + m.Title + "</div>\r\n" + "     <div id=\"mpaa\">" + m.Certification + " " + m.MPAA + "</div>\r\n" + "     <div id=\"genre\">" + strGenre + "</div>\r\n" + "     <div id=\"plot\">" + m.Plot + "</div>\r\n" + "    </td>\r\n" + "   </tr>\r\n"; 
      catalog.WriteLine(strMovie); 
      strPDF += strMovie; 
      lineID = lineID == 0 ? 1 : 0; 
     } 

     string closingHTML = "  </table>\r\n" + " </body>\r\n" + "</html>"; 
     catalog.WriteLine(closingHTML); 
     strPDF += closingHTML; 
     WritePDF(strPDF, cFile + ".PDF"); 
     catalog.Close(); 
    } 

一旦完成,我想調用下面的函數生成的PDF文件:

public static void WritePDF(string cFile, string pdfFile) 
{ 
    WkHtmlToPdfConverter w = new WkHtmlToPdfConverter(); 

    byte[] strHTML = w.Convert(cFile); 
    File.WriteAllBytes(pdfFile, strHTML); 
    w.Dispose(); 
} 

我發現.Convert功能將HTML代碼轉換爲PDF,而不是文件。其次,當我直接傳入HTML代碼時,圖像不會出現在PDF中。我知道.GIF文件存在問題,但這些都是.JPG文件。

我已經讀了很多關於wkhtmltopdf是多麼的好的,寫過WkHTMLToSharp的人都發布了他的項目,但是我一直對缺乏文檔感到失望。

我想要能夠通過文件轉換,更改邊距(我知道這是可能的,我只需要弄清楚正確的設置),讓它正確地轉換圖像,最重要的是,不要在多個頁面中分解我的項目(支持「頁面中斷:避免」或類似的內容)。

我很想看看別人如何使用它!

+0

你試圖使用絕對路徑到你的圖片?即:而不是/images/myimage.jpg,使用http://www.myserver.com/images/myimage.jpg? –

+0

使用絕對路徑確實有效,但這意味着我不能把剛剛生成的代碼拿來用在我的網站上,或者把它放在我的本地機器上查看:(嗯,很煩人,雖然現在進展了,但現在如果可以的話只是讓它不會在我的頁面之間吐出行,我想我可以使用它並完成它。 – Dizzy49

回答

0

使用WkHtmlToXSharp。

下載從GitHub

public static string ConvertHTMLtoPDF(string htmlFullPath, string pageSize, string orientation) 
{ 
    string pdfUrl = htmlFullPath.Replace(".html", ".pdf"); 

    try 
    { 
     #region USING WkHtmlToXSharp.dll 
     //IHtmlToPdfConverter converter = new WkHtmlToPdfConverter(); 
     IHtmlToPdfConverter converter = new MultiplexingConverter(); 

     converter.GlobalSettings.Margin.Top = "0cm"; 
     converter.GlobalSettings.Margin.Bottom = "0cm"; 
     converter.GlobalSettings.Margin.Left = "0cm"; 
     converter.GlobalSettings.Margin.Right = "0cm"; 
     converter.GlobalSettings.Orientation = (PdfOrientation)Enum.Parse(typeof(PdfOrientation), orientation); 
     if (!string.IsNullOrEmpty(pageSize)) 
      converter.GlobalSettings.Size.PageSize = (PdfPageSize)Enum.Parse(typeof(PdfPageSize), pageSize); 

     converter.ObjectSettings.Page = htmlFullPath; 
     converter.ObjectSettings.Web.EnablePlugins = true; 
     converter.ObjectSettings.Web.EnableJavascript = true; 
     converter.ObjectSettings.Web.Background = true; 
     converter.ObjectSettings.Web.LoadImages = true; 
     converter.ObjectSettings.Load.LoadErrorHandling = LoadErrorHandlingType.ignore; 

     Byte[] bufferPDF = converter.Convert(); 

     System.IO.File.WriteAllBytes(pdfUrl, bufferPDF); 

     converter.Dispose(); 

     #endregion 
    } 
    catch (Exception ex) 
    { 
     throw new Exception(ex.Message, ex); 
    } 

    return pdfUrl; 
} 
0

您可以使用Spire.Pdf來做到這一點。

該組件可以將html轉換爲pdf。

PdfDocument pdfdoc = new PdfDocument(); 
pdfdoc.LoadFromHTML(fileFullName, true, true, true); 
//String url = "http://www.e-iceblue.com/"; 
//pdfdoc.LoadFromHTML(url, false, true, true); 
pdfdoc.SaveToFile("FromHTML.pdf"); 
+0

Spire.Pdf看起來相當不錯,只要它是免費的。 – Dizzy49

0

我們也使用wkhtmltopdf並能夠正確呈現圖像。但是,默認情況下,圖像渲染被禁用。

你必須在你的轉換器實例指定這些選項:

var wk = _GetConverter() 
wk.GlobalSettings.Margin.Top = "20mm"; 
wk.GlobalSettings.Margin.Bottom = "10mm"; 
wk.GlobalSettings.Margin.Left = "10mm"; 
wk.GlobalSettings.Margin.Right = "10mm"; 
wk.GlobalSettings.Size.PaperSize = PdfPaperSize.A4; 
wk.ObjectSettings.Web.PrintMediaType = true; 
wk.ObjectSettings.Web.LoadImages = true; 
wk.ObjectSettings.Web.EnablePlugins = false; 
wk.ObjectSettings.Web.EnableJavascript = true; 

result = wk.Convert(htmlContent); 
+0

屬性wk.GlobalSettings.Size.PaperSize = PdfPaperSize。 A4;在我的版本中不支持...您使用的是哪個版本?我的版本是從以下版本編譯的:https://github.com/pruiz/WkHtmlToXSharp – Haroon

1

最新的DLL我已經編寫了有關如何創建HTML從一個PDF的例子。我只是更新它也打印圖像。

https://github.com/hmadrigal/playground-dotnet/tree/master/MsDotNet.PdfGeneration

(在我的博客文章中,我解釋了大部分項目https://hmadrigal.wordpress.com/2015/10/16/creating-pdf-reports-from-html-using-dotliquid-markup-for-templates-and-wkhtmltoxsharp-for-printing-pdf/)的

差不多,你有兩個選擇:

1:使用文件://和FULLPATH到文件。

<img alt="profile" src="{{ employee.PorfileFileName | Prepend: "Assets\ProfileImage\" | ToLocalPath }}" /> 

2:使用URL數據(https://en.wikipedia.org/wiki/Data_URI_scheme

<img alt="profile" src="data:image/png;base64,{{ employee.PorfileFileName | Prepend: "Assets\ProfileImage\" | ToLocalPath | ToBase64 }}" /> 

乾杯, 香草

相關問題