Как правильно использовать WkHTMLToSharp для преобразования HTML-файла в PDF? - PullRequest
6 голосов
/ 17 июля 2011

Мне нужно конвертировать несколько файлов 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).

Ответы [ 2 ]

2 голосов
/ 31 октября 2013

Использовать WkHtmlToXSharp.

Загрузите последнюю версию DLL с 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;
}
1 голос
/ 18 декабря 2012

Я хотел бы добавить альтернативное предложение: не используйте WkHtmlToXSharp - скорее установите wkhtmltopdf и используйте его напрямую.По моему мнению, процессы порождения в c # .net довольно просты, и поэтому это жизнеспособная альтернатива.

Я использую этот метод и с успехом рекомендую его другим, см. Ранее полученный мной ответ .Я все еще нахожу пример, который использовал там, хорошим примером, поэтому я повторю его.

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