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

时间:2012-02-20 18:09:22

标签: php perl apache printing

我正在尝试通过PHP打印生成的表单/收据(打印机将安装在服务器上,我不会尝试打印到用户的本地打印机)。我决定尝试以下方法:

在PHP中:

  1. 生成PDF文件并将其保存在服务器上。
  2. 调用perl脚本打印所述PDF文件。
  3. IN perl:

    1. 使用system()“打开”Reader并静默打印给定的PDF。
    2. 什么有效:

      • 我可以用PHP生成PDF。
      • 我可以调用perl脚本。
        • 如果脚本有错误,他们会向浏览器窗口报告。即:如果我故意更改文件路径,它会失败,并报告相应的原因。
      • printf等功能似乎可以正常工作,因为输出显示在浏览器中。
      • 从命令行或IDE执行时,完全相同的perl脚本(下面提到的“无效”行)可以正常工作。

      什么行不通:

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

      会发生什么:

      • 什么!我没有错。它只是平坦的拒绝打开Adobe Reader。这行下面的所有代码似乎运行正常。这就像被忽略的功能一样。我不知道为什么,但我确实尝试了一些事情。

      我尝试了什么:

      • 将AcroRd32.exe的权限更改为Everyone - Full Control
      • $?电话后输出system()。它是1,但我不知道1在这种情况下的含义。
      • 已验证php中没有列出disable_functions(虽然我认为这是无关的,因为shell_exec似乎正在运行,因为某些perl代码已经运行了。)
      • 各种其他配置至少让我能够确认PHP实际上正在调用perl脚本,它只是没有运行system()调用。

      其他信息:

      • Apache 2.2.1.7
      • PHP 5.35
      • 为MSWin32-x86-multi-thread构建的Perl 5.12.3
      • WampServer 2.1

      我在这里不知所措,虽然看起来这是一个Apache /权限问题,但我无法确定。我对Apache的经验是有限的,我在网上发现的大部分内容都是在我的环境中不起作用的linux命令。

1 个答案:

答案 0 :(得分:1)

试试这个:

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

关于system()的事情是它做了两件不同的事情 取决于它得到的参数的数量和类型。如果 参数是一个数组,或者如果有多个参数,Perl假定 第一个是以其余为参数运行的程序 启动程序本身。

但是,如果它只是一个字符串,Perl处理它的方式不同。它 在Windows上运行命令行解释器(通常是Windows上的CMD.EXE) 字符串,让它做它想要的东西。这变成了 问题非常快。

首先,Perl和shell都会进行各种插值 字符串(例如用'/'替换'//',用空格标记,等等)和 很容易忘记什么是什么。我根本不是 惊讶于你的命令不起作用 - 有这么多 可能出错的事情。

其次,很难确定实际运行的shell是什么 Windows或Perl首先对其进行了哪些更改。在Unix上,它通常无关紧要 - 每个shell都做更多或更多 简单的命令不太相同。但在Windows上,你可能会 运行原始CMD.EXE,GNU Bash或一些中间程序 提供类似Unix-shell的行为。而且因为有几个 Perl到Windows的不同端口,如果你可以改变它 开关。

但是如果你使用数组形式,它都保留在Perl中,而不是其他任何东西 发生在引擎盖下。

顺便说一下,system()和$的文档?可以找到herehere。这非常值得一读。