2012-05-07 5 views
7

Ho un ciclo PHP che esegue le seguenti operazioni:Come garantire il caricamento delle immagini prima di generare PDF?

  1. Accedere a una pagina web tramite CURL
  2. Cattura e pagina interna che richiede un login
  3. Salva il codice HTML della pagina in un file locale
  4. Utilizzando wkhtmltopdf, il rendering della pagina in formato PDF

il problema che sto avendo è che ogni tanto un po '(forse ~ 30% del tempo), le immagini non rendono nel PDF . Se apro uno dei file HTML salvati, troverò che ho bisogno di entrare e aggiornare manualmente la pagina per far apparire le immagini.

Qualche idea su come garantire pragmaticamente il caricamento delle immagini? Le cose che ho provato:

  1. sleep(n) tra ogni linea
  2. Aggiunta --javascript-delay 30000 alla mia chiamata wkhtmltopdf per assicurarsi che ha tutto il tempo per caricare le immagini.

n. 1 ha reso notevolmente peggio, e il n. 2 non ha fatto nulla.

Grazie!

+1

I riferimenti immagine nell'HTML locale sono ancora validi? Quindi, dovresti prendere ogni immagine dal server remoto e copiarla nel posto giusto localmente.Mi chiedo se sarebbe più semplice ottenere un cookie valido (tramite CURL, ecc.) E quindi fornirlo a wkhtmltopdf, che poi va direttamente alla pagina autenticata a distanza? – halfer

+0

wkhtmltopdf ha in realtà un metodo per generare un cookie, ma è stato un incubo lavorare in questa particolare situazione (da qui il percorso CURL). Quando leggo in HTML sto sostituendo tutti i percorsi del percorso dell'immagine remoto, che sicuramente funziona poiché posso aprire il file HTML e aggiornare con difficoltà per vedere le immagini, è come se non ci fosse abbastanza grinta per ottenere l'immagine ogni volta. Nel peggiore dei casi, credo di poter provare a far funzionare quel cookie con wkhtmltopdf. – Chords

+2

Per un approccio alternativo, puoi provare a utilizzare 'wget' con le sue opzioni' --page-requisites' e '--convert-links' per scaricare HTML/CSS/Images in una posizione locale, modificando i collegamenti allo stesso tempo . Quindi esegui il renderer PDF contro la copia locale. – Darien

risposta

1

Tra il passaggio 3 & 4 del tuo esempio potresti prendere in considerazione l'analisi del file HTML per tutti i collegamenti immagine e scaricarli individualmente utilizzando il ricciolo, salvandoli anche localmente e quindi aggiornando i collegamenti nel file HTML salvato in modo che puntino a le nuove risorse di immagini locali invece di quelle remote.

Questo dovrebbe migliorare drasticamente il tempo di caricamento delle immagini quando si esegue il rendering dell'HTML come PDF.

+0

Grazie, Steve: questo è quello che ho finito e funziona perfettamente. – Chords

0

Non l'ho mai fatto, ma forse puoi scoprire se il download è fatto chiamando iterally curl_getinfo() e poi leggendo i valori per CURLINFO_SIZE_DOWNLOAD - fino a che quel valore non cambia più?

0

Che cosa succede se dopo aver raschiare il codice html con curl, hanno ciclo php attraverso ogni elemento img e leggere i dati binari di file immagine e sostituire l'attributo URL dell'immagine src con il valore Base64 codifica del file di immagine aperto come:

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

se i dati dell'immagine Base64 è insita nel pagina rispetto che si darebbe un modo programmatico per verificare tutte le immagini sono "caricato" e prevenire il problema della conversione pdf a partire prima di tutte le immagini avevano scaricato ...

+0

questo richiede un layout fresco solo per il rendering pdf utilizzando le viste. non molta pratica con molte immagini, ancora più facile da colpire il limite di php mem. – thevikas

0

Non potresti aggiungere un onLoad alle immagini che bisogno di sapere che stanno caricando? qualcosa come

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

Forse si potrebbe elaborare l'HTML scaricato, alla ricerca di tag img, quindi dowloading le immagini per un archivio locale e sostituendo l'attributo src. In questo modo, dovresti generare il pdf dopo che tutte le immagini sono disponibili.