php - PHP打印到网络打印机

标签 php network-printers

我想做什么
在传递诸如颜色,方向,双面等之类的打印参数的同时,在网络打印机上打印PDF文档。
更多信息

  • 我们有多个网络打印机,其 IP 静态的,并且已知(即192.168.0.10)
  • 我找到了一个文档,其中包含参数/选项列表,可以将其传递给打印机以更改打印设置 here(大多数可以在第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
    
    我试图做的
    使用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上使用rcprsh(因为我在“我要做的事情”部分的“更多信息”下附加了打印机文档中提到了这些打印方法)。
    我也想如果我们不必生成txt文件或其他文件类型来打印这些文档。我们的用户可能一次处理数百个文件,据我了解,我们可以唯一地命名每个txt文件,然后在脚本成功运行后将其删除,尽管我更喜欢一个干净的解决方案,我们可以在其中传递打印机等参数( gethostbyaddr()函数的IP或名称),用户名,密码,要打印的文件,选项(例如颜色,双工,文件类型,方向,装订等)。我们正在使用MPDF生成我们的PDF文件,因此首选的方法是将文件放置而不实际在我们的服务器上创建文件,然后再将其删除(例如,电子邮件的MPDF字符串附件),但这不是必需的。
    此外
    该解决方案必须与PHP一起使用。
    发布此文章后,我将继续研究更多在网络打印机上打印文档的方法,直到找到可行的解决方案为止,并在每次尝试后相应地更新我的文章。
    非常感谢对此的任何帮助。

    编辑

    方法不成功
    方法:PHP打印机功能
    printer functions确实允许打印,但是它们不允许控制打印作业(诸如彩色/黑白打印,文件类型,双面打印等选项)。因此,此选项(除非有人受到“黑客攻击”,否则将无法使用)
    方法:JavaScript/AJAX
    尽管JavaScript/AJAX可用于打印(并允许打印设置),但我们可能一次处理数百页,并且该处理可能会将打印作业推送到多台打印机(即在不同的办公室)。我们的想法是针对此过程以及将来的过程使我们的打印自动化。

    未经测试的方法
    方法:尚未测试
  • 使用IPP(根据@Dezza:Dezza)
  • 使用PrintNode(按照@odedta:odedta)

  • 解决方案?
    我最终创建了一个C#脚本来完成我需要做的所有事情。由于我对打印设置here's a link to Microsoft's System.Drawing.Printing namespace的要求非常具体。使用此命名空间,我能够创建适合自己需要的方法。以下一些StackOverflow问题/答案提供了有关用法的更多详细信息:
  • Setting the paper size
  • Set print orientation to landscape

  • 如何在PHP中运行C#?这取决于你。您可以与C#API交互(例如,使C#在另一台Web服务器上运行),引用.NET DLL,使用PeachPie或在运行时插入声明。
  • Call a C# .net .dll script using PHP
  • Three ways of using C# in PHP with Peachpie Compiler

  • 您还可以使用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/

    相关文章:

    java - 我在 Brother 打印机 QL-710W 上不断出现 ERROR_WRONG_LABEL

    php - 在网络打印机上无人值守打印文档

    使用无需驱动程序的 IPP 进行打印(IPP 客户端)

    javascript - 大尺寸图片不上传

    PHP 单元模拟对象类型

    php - 按 created_at 排序 Eloquent 集合

    php - 显示字符串最多这么多个字符而不拆分单词

    php - $(this).data ("value") 未使用 $.post 传递值

    c++ - .NET 从具有 www 接口(interface)的打印机获取数据