2012-05-07 13 views
7

que tienen un bucle de PHP que hace lo siguiente:¿Cómo asegurar la carga de las imágenes antes de generar el PDF?

  1. Acceder a una página web a través de CURL
  2. Captura y página interna que requiere un inicio de sesión
  3. Guardar el código HTML de la página en un archivo local
  4. Usando wkhtmltopdf, representar la página en formato PDF

el problema que estoy teniendo es que de vez en cuando (quizá ~ 30% de las veces), las imágenes no se mostrarán en el PDF . Si abro uno de los archivos HTML guardados, encontraré que debo ingresar y actualizar manualmente la página para que aparezcan las imágenes.

¿Alguna idea sobre cómo asegurar pragmáticamente la carga de las imágenes? Cosas que he intentado:

  1. sleep(n) entre cada línea y cada
  2. Adición --javascript-delay 30000 a mi llamado wkhtmltopdf para asegurarse de que tiene suficiente tiempo para cargar cualquier imagen.

# 1 lo empeoraron considerablemente, y el # 2 no hizo nada en absoluto.

Gracias!

+1

¿Las referencias de las imágenes en el HTML local todavía son válidas? Por lo tanto, tendría que tomar cada imagen del servidor remoto y copiarla en el lugar correcto localmente.Me pregunto si sería más fácil obtener una cookie válida (a través de CURL, etc.) y luego suministrar esto a wkhtmltopdf, que luego va directamente a la página autenticada remotamente. – halfer

+0

wkhtmltopdf en realidad tiene un método para generar una cookie, pero fue una pesadilla trabajar en esta situación particular (de ahí la ruta CURL). Cuando leo en el HTML, estoy reemplazando todas las rutas a la ruta de la imagen remota, lo que definitivamente funciona, ya que puedo abrir el archivo HTML y actualizarlo para ver las imágenes, es como si no hubiera suficiente empuje para obtener la imagen cada vez. En el peor de los casos, creo que puedo intentar que esa cookie funcione con wkhtmltopdf. – Chords

+2

Para un enfoque alternativo, podría intentar usar 'wget' con sus opciones' --page-requisite' y '--convert-links' para descargar el HTML/CSS/Images a una ubicación local, alterando los enlaces al mismo tiempo . A continuación, ejecute el procesador de PDF contra la copia local. – Darien

Respuesta

1

Entre el paso 3 & 4 de su ejemplo, puede considerar analizar el archivo HTML para todos los enlaces de imagen y descargarlos individualmente usando curl, guardándolos también localmente y luego actualizando los enlaces en el archivo HTML guardado para señalar los nuevos recursos de imagen local en lugar de los remotos.

Esto debería mejorar drásticamente el tiempo de carga de las imágenes cuando se renderiza el HTML como PDF.

+0

Gracias, Steve, esto es lo que terminé haciendo y funciona perfectamente. – Chords

0

Nunca he hecho esto, pero tal vez pueda averiguar si la descarga se realiza llamando iteralmente al curl_getinfo() y luego leyendo los valores de CURLINFO_SIZE_DOWNLOAD - hasta que ese valor ya no cambie.

0

¿Qué pasa si después de raspar el html con rizo, tienen bucle de PHP a través de cada elemento img y leer los datos binarios de archivo de imagen y reemplazar el atributo URL de la imagen src con el valor de base 64 codificación del archivo de imagen abierta como:

'<img src="data:image/jpg;base64,'. base64_encode($imagedata) . '"/>'

si los datos de imagen codificada en base 64 es la página que eso le daría una manera programática para verificar todas las imágenes son "cargado" y evitar el problema de la conversión de PDF a partir antes de todas las imágenes habían descargado ...

+0

esto requiere un diseño nuevo solo para la representación de PDF utilizando vistas. no mucha práctica. con muchas imágenes, incluso más fácil de alcanzar el límite de la memoria php. – thevikas

0

¿No podría agregar un onLoad a las imágenes que ¿Necesita saber que se están cargando? algo así como

<img src='foo.jpg' onLoad='callbackFuncion();'/> 
0

Tal vez usted podría procesar el HTML descargado, en busca de etiquetas img, a continuación, dowloading las imágenes a un almacenamiento local y reemplazar el atributo src. De esta forma, deberías generar el pdf después de que todas las imágenes estén disponibles.

Cuestiones relacionadas