2011-08-04 30 views
9

Estoy intentando crear un PDF de un gráfico de javascript que tengo en una ventana de modelo (mi gráfico es una combinación de javascript y css en una vista .aspx). Lo único en el archivo PDF renderizado es el contenido estático de la ventana, el gráfico de JavaScript actual no está allí.Crear pdf con wkhtmltopdf y renderizar Javascript

Mi llamado para crear el PDF es el siguiente:

public byte[] WKHtmlToPdf(string url) 
    { 
     var fileName = " - "; 
     var wkhtmlDir = "C:\\Temp\\wkhtml"; 
     var wkhtml = "C:\\Temp\\wkhtml\\wkhtmltopdf.exe"; 
     var p = new Process(); 

     p.StartInfo.CreateNoWindow = true; 
     p.StartInfo.RedirectStandardOutput = true; 
     p.StartInfo.RedirectStandardError = true; 
     p.StartInfo.RedirectStandardInput = true; 
     p.StartInfo.UseShellExecute = false; 
     p.StartInfo.FileName = wkhtml; 
     p.StartInfo.WorkingDirectory = wkhtmlDir; 

     string switches = ""; 
     switches += "--print-media-type "; 
     switches += "--margin-top 0mm --margin-bottom 0mm --margin-right 0mm --margin-left 0mm "; 
     switches += "--page-size Letter "; 
     p.StartInfo.Arguments = switches + " " + url + " " + fileName; 
     p.Start(); 

     //read output 
     byte[] buffer = new byte[32768]; 
     byte[] file; 
     using (var ms = new MemoryStream()) 
     { 
      while (true) 
      { 
       int read = p.StandardOutput.BaseStream.Read(buffer, 0, buffer.Length); 

       if (read <= 0) 
       { 
        break; 
       } 
       ms.Write(buffer, 0, read); 
      } 
      file = ms.ToArray(); 
     } 

     // wait or exit 
     p.WaitForExit(60000); 

     // read the exit code, close process 
     int returnCode = p.ExitCode; 
     p.Close(); 

     return returnCode == 0 ? file : null; 
    } 

Cualquier ideas sobre cómo podía agarrar la tabla de JavaScript? Quizás la versión .Net sería más apropiada o tengo que guardar la página generada en un archivo y pasarla a la herramienta.

Gracias.

+0

Tuve este problema y lo solucioné al asegurar que estaba usando wkhtmltopdf 0.9.9. La versión de "instalación de gema" (0.8.3) no estaba cortando. – dfrankow

Respuesta

9

En nuestro proyecto hacemos algo simular, con éxito. Usamos wkhtmltopdf 0.9.9 en combinación con Highcharts en este momento. Con jQuery flot también tuvimos éxito después de un pequeño ajuste. En nuestro proyecto, primero renderizamos la vista en una cadena y la pasamos a wkhtml usando su stdin. Luego tomamos el stdout de wkhtml y lo devolvemos al navegador.

Parece que su configuración de wkhtml es correcta, excepto que usamos stdin y stdout. No sé si eso puede ser un problema.

Si usa uno de esos cuadros, creo que puedo ayudarlo. ¿Qué tabla estás usando?

Una última nota: 0.10rc2 wkhtmltopdf parece tener algunos problemas al cargar los recursos externos (js/css) de localhost cuando se utiliza un número de puerto diferente del puerto 80.

+0

gracias por ti "Una última nota", actualmente estoy buscando cómo solucionarlo :) – AgelessEssence

+1

Lo tengo que trabajar, básicamente abrí una ventana oculta del navegador deshabilitando animaciones, guardé una imagen del gráfico y luego creé una cadena html con la imagen dentro para renderizar a PDF. –

+0

¿Has mencionado esa vista de desgarro a la cadena? ¿como hacer eso? Tengo un diagrama de línea de tendencia dinámico y javascript (desde Highchart). Pero el gráfico en sí no se muestra en el pdf. ¿Alguna sugerencia? – Dhamayanthi

6

Parece que está intentando obtener el resultado de un gráfico, que a juzgar por las etiquetas es de un script Extjs 4.

La secuencia de comandos ext probablemente esté utilizando parte de la animación del gráfico, y ciertamente estará esperando a que los eventos de JavaScript se ejecuten y rendericen. Por lo tanto, probablemente no esté listo cuando se complete el tiempo predeterminado (200 ms).

Una solución rápida sería añadir la opción de página Javascript retardo a la línea de comandos:

wkhtmltopdf http://dev.sencha.com/deploy/ext-4.0.2a/examples/charts/Mixed.html --javascript-delay=2000 test.pdf sin duda trabajar en * nix, y una cosa similar debería funcionar en las ventanas.

+0

Gracias, buena idea. Lamentablemente, no cambia nada para mí. Estoy pensando que puede ser la ventana modelo en la que se muestra el gráfico y su hipótesis de extjs es correcta. –

1

que estaba usando wkhtmltopdf 0.9.9 y el rubí PDFKit joya, y tener un problema similar.

Lo arreglé cambiando todas las etiquetas para usar direcciones URL absolutas. Parece que wkhtmltopdf no sabía a qué URL se accedía la página, por lo que no se cargaban los recursos relativos. No sé si eso es una limitación del pdfkit o wkhtmltopdf.

Obtuve la idea desde https://github.com/mileszs/wicked_pdf.

Cuestiones relacionadas