dongtaotao19830418 2012-02-20 18:09
浏览 29
已采纳

如何通过php和perl打开应用程序?

I am trying to print generated forms / receipts through PHP (the printers will be installed on the server, I am not attempting to print to a user's local printer). I have decided to try the following methodology:

IN PHP:

  1. Generate a PDF file and save it on the server.
  2. Call a perl script to print said PDF file.

IN perl:

  1. Use system() to "open" Reader and print the given PDF silently.

What works:

  • I can generate PDFs in PHP.
  • I can call a perl script.
    • If the script has errors, they report to the browser window. ie: If I purposely change file paths it fails, and reports the appropriate reason.
  • functions such as printf seem to work fine as the output displays in the browser.
  • The exact same perl script (with the "non-functioning" line mentioned below) works properly when executed from the command line or the IDE.

What doesn't work:

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

What happens:

  • NOTHING! I get no errors. It just flat out refuses to open Adobe Reader. All code below this line seems to run fine. It's like the function is being ignored. I am at a loss as to why, but I did try a few things.

What I've tried:

  • Changed permissions of the AcroRd32.exe to Everyone - Full Control.
  • Output the $? after the system() call. It is 1, but I don't know what 1 means in this case.
  • Verified that there are no disable_functions listed in php (though I think this is unrelated as shell_exec seems to be working, since some of the perl code is ran).
  • Various other configurations that at least got me to the point where I can confirm that PHP is in fact calling the perl script, it just isn't running the system() call.

Other info:

  • Apache 2.2.1.7
  • PHP 5.35
  • Perl 5.12.3 built for MSWin32-x86-multi-thread
  • WampServer 2.1

I'm at a loss here, and while it seems like this is an Apache / permissions problem, I cannot be sure. My experience with Apache is limited, and most of what I find online is linux commands that don't work in my environment.

  • 写回答

1条回答 默认 最新

  • doutan8601 2012-02-20 19:37
    关注

    Try this:

    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!
    ";
    }
    

    The thing about system() is that it does two different things depending on the number and type(s) of argument it gets. If the argument is an array or if there are multiple arguments, Perl assumes the first is the program to run with the rest as its arguments and it launches the program itself.

    If, however it's just one string, Perl handles it differently. It runs your command-line interpreter (typically CMD.EXE on Windows) on the string and lets it do what it wants with it. This becomes problematic pretty quickly.

    Firstly, both Perl and the shell do various kinds of interpolation on the string (e.g. replace '//' with '/', tokenize by space, etc.) and it gets very easy to lose track of what does what. I'm not at all surprised that your command doesn't work--there are just so many things that can go wrong.

    Secondly, it's hard to know for sure what shell actually gets run on Windows or what changes Perl makes to it first. On Unix, it usually doesn't matter--every shell does more or less the same with simple commands. But on Windows, you could be running raw CMD.EXE, GNU Bash or some intermediate program that provides Unix-shell-like behaviour. And since there are several different ports of Perl to Windows, it could well change if you switch.

    But if you use the array form, it all stays in Perl and nothing else happens under the hood.

    By the way, the documentation for system() and $? can be found here and here. It's well worth reading.

    本回答被题主选为最佳回答 , 对您是否有帮助呢?
    评论

报告相同问题?

悬赏问题

  • ¥500 求华为P30PRO手机硬盘数据恢复
  • ¥15 关于#vscode#的问题:ESP32开发板对接MQTT实现小灯泡的开关
  • ¥15 TMC2209串口模式下读取不到寄存器的值串口助手蓝色字体是发过去的消息,绿色字体是收到的消息,第二行发送读取寄存器的指令但是没有读取到寄存器的值串口助手如下图:接线如下图,如何解决?
  • ¥15 高通安卓11提取完整线刷包软件,或者优博讯dt50顺丰刷机包
  • ¥20 C,有个译码器,换了信道就跑不出原来数据
  • ¥15 MIMIC数据库安装问题
  • ¥60 基于JTag协议开发Fpga下载器上位机,哪位大🐂有偿指导?
  • ¥20 全书网Java爬取数据
  • ¥15 怎么获取红包封面的原始链接,并且获取红包封面序列号
  • ¥100 微信小程序跑脚本授权的问题