我想做什么
在传递诸如颜色,方向,双面等之类的打印参数的同时,在网络打印机上打印PDF文档。
更多信息
我在某种程度上取得了成功
我登录了一台打印机(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
我试图做的使用PHP的exec()函数尝试1
我尝试了许多使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
使用PHP的exec()函数尝试2我尝试通过传递文本文件来运行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
使用PHP的FTP函数尝试3我现在不知道的是如何通过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
(因为我在“我要做的事情”部分的“更多信息”下附加了打印机文档中提到了这些打印方法)。我也想如果我们不必生成txt文件或其他文件类型来打印这些文档。我们的用户可能一次处理数百个文件,据我了解,我们可以唯一地命名每个txt文件,然后在脚本成功运行后将其删除,尽管我更喜欢一个干净的解决方案,我们可以在其中传递打印机等参数(
gethostbyaddr()
函数的IP或名称),用户名,密码,要打印的文件,选项(例如颜色,双工,文件类型,方向,装订等)。我们正在使用MPDF生成我们的PDF文件,因此首选的方法是将文件放置而不实际在我们的服务器上创建文件,然后再将其删除(例如,电子邮件的MPDF字符串附件),但这不是必需的。此外
该解决方案必须与PHP一起使用。
发布此文章后,我将继续研究更多在网络打印机上打印文档的方法,直到找到可行的解决方案为止,并在每次尝试后相应地更新我的文章。
非常感谢对此的任何帮助。
编辑
方法不成功
方法:PHP打印机功能
printer functions确实允许打印,但是它们不允许控制打印作业(诸如彩色/黑白打印,文件类型,双面打印等选项)。因此,此选项(除非有人受到“黑客攻击”,否则将无法使用)
方法:JavaScript/AJAX
尽管JavaScript/AJAX可用于打印(并允许打印设置),但我们可能一次处理数百页,并且该处理可能会将打印作业推送到多台打印机(即在不同的办公室)。我们的想法是针对此过程以及将来的过程使我们的打印自动化。
未经测试的方法
方法:尚未测试
解决方案?
我最终创建了一个C#脚本来完成我需要做的所有事情。由于我对打印设置here's a link to Microsoft's System.Drawing.Printing namespace的要求非常具体。使用此命名空间,我能够创建适合自己需要的方法。以下一些StackOverflow问题/答案提供了有关用法的更多详细信息:
如何在PHP中运行C#?这取决于你。您可以与C#API交互(例如,使C#在另一台Web服务器上运行),引用.NET DLL,使用PeachPie或在运行时插入声明。
您还可以使用PowerShell来构想某些东西(请参阅PrintManagement documentation here)。这将允许您使用
exec()
运行脚本-请参阅有关execution of PowerShell from PHP的问题。
最佳答案
试试这个:
$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';
}
}
让我知道你得到什么。
更新:第19页的the printer's manual中的,
您可以使用以下命令来发送文件并同时设置设备选项:
ftp> put file1 filetype=postscript,tray=tray1,copies=3,resolution=600
在该示例中,
file1
是要发送的本地文件名,filetype=postscript,tray=tray1,copies=3,resolution=600
是远程文件名。确切地说,实际的FTP命令是:
STOR filetype=postscript,tray=tray1,copies=3,resolution=600
使用PHP的FTP函数,PHP代码为:
ftp_put($ftp,'filetype=postscript,tray=tray1,copies=3,resolution=600','file1',FTP_BINARY);
其中
$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';
}
}
试试看。
关于php - PHP打印到网络打印机,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/40998302/