PHP打印到网络打印机

ctw*_*els 17 php network-printers

我想做什么

在网络打印机上打印PDF文档,同时传递颜色,方向,双面等内容的打印参数.

更多信息

  • 我们有多台网络打印机,其IP是静态的并且是已知的(即192.168.0.10)
  • 我发现了一个文件包含的参数/选项列表可以传递到打印机改变打印设置 在这里(其中大部分可以在25页上找到)
  • 我们正在创建一个流程,通过该流程我们将打印黑白文档,除了第二页.这意味着,第一页,以及第3页及以后被印在黑色和白色 ; 2页要被印刷在色.(这是由于彩色打印的成本,加上我们的其他页面不包含颜色,因此以彩色打印它们是非常无意义的并且大约要贵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
Run Code Online (Sandbox Code Playgroud)

我试图做的

尝试1使用PHP的exec()函数
我已经尝试了很多方法使exec工作,但无济于事.我无法使用PHP的exec函数运行多行命令(理想情况下,运行以下命令).在exec()中运行以下命令时,我无法连接到FTP,因为必须在上一行运行后执行每一行.我在网上找不到任何内容(多次谷歌搜索没有结果[除了如何从cmd回显多个输出行 - 不是如何连续插入多个cmd行])

> ftp 192.168.0.10
> User (192.168.0.10:(none)): username
> Password: password
> put path\to\test.pdf filetype=PDF
> bye
Run Code Online (Sandbox Code Playgroud)

尝试2使用PHP的exec()函数
我尝试通过传递文本文件来运行ftp命令,因为这篇帖子的一些答案建议.此解决方案无法按预期工作.ftp -i -s:test.txt从命令提示符运行时,这是有效的; 在PHP中,它没有.

PHP文件

exec("ftp -i -s:test.txt");
Run Code Online (Sandbox Code Playgroud)

文本文件(test.txt)

open 192.168.0.10
username
password
put test.pdf filetype=PDF
bye
Run Code Online (Sandbox Code Playgroud)

尝试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';
}
Run Code Online (Sandbox Code Playgroud)

理想的情况下...

我正在寻找适用于Windows和Linux系统的解决方案,因为我们也正在从IIS迁移到NGINX(感谢上帝......).我认为最好的实现方法是使用ftpWindows和/ rcp或rshLinux(因为我附加的打印机文档在" 我正在尝试做的部分"中的更多信息部分提到了这些打印方法).

我也想,如果我们不必生成txt文件或其他文件类型来打印这些文档.我们的用户可能一次处理数百个文件,我知道我们可以唯一地命名每个txt文件,然后在脚本成功运行后删除,虽然我更喜欢一个干净的解决方案,我们可以传递参数,如打印机(来自gethostbyaddr()功能的IP或名称),用户名,密码,要打印的文件,选项(即颜色,双面打印,文件类型,方向,装订等).我们正在使用MDPF生成我们的PDF文件,因此放置文件而不在我们的服务器上实际创建文件的方法将是首选(即电子邮件的MPDF字符串附件),但这些不是必需的.

另外

该解决方案必须与PHP一起使用.

我将继续研究更多在网络打印机上打印文档的方法,直到找到可行的解决方案并在每次尝试后相应地更新我的帖子.

对此有任何帮助非常感谢.



编辑


不成功的方法

方法:PHP打印机功能

该打印机的功能也允许打印,但他们不允许在打印作业(选项,例如彩色/黑白打印,文件类型,双面打印等)控制.因此,这个选项(除非有人有"黑客",将无法工作)

方法:JavaScript/AJAX

尽管JavaScript/AJAX可用于打印(并允许打印设置),但我们将同时处理数百页,并且处理可能会将打印作业推送到多台打印机(即不同的办公室).我们的想法是为这个过程和未来的流程自动化我们的打印.


未经测试的方法

方法:尚未测试

Rei*_*Rei 3

尝试这个:

$ftp = ftp_connect('192.168.0.10');
if(ftp_login($ftp,'username','password')){
    if(ftp_put($ftp,'filetype=PDF','yourfile.pdf',FTP_BINARY)){
        echo 'success';
    }
}
Run Code Online (Sandbox Code Playgroud)

让我知道你得到了什么。

更新:从打印机手册第19页,您可以使用以下命令发送文件并同时设置设备选项:

ftp> put file1 filetype=postscript,tray=tray1,copies=3,resolution=600
Run Code Online (Sandbox Code Playgroud)

在该示例中,file1是要发送的本地文件名,filetype=postscript,tray=tray1,copies=3,resolution=600是远程文件名。准确来说,实际的FTP命令是:

STOR filetype=postscript,tray=tray1,copies=3,resolution=600
Run Code Online (Sandbox Code Playgroud)

使用PHP的FTP功能,PHP代码为:

ftp_put($ftp,'filetype=postscript,tray=tray1,copies=3,resolution=600','file1',FTP_BINARY);
Run Code Online (Sandbox Code Playgroud)

$ftp成功调用的连接句柄在哪里ftp_connect()。

将其放入我的第一个示例中,代码变为:

$ftp = ftp_connect('192.168.0.10');
if(ftp_login($ftp,'username','password')){
    if(ftp_put($ftp,'filetype=postscript,tray=tray1,copies=3,resolution=600','file1',FTP_BINARY)){
        echo 'success';
    }
}
Run Code Online (Sandbox Code Playgroud)

试一试。