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

Posted

技术标签:

【中文标题】如何正确使用 WkHTMLToSharp 将 HTML 文件转换为 PDF?【英文标题】:How to correctly use WkHTMLToSharp to convert HTML file to PDF? 【发布时间】:2011-10-07 01:44:57 【问题描述】:

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

我已经尝试了几种解决方案,最成功的是 EO.PDF,但它在每一页上都放了一个讨厌的水印,它无法处理超过几兆的文件,我的一些是 10 兆以上。

我已经阅读了很多关于 wkhtmltopdf 的好东西,并且我找到了它的包装器 WkHTMLToSharp。我找不到任何文档,所以我拼凑了以下代码,这是抛出异常。如有任何帮助解决此问题,我将不胜感激。

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

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

--代码--

/// <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 字符串,而不是文件。我可以使用它,但更喜欢使用 HTML 文件。

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

【问题讨论】:

不确定内部异常是什么。当我单击查看异常的详细信息时,上面的错误就是它所说的。如果我单击 IntelliTrace,它确实有另一个异常...“无法加载文件或程序集 'Common.Logging, Version=2.0.0.0, Culture=neutral, PublicKeyToken=' 或其依赖项之一。系统找不到指定的文件。” 内部异常是您在单击“查看详细信息”时看到的异常的属性,但“无法加载...”已经告诉您缺少库 - 您是否复制所有必要的 *.dll 到输出目录? 是的,我错过了一个 DLL,解决了这个谜题,仍然需要让这个转换器工作...... 同样的问题再次出现:是否存在内部异常,因为您发布的问题无助于解决问题? 我没有在异常中看到任何其他信息。我需要将一个 Common.Logging.ddl 文件添加到参考文献中。一旦我这样做了,它就可以正常工作了。 【参考方案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);

【讨论】:

【参考方案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;

【讨论】:

以上是关于如何正确使用 WkHTMLToSharp 将 HTML 文件转换为 PDF?的主要内容,如果未能解决你的问题,请参考以下文章

如何将 Flash 对象正确插入模态 HTML 对话框

请问如何开启HT???我开启后进不了系统!

如何正确安装sublime text 3

使用 Mercurial 将代码添加到 bitbucket 的正确目录结构

Matlab中如何修改x轴为汉字或字母?Matlab中如何将x轴设定为字母或者其他?

PHP Mail_Mime:如何在电子邮件正文中正确使用 encodeHeader()