我要做什么
在网络打印机上打印PDF文档,同时传递打印参数,例如颜色、方向、双面等。
更多信息
- 我们有多个网络打印机,其IP地址是静态且已知的(例如192.168.0.10)。
- 我找到了一份文档,其中包含可以传递给打印机以更改打印设置的参数/选项列表这里(其中大部分可以在第25页找到)。
- 我们正在创建一个过程,通过该过程将以黑白方式打印文档,除第二页外。这意味着第一页、第三页及之后的页面都将以黑白方式打印;第二页将以彩色方式打印。(这是由于彩色打印的成本,加上我们的其他页面不包含颜色,因此将它们打印成彩色极其无意义且大约要昂贵8倍-该过程每月将打印数千页,这会增加很多$$$)
我已经在某些方面取得了一定的成功
我登录了其中一台打印机(192.168.0.10 - 理光 MP C5503 [如果你真的想知道]),并添加了FTP访问权限。
使用Windows命令提示符打印文档是可行的!
> ftp 192.168.0.10
> User (192.168.0.10:(none)): username
> Password: password
> put path\to\file.pdf filetype=PDF
> bye
我尝试过的事情
尝试1:使用PHP的exec()函数
我已经尝试了很多种方法来使exec工作,但都没有成功。我无法使用PHP的exec函数运行多行命令(理想情况下,运行以下命令)。在exec()内运行以下内容时,我无法连接到FTP,因为每行必须在前一行运行后才能执行。我在网上找不到任何东西(多次Google搜索没有结果[除了如何从cmd中回显多个输出行 - 而不是如何连续插入多个cmd行])
> ftp 192.168.0.10
> User (192.168.0.10:(none)): username
> Password: password
> put path\to\test.pdf filetype=PDF
> bye
尝试2:使用PHP的exec()函数
我尝试通过传递一个文本文件来运行ftp命令,正如this帖子中的一些答案所建议的那样。但是这种解决方案并没有像预期的那样工作。在命令提示符中运行ftp -i -s:test.txt
可以成功,但在PHP中却不行。
PHP文件:
exec("ftp -i -s:test.txt");
文本文件 (test.txt)
open 192.168.0.10
username
password
put test.pdf filetype=PDF
bye
尝试3:使用PHP的FTP函数
现在我无法弄清如何通过ftp将文件发送到打印机并设置打印机设置。
$ftp = [
'server' => gethostbyaddr('192.168.0.10'),
'username' => 'username',
'password' => 'password',
];
$conn = ftp_connect($ftp['server']);
$login = ftp_login($conn, $ftp['username'], $ftp['password']);
if (is_readable($file)) {
if (ftp_put($conn, $file, $file, FTP_ASCII)) {
echo 'Successfully executed command';
}
else {
echo 'Failed execution of command';
}
}
else {
echo 'File is not readable';
}
理想情况下...
我正在寻找一种适用于Windows和Linux系统的解决方案,因为我们也正在从IIS迁移到NGINX(谢天谢地...)。我认为最好的实现方法是在Windows上使用ftp
,在Linux上使用rcp
或rsh
(因为我在更多信息中附加的打印机文档在我试图做什么部分提到了这些打印方法)。
gethostbyaddr()
函数获取的IP或名称),用户名,密码,要打印的文件,选项(即颜色、双面、文件类型、方向、装订等)。我们正在使用MPDF生成我们的PDF文件,因此最好使用一种方法将文件放置在没有实际创建它的服务器上,我们随后必须删除它(即用于电子邮件的MPDF字符串附件),但这些不是必需的。此外,解决方案必须与PHP兼容。
在发布此帖子后,我将继续调查在网络打印机上打印文档的更多方法,直到找到一个可行的解决方案,并根据每次尝试更新我的帖子。
非常感谢任何关于此事的帮助。
编辑
不成功的方法
方法:PHP打印函数
打印函数确实允许打印,但是它们不允许控制打印作业(例如颜色/黑白打印、文件类型、双面打印等选项)。因此,这些选项(除非有人有“黑科技”)将无法使用。
方法:JavaScript/AJAX
虽然JavaScript/AJAX可以用于打印(并允许打印设置),但我们可能会一次处理数百页,并且处理可能会将打印作业推送到多台打印机(即在不同的办公室)。我们的想法是自动化我们的打印流程以及未来的流程。
未经测试的方法
方法:尚未测试
解决方案?
最终,我创建了一个C#脚本来完成我需要做的一切。由于我的打印设置要求相当具体,这是微软的System.Drawing.Printing名称空间的链接。使用此名称空间,我能够为自己的需求创建适当的方法。下面是一些StackOverflow问题/答案,提供更多关于用法的细节:
如何在PHP中运行C#?那取决于你。您可以与C# API进行接口交互(例如在另一台Web服务器上运行C#),引用.NET DLL,使用PeachPie或在运行时注入声明。
您也可以使用PowerShell来创造一些东西(请参见PrintManagement文档)。这将允许您使用exec()
运行脚本 - 有关从PHP执行PowerShell的问题,请参见此问题(execution of PowerShell from PHP)。
printer_open ([ string $printername ] )
PHP 函数了吗? - odedta