2010-05-08 3 views
6

ContexteEcrire flux binaire au navigateur en utilisant PHP

Essayer de diffuser un rapport PDF écrit en utilisant iReport par PHP au navigateur. Le problème général est: comment écrire des données binaires dans le navigateur en utilisant PHP?

Code du travail

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

Code de non-travail

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; 

Question

Comment puis-je prendre l'étape intermédiaire de l'écriture du fichier et écrire directement au navigateur pour que le PDF soit pas corrompu?

Mise à jour

taille des fichiers PDF:

  • travail: 594778 bytes
  • non-travail: 1059365 octets

Merci!

+0

Est-ce que l'ajout de tous les en-têtes que vous avez découpés à partir du premier travail? –

+0

@Casey: Les en-têtes ont toujours été les mêmes dans les deux cas. Voir le problème révisé. –

+0

Ahh, c'est le climat! Pas d'inquiétude, c'est normal. Ils sont toujours * bogués *;) –

Répondre

2

J'ai déjà rencontré des problèmes d'écriture à partir de Java car il va utiliser UTF-16. La fonction outputPDF de http://zeronine.org/lab/index.php utilise java_set_file_encoding("ISO-8859-1");. Ainsi:

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

Vous avez raison. Désolé, je n'ai pas essayé. Dans tous les cas, j'ai essayé votre code avec un fichier PDF rouge via file_get_contents et echo fonctionne sans problème. La seule chose qui retentit ici est (je pense) le mélange de Java et de PHP.J'ai déjà rencontré des problèmes d'écriture à partir de Java parce que cela va utiliser UTF-16, insérant ainsi beaucoup de bruit/air dans la chaîne. Peut-être qu'écrire dans un fichier élimine cet encodage, ce qui explique les différences de taille et pourquoi cela ne fonctionne pas si vous le faites directement. Je ne dispose pas d'un pont PHP-Java installe donc désolé je ne peux pas fournir plus d'informations. – Paolo

+0

Hé ... en train de googler, je pense que c'est peut-être ça. CHeck this out: http://www.php.net/manual/es/function.pdf-utf16-to-utf8.php – Paolo

+1

Encore plus (désolé ... continuez à trouver de bonnes choses dans Google une fois que vous avez une idée de quoi chercher): Cochez cette case: http://zeronine.org/lab/index.php/Using_Jasper_report_with_PHP Particulièrement la fonction appelée outputPDF. Il utilise java_set_file_encoding ("ISO-8859-1"); et puis de la magie supplémentaire :) Espérons que cela aide – Paolo

0

Vous venez d'écrire la sortie. Assurez-vous que:

  • têtes ont été définies
  • aucun autre caractère ont été accidentellement imprimé avant ou après le binaire (ce qui inclut les espaces).
+0

Les en-têtes me semblent corrects. Aucun autre personnage n'a été écrit. –

+1

Et soyez conscient des sauts accidentels. Cela arrive avec les nouvelles lignes après?> Dans les fichiers include. –

Questions connexes