2010-05-08 14 views
6

SfondoScrivi flusso binario al browser utilizzando PHP

Cercando di trasmettere un report PDF scritto utilizzando iReport tramite PHP per il browser. Il problema generale è: come scrivi dati binari nel browser usando PHP?

codice di lavoro

header('Cache-Control: no-cache private'); 
header('Content-Description: File Transfer'); 
header('Content-Disposition: attachment, filename=climate-report.pdf'); 
header('Content-Type: application/pdf'); 
header('Content-Transfer-Encoding: binary'); 

$path = realpath(".") . "/output.pdf"; 

$em = java('net.sf.jasperreports.engine.JasperExportManager'); 
$result = $em->exportReportToPdf($pm); 
header('Content-Length: ' . strlen($result)); 

$fh = fopen($path, 'w'); 
fwrite($fh, $result); 
fclose($fh); 

readfile($path); 

non funzionante Codice

header('Cache-Control: no-cache private'); 
header('Content-Description: File Transfer'); 
header('Content-Disposition: attachment, filename=climate-report.pdf'); 
header('Content-Type: application/pdf'); 
header('Content-Transfer-Encoding: binary'); 

$path = realpath(".") . "/output.pdf"; 

$em = java('net.sf.jasperreports.engine.JasperExportManager'); 
$result = $em->exportReportToPdf($pm); 
header('Content-Length: ' . strlen($result)); 

echo $result; 

Domanda

Come posso togliere la fase centrale della scrittura al file e scrivere direttamente al browser in modo che il PDF sia non corrotto?

Aggiornamento

PDF file di dimensioni:

  • di lavoro: 594778 byte
  • non lavoro: 1.059.365 byte

Grazie!

+0

Aggiunge tutte le intestazioni che si ritagliano dal primo lavoro? –

+0

@Casey: le intestazioni sono sempre state le stesse in entrambi i casi. Vedi il problema rivisto. –

+0

Ah, questo è il rapporto sul clima! Nessuna preoccupazione, è normale. Sono sempre * buggy *;) –

risposta

2

Ho già avuto problemi con la scrittura da Java perché userà UTF-16. La funzione outputPDF da http://zeronine.org/lab/index.php utilizza java_set_file_encoding("ISO-8859-1");. Quindi:

java_set_file_encoding("ISO-8859-1"); 

    $em = java('net.sf.jasperreports.engine.JasperExportManager'); 
    $result = $em->exportReportToPdf($pm); 

    header('Content-Length: ' . strlen($result)); 

    echo $result; 
+0

Hai ragione. Mi dispiace, non l'ho provato in ogni caso, ho provato il tuo codice con un PDF rosso tramite file_get_contents e echo funziona senza problemi. L'unica cosa che suona un campanello qui è (credo) il mix di Java e PHP.In precedenza ho avuto problemi con la scrittura da Java perché userà UTF-16 inserendo così un sacco di rumore/aria nella stringa. Forse, scrivere su un file elimina questa codifica e questo spiega le differenze nelle dimensioni e il motivo per cui non funziona se lo si fa direttamente. Non ho installato un bridge PHP-Java, quindi mi dispiace non poter fornire ulteriori approfondimenti. – Paolo

+0

Ehi ... in realtà su Google mi sembra che possa essere questo. CHeck this out: http://www.php.net/manual/es/function.pdf-utf16-to-utf8.php – Paolo

+1

Ancora di più (mi spiace ... continua a trovare cose buone su Google una volta che hai un indizio di cosa cercare): Verificare: http://zeronine.org/lab/index.php/Using_Jasper_report_with_PHP In particolare la funzione denominata outputPDF. Utilizza java_set_file_encoding ("ISO-8859-1"); e poi qualche magia addizionale :) Spero che questo aiuti – Paolo

0

Basta scrivere l'output. Assicurarsi che:

  • intestazioni corrette sono state impostate
  • nessun altro personaggio sono state stampate per errore prima o dopo il binario (questo include gli spazi bianchi).
+0

Le intestazioni mi sembrano corrette. Nessun altro personaggio è stato scritto –

+1

E sii consapevole delle newline accidentali. Ciò accade con newline dopo?> Nei file include. –

Problemi correlati