Comment ouvrir une application via php et perl?

J’essaie d’imprimer des formulaires / reçus générés via PHP (les imprimantes seront installées sur le serveur, je n’essaie pas d’imprimer sur l’imprimante locale d’un utilisateur). J’ai décidé d’essayer la méthodologie suivante:

EN PHP:

  1. Générez un fichier PDF et enregistrez-le sur le serveur.
  2. Appelez un script Perl pour imprimer ledit fichier PDF.

IN perl:

  1. Utilisez system() pour “ouvrir” Reader et imprimer le fichier PDF en mode silencieux.

Ce qui fonctionne:

  • Je peux générer des fichiers PDF en PHP.
  • Je peux appeler un script perl.
    • Si le script comporte des erreurs, elles sont signalées dans la fenêtre du navigateur. c.-à-d.: si je modifie délibérément des chemins de fichiers, cela échoue et signale la raison appropriée.
  • des fonctions telles que printf semblent fonctionner correctement lorsque la sortie est affichée dans le navigateur.
  • Le même script Perl exact (avec la ligne “non fonctionnelle” mentionnée ci-dessous) fonctionne correctement lorsqu’il est exécuté à partir de la ligne de commande ou de l’EDI.

Ce qui ne marche pas:

  • Dans perl: system('"C:\\Program Files (x86)\\Adobe\\Reader 10.0\\Reader\\AcroRd32.exe" /N /T "C:\\test.pdf" 0-XEROX');

Ce qui se produit:

  • RIEN! Je n’ai aucune erreur. Il vient tout juste de refuser d’ouvrir Adobe Reader. Tout le code en dessous de cette ligne semble fonctionner correctement. C’est comme si la fonction était ignorée. Je ne sais pas pourquoi, mais j’ai essayé quelques petites choses.

Ce que j’ai essayé:

  • Autorisations modifiées de AcroRd32.exe pour Everyone - Full Control .
  • Produire le $? après l’appel system() . C’est 1 , mais je ne sais pas ce que cela signifie dans ce cas.
  • Vérifié qu’il n’y a pas de disable_functions répertoriées dans php (bien que je pense que cela n’a aucun rapport puisque shell_exec semble fonctionner, car une partie du code perl est exécutée).
  • Diverses autres configurations qui me permettent au moins de confirmer que PHP appelle en fait le script perl, il ne fait que lancer l’appel system() .

Autre info:

  • Apache 2.2.1.7
  • PHP 5.35
  • Perl 5.12.3 construit pour MSWin32-x86-multi-thread
  • WampServer 2.1

Je suis désolé ici, et bien qu’il semble que ce soit un problème d’Apache / de permissions, je ne peux pas en être sûr. Mon expérience avec Apache est limitée et la plupart de ce que je trouve en ligne sont des commandes Linux qui ne fonctionnent pas dans mon environnement.

Essaye ça:

 my @args = ('C:/Program Files (x86)/Adobe/Reader 10.0/Reader/AcroRd32.exe'); if (system(@args) != 0) { # Can't run acroread. Oh Noes!!! die "Unable to launch acrobat reader!\n"; } 

La chose à propos de system () est qu’elle fait deux choses différentes en fonction du nombre et du type d’argument. Si l’argument est un tableau ou s’il y a plusieurs arguments, Perl suppose que le premier est le programme à exécuter avec le rest comme arguments et qu’il lance le programme lui-même.

Si, cependant, il ne s’agit que d’une chaîne, Perl le gère différemment. Il exécute votre interpréteur de ligne de commande (généralement CMD.EXE sous Windows) sur la chaîne et lui permet de faire ce qu’il veut avec. Cela devient rapidement problématique.

Tout d’abord, Perl et le shell effectuent différents types d’interpolation sur la chaîne (par exemple, remplacer “//” par “/”, marquer par espace, etc.) et il devient très facile de perdre la trace de ce qui fait quoi. Je ne suis pas du tout surpris que votre commande ne fonctionne pas – il y a tellement de choses qui peuvent mal tourner.

Deuxièmement, il est difficile de savoir avec certitude quel shell est réellement exécuté sur Windows ou quelles sont les premières modifications apscopes par Perl. Sur Unix, peu importe – chaque shell fait plus ou moins la même chose avec des commandes simples. Mais sous Windows, vous pouvez exécuter brut CMD.EXE, GNU Bash ou un programme intermédiaire offrant un comportement de type shell Unix. Et comme il existe plusieurs ports différents de Perl vers Windows, cela pourrait bien changer si vous changez de mode.

Mais si vous utilisez le tableau, tout rest en Perl et rien d’autre ne se produit sous le capot.

Au fait, la documentation pour system () et $? peut être trouvé ici et ici . Cela vaut la peine de lire.