【问题标题】:How to open an application via php and perl?如何通过 php 和 perl 打开应用程序?
【发布时间】:2012-03-11 02:10:03
【问题描述】:

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

在 PHP 中:

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

在 perl 中:

  1. 使用system()“打开”阅读器并静默打印给定的PDF。

什么有效:

  • 我可以用 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');

会发生什么:

  • 什么都没有!我没有错误。它完全拒绝打开 Adob​​e 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-多线程构建的 Perl 5.12.3
  • WampServer 2.1

我在这里不知所措,虽然这似乎是 Apache / 权限问题,但我不能确定。我对 Apache 的经验有限,我在网上找到的大部分是在我的环境中不起作用的 linux 命令。

【问题讨论】:

  • 我不明白你为什么要打开阅读器。
  • 实际命令为:system('"C:\\Program Files (x86)\\Adobe\\Reader 10.0\\Reader\\AcroRd32.exe" /N /T "C:\\test.pdf" 0-XEROX');,其中 0-XEROX 为打印机名称。但是,嘿,我全神贯注于如何以另一种方式打印 PDF。编辑:我认为弄清楚如何使原始问题发挥作用通常很有价值,但我的最终目标是简单地打印 PDF,所以再次提供的任何帮助都会非常有用。
  • 嗯,好的,现在我明白了。因此,您希望在网站上创建 PDF 时立即在打印机上打印它们。嗯,恐怕我帮不上忙。无论如何,改进证明你给我的完整命令行的问题。我投了赞成票,希望你能找到解决方案。
  • 已编辑,感谢反馈!
  • 我不熟悉 perl,所以我的问题是:为什么软件路径中有双 \?我认为,也许路径是造成问题的路径,您是否尝试过在C:\AcroRd32.exe 等更简单的路径中为AcroRd32.exe 创建快捷方式

标签: php perl apache printing


【解决方案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 会以不同的方式处理它。它 在 字符串,让它做它想做的事。这变成 问题很快。

首先,Perl 和 shell 都在 字符串(例如,将 '//' 替换为 '/'、用空格标记等)和 很容易忘记做什么。我一点也不 惊讶于你的命令不起作用——有这么多 可能出错的事情。

其次,很难确定实际在哪个 shell 上运行 Windows 或 Perl 首先对其进行的更改。在 Unix 上,这通常无关紧要——每个 shell 都做更多或 与简单的命令不太一样。但在 Windows 上,你可以 运行原始 CMD.EXE、GNU Bash 或一些中间程序 提供类 Unix shell 的行为。而且由于有几个 Perl 到 Windows 的不同端口,如果你 切换。

但是如果你使用数组形式,它就全部留在 Perl 中,没有别的了 发生在幕后。

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

【讨论】:

  • 这对一些人有帮助,猜猜现在显示的是什么:“无法启动 acrobat 阅读器!”我想这告诉我运行system() 函数实际上存在错误,但它仍然没有告诉我原因。还有其他我可以抓取的输出吗?它正在执行die 语句,但我需要知道原因才能修复它。
  • 显然,$! 给了我更多信息:No such file or directory。但是,它确实存在,并且当我从命令行运行 perl 脚本时可以工作......呃。
  • 尝试输入 'print "Found acroread!\n" if (-f $args[0]);'在@args 定义之后。这将告诉您 acroread 的路径是否正确。如果是,请尝试将 '-f' 替换为 '-x'——这将告诉你 Perl 是否有权运行它。
  • 我在my @args = ('C:\Program Files (x86)\Adobe\Reader 10.0\Reader\AcroRd32.exe'); 之后的行中有:print "Found acroread!\n" if (-x $args[0]); 无论我使用 -f 还是 -x,它都会显示 Found acroread! - 我想再次强调,如果我运行 perl从命令行执行脚本,它实际上确实打开了 Adob​​e Reader。奇怪的是,使用您的代码,它会输出Found acroread!,然后当我关闭阅读器时,它会输出die 语句。
  • 我读了,我明白你的建议。所以我实现了这些测试,并且基本上对任何文件测试都表示赞同:-f、-e、-w 和 -r。 (在我访问的网站的选项列表中没有看到 -x)。无论哪种方式,当我从控制台运行它时,我都会在控制台中显示,当我通过 php 运行它时,我会在浏览器中显示。唯一的区别是 perl 从控制台运行时实际上会打开阅读器...
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2020-09-11
  • 1970-01-01
  • 2016-01-31
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多