2011-07-17 20 views
6

Necesito convertir un grupo de archivos HTML (aproximadamente 30) en archivos PDF. Sería increíble si pudiera crear un TOC y páginas de enlaces, pero ahora mismo me gustaría convertir los archivos individuales :)¿Cómo usar WkHTMLToSharp correctamente para convertir archivos HTML a PDF?

Ya he intentado un par de soluciones, la más exitosa fue EO.PDF, pero puso una marca de agua desagradable en cada página, y no podía manejar archivos de unos pocos megas, y algunos de los míos son 10 megas +.

He leído muchas cosas buenas sobre wkhtmltopdf, y encontré el envoltorio para ello, WkHTMLToSharp. No puedo encontrar ninguna documentación, así que improvisé el siguiente código, que arroja una excepción. Agradecería cualquier ayuda para resolver esto.

Anoté la línea que está causando la excepción. El (muy poco útil) es una excepción:

"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(); 
} 

Después de resolver el problema con el archivo DLL que falta, he descubierto que el fragmento de código en realidad convierte una cadena de HTML, no se un archivo. I CAN funcionan con eso, pero MUCHO preferiría trabajar con los archivos HTML.

Además, ninguna de las imágenes se muestra en el archivo PDF. Todos son JPG (sé que hay un problema con GIFS).

+0

¿Existe una excepción interna? – ChrFin

+0

No estoy seguro de qué es una excepción interna. El error anterior es lo que dice cuando hago clic en Ver detalles de la excepción. Si hago clic en IntelliTrace, tiene otra excepción ... "No se pudo cargar el archivo o ensamblado 'Common.Logging, Version = 2.0.0.0, Culture = neutral, PublicKeyToken = ' o una de sus dependencias. sytem no puede encontrar el archivo especificado. " – Dizzy49

+1

La excepción interna es una propiedad de la excepción que se ve al hacer clic en "Ver detalles", pero "No se pudo cargar ..." ya le dice que le falta una Biblioteca - ¿Ha copiado todos los * .dll necesarios a la ¿directorio de salida? – ChrFin

Respuesta

2

Usar WkHtmlToXSharp.

descargar la última DLL desde 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

Me gustaría agregar una sugerencia alternativa: No use WkHtmlToXSharp, más bien instale wkhtmltopdf y úselo directamente. En mi opinión, los procesos de desove en C# .net son bastante simples, por lo que es una alternativa viable.

Utilizo ese método y lo he recomendado a otros con éxito, see an earlier answer I gave. Todavía encuentro el ejemplo que usé allí, un buen ejemplo, así que lo repetiré.

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