如何正确使用WkHTMLToSharp将HTML文件转换为PDF?

时间:2011-07-17 09:44:56

标签: c# html pdf wkhtmltopdf

我需要将一堆HTML文件(大约30个)转换为PDF。如果我可以创建TOC和链接页面会很棒,但是现在我很乐意转换单个文件:)

我已经尝试了几个解决方案,最成功的是EO.PDF,但是它在每个页面上都放置了一个令人讨厌的水印,它无法处理超过几兆的文件,而我的一些是10meg +。 / p>

我已经阅读了很多关于wkhtmltopdf的好东西,我找到了它的包装,WkHTMLToSharp。我无法找到任何文档,所以我拼凑了下面的代码,即抛出异常。我很感激有任何帮助解决这个问题。

我注意到导致异常的行。 (非常无用的)例外是:

"The type initializer for 'WkHtmlToXSharp.WkHtmlToPdfConverter' threw an exception."

- CODE -

/// <summary>
/// Creates a PDF file from the HTML file passed in
/// </summary>
/// <param name="cFile">Full path to HTML file to generate PDF from</param>
/// <param name="pdfFile">Full path of PDF output file</param>
public static void WritePDF(string cFile, string pdfFile)
{
    // Generates "The type initializer for 
    // 'WkHtmlToXSharp.WkHtmlToPdfConverter' threw an exception.":
    WkHtmlToPdfConverter w = new WkHtmlToPdfConverter();  

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

在解决了丢失的DLL的问题之后,我发现一些代码实际上转换了一串HTML而不是文件。我 CAN 可以使用它,但是很愿意使用HTML文件。

此外,PDF文件中没有显示任何图像。它们都是JPG(我知道GIFS存在问题)。

2 个答案:

答案 0 :(得分:2)

使用WkHtmlToXSharp。

从Github下载最新的DLL

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;
}

答案 1 :(得分:1)

我想添加一个替代建议:不要使用WkHtmlToXSharp - 而是安装wkhtmltopdf并直接使用它。在我看来,c#.net中的产生过程非常简单,因此它是一种可行的替代方案。

我使用这种方法,并将其推荐给其他成功的人see an earlier answer I gave。我仍然在那里找到一个很好的例子,所以我会重复一遍。

var pi = new ProcessStartInfo(@"c:\wkhtmltopdf\wkhtmltopdf.exe");
pi.CreateNoWindow = true;
pi.UseShellExecute = false;
pi.WorkingDirectory = @"c:\wkhtmltopdf\";
pi.Arguments = "http://www.google.com gogl.pdf";

using (var process = Process.Start(pi))
{
    process.WaitForExit(99999);
    Debug.WriteLine(process.ExitCode);
}