2010-05-08 10 views
6

AntecedentesEscribir secuencia binaria de navegador usando PHP

Tratando de transmitir un informe PDF escrito usando iReport través de PHP para el navegador. El problema general es: ¿cómo se escriben datos binarios en el navegador usando PHP?

Código de Trabajo

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

inhábiles Código

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; 

Pregunta

¿Cómo puedo sacar el paso intermedio de escritura en el archivo y escribir directamente al navegador para que el PDF sea no está dañado?

actualización

tamaño de los archivos PDF:

  • de trabajo: 594778 bytes
  • no de trabajo: 1.059.365 bytes

Gracias!

+0

¿Agregar todos los encabezados que cortó desde el primer trabajo? –

+0

@Casey: los encabezados siempre han sido los mismos en ambos casos. Ver el problema revisado. –

+0

¡Ahh, ese es el informe climático! No te preocupes, eso es normal. Siempre están * con errores *;) –

Respuesta

2

Anteriormente tuve problemas para escribir desde Java porque usará UTF-16. La función outputPDF de http://zeronine.org/lab/index.php usa java_set_file_encoding("ISO-8859-1");. Por lo tanto:

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

Tienes razón. Perdón, no lo intenté. En cualquier caso, probé tu código con un PDF rojo a través de file_get_contents y echo funciona sin problemas. Lo único que llama la atención aquí es (creo) la mezcla de Java y PHP.Anteriormente tuve problemas para escribir desde Java porque usará UTF-16 y, por lo tanto, insertará mucho ruido/aire en la cadena. Quizás, escribir en un archivo elimine esta codificación y esto explica las diferencias en los tamaños y por qué no funciona si lo hace directamente. No tengo una instalación de puente PHP-Java, lo siento, no puedo proporcionar más información. – Paolo

+0

Oye ... en realidad googleando creo que puede ser. Mira esto: http://www.php.net/manual/es/function.pdf-utf16-to-utf8.php – Paolo

+1

Aún más (perdón ... sigue encontrando cosas buenas en Google una vez que tengas una pista de qué buscar): Compruebe esto: http://zeronine.org/lab/index.php/Using_Jasper_report_with_PHP Particularmente la función llamada outputPDF. Utiliza java_set_file_encoding ("ISO-8859-1"); y algo de magia adicional :) Espero que esto ayude – Paolo

0

Acaba de escribir la salida. Asegúrese de que:

  • cabeceras se hayan configurado correctamente
  • ningún otro personaje se han impreso accidentalmente antes o después de que el binario (esto incluye los espacios en blanco).
+0

Los encabezados me parecen correctos. No se han escrito otros personajes. –

+1

Y tenga en cuenta las nuevas líneas accidentales. Esto sucede con las nuevas líneas después de?> En incluir archivos. –

Cuestiones relacionadas