2017-05-03 3 views
-1

Je crée un fichier PDF à partir d'un modèle en utilisant JasperPHP.Vérifiez que le fichier PDF a été créé avant d'afficher?

Je puis immédiatement essayer de l'afficher.

Comment puis-je m'assurer qu'il est complètement créé avant d'afficher?

Je vérifie que le fichier existe mais le PDF est corrompu, à ce stade, donc je suppose qu'il est encore en cours de création.

J'ai également essayé d'utiliser flock, pour l'ouvrir avec un verrou exclusif, mais cela semble fonctionner, même lorsque le PDF n'est pas complètement rendu.

C'est ce que je fais (le dd est juste pour le test, il ne fait jamais ici):

/** 
    * Check that we can lock a file 
    * this ensures that it has been completely created. 
    * 
    * @param $filename 
    * @return bool 
    */ 
    function stillWriting($filename) 
    { 
     $stillWriting = true; 

     if($fp = fopen($filename, "r+")) 
     { 
      if (flock($fp, LOCK_EX)) // Try to get an exclusive lock on the file 
      { 
       flock($fp, LOCK_UN); // Unlock - we're just checking 
       $stillWriting = false; 
      }else{ 
       dd('failed'); 
      } 
      fclose($fp); 
     } 
     return $stillWriting; 
    } 

Mick

Edition - ajouté plus de détails

C'est là le PDF est créé:

exec($this->the_command, $output, $return_var); 

Je suis un usi ng https://github.com/cossou/JasperPHP

Il exécute JasperStart [https://sourceforge.net/projects/

C'est là que le PDF est affiché:

return Response::make(file_get_contents($this->outputFilename .'.pdf'), 200, [ 'Content-Type' => 'application/pdf', 'Content-Disposition' => 'inline; filename="' . $this->outputFilename .'.pdf' .'"' ]);

Le problème réel que je reçois est que Chrome dit « Echec de chargement du document PDF ", Je devine de ceci, que c'est un problème de synchronisation. Le fichier s'ouvre correctement Si je vais ensuite à Windows et double-cliquez.

+0

Comment le PDF s'affiche? Rendu dans le navigateur? Imprimé et livré par transporteur pigeon? Chargé sur un lecteur réseau à l'aide de l'Explorateur Windows via un double-clic dans un lecteur PDF? Le PDF est-il disponible en téléchargement via le navigateur pour une période de 24 heures après la demande? Le PDF est-il régénéré ou mis en cache par requête? Veuillez mettre à jour votre question avec plus de détails. –

+0

La raison de ces questions est que si le PDF est chargé dans un navigateur web immédiatement après avoir été généré par JasperReports, il n'est pas nécessaire de le sauvegarder dans un fichier local. Diffusez-le directement dans le navigateur (et écrivez des tests unitaires pour trouver toutes les conditions sur lesquelles le rapport pourrait être vide, puis corrigez ces tests). –

+0

Ceci est déroutant, créez-vous le pdf asynchrone? Comment cela pourrait-il arriver? Pourquoi ne pas vérifier les données avant de créer le pdf pour déterminer si c'est vide? Le pdf DOIT être écrit dans un fichier local (ou distant). – Kisaragi

Répondre

0

JasperPHP a un indicateur $background = true.

Si je le mets à false, il semble qu'il attende la fin de la compilation avant de continuer.

Mick