【问题标题】:Unattended printing a document on a network printer在网络打印机上无人值守地打印文档
【发布时间】:2011-11-07 18:24:23
【问题描述】:

我们正在尝试以自动方式将主文档(在自动邮件合并之后)发送到我们的一台网络打印机,该打印机同时分配了网络名称和内部 IP。

但这是真正棘手的部分。当我们从工作站打印文档时,我们确实会收到“作业会计”对话框的提示,在打印之前输入该文档的项目代码,这样财务部门就可以完成所有花哨的会计和计费工作。

那么,我们如何以编程方式将文档 (docx) 与 作业统计参数 一起发送到网络打印机?

我不确定在打印作业时会计数据有多常见,因为这是我见过的第一份工作。

以下是重要的细节:

  • PHP 5(首选)
  • Windows Server(我相信是 2003 年)
  • 京瓷 KM-4050 打印机(带静态 IP)
  • C++ 和 Visual Basic 的一些经验

我们进行了一些研究,但还没有找到太多可行的解决方案,经过一些讨论,我们不完全确定从哪里开始。不幸的是,似乎没有任何类型的 API 可以插入。

----- 解决方案 -----

我的团队决定实现代码,该代码将调用可执行文件将每个文档转换为 PCL,然后获取生成的 PCL 并在其前面添加

@PJL SET KJOBMANAGERCODE="[project code here]"

然后我们将生成的文件写入打印机假脱机,打印机将在其中处理它并启动每个作业。

感谢大家的帮助。每个答案都极大地启发了我们实施计划的某个部分。

【问题讨论】:

  • 我们是否应该假设作业统计功能由打印机驱动程序提供,并且没有可用的公共 API?
  • 是的,这个提示是由驱动程序直接强制执行的,但我想传递这个信息的通信规范可能是企业打印机之间的标准。虽然不确定,但提示本身直接来自驱动程序。
  • 请添加一些屏幕截图以显示标准打印过程。

标签: php network-printers


【解决方案1】:

我会做的是:

  • 创建一个 C++/VB 脚本,这将完成艰苦的工作(对不起,我没有帮助)
    • 使其查看作业目录/接受 CLI 参数
  • 让服务器 PHP 将文件和一些信息一起保存到某个目录中
    • 说保存一个 1.txt(数字是你的内部计数器,需要是唯一的,每个新的都必须比以前的大)文件到 /path/infos 里面有这样的东西:1 c:\temp\ filetoprint.docx
  • VB 脚本将查看该目录并读取第一个文件(编号最小的文件)
    • 并看到它用于 Job Accounting ID = 1
    • 要打印的文件在 c:\temp\filetoprint.docx 中
    • 并打印出来 :)
    • 删除文件(!重要)

现在一切都取决于您的 VB/C++ 编程技能 :) 顺便说一句:另一种选择是将文件保存到目录而不是您可以使用 exec() 和 VBScript/C++ 的 CLI 参数。但是基于文件的解决方案更健壮,因为它是一种自然队列,并且它还可以抵抗打印程序故障 - 作业只有在完成时才会被删除。如果打印作业失败,它将在下一次尝试。可以使用数据库对文件进行类比,但我不确定从 VB/C++ 连接到数据库有多容易,因此文件系统是最好的后备方案;)

PHP 部分只有一个脚本链接,该脚本会将 JA ID 和文件名保存到 /path/infos/ 中的文件中

这是一种变通解决方案,但我认为在纯 PHP(使用 PHP 扩展)中这样做是不值得的。

【讨论】:

  • 我将与我的团队一起审查它以确定其可行性。
【解决方案2】:

“作业记帐”只是对用户名/密码提示进行品牌重塑的驱动程序。

如果您提到您用于托管 PHP 的操作系统以及您的用户在哪里体验这些提示,那将会很有帮助 - 但我认为很明显您同时使用 MSWindows。

简短的回答是您需要绕过对话框 - 该对话框(当前)内置于您的打印机驱动程序中)。可以配置打印机驱动程序,或者您可以使用替代打印子系统,例如Cups

【讨论】:

  • 在做更多研究之后(例如,在测试文件上“打印到文件”),结果证明会计参数在 PJL 中是这样传递的:@PJL SET KJOBMANAGERCODE="10017" 其中 10017 是我选择的项目的项目代码。
【解决方案3】:

如果你想让它使用 PHP,传递 PJL 参数(会计所需)并不容易实现(当然是 AFAIK)。但是您可以使用套接字连接来传递您喜欢的任何参数,以及要打印的文档。示例:

> @PJL INFO ID
@PJL INFO ID
"LASERJET 4000"
> @PJL INFO STATUS
@PJL INFO STATUS
CODE=10001
DISPLAY="Ready"
ONLINE=TRUE
> @PJL INFO PAGECOUNT
@PJL INFO PAGECOUNT
536225
> @PJL INFO MEMORY
@PJL INFO MEMORY
TOTAL=2526160
LARGEST=1204208

以上示例来自IronGeek Blog,他有一篇有趣的介绍性文章,介绍了如何编写您自己的连接以控制网络打印机。但是,我会首先在打印作业上嗅探您的计算机和网络打印机之间发送的流量,以更好地了解所涉及的确切命令 - 这应该可以通过 PHP 上的套接字连接轻松实现该协议。

【讨论】:

  • 难道我不能使用基于 CLI 的 EXE(通过 php 中的 exec() 调用)来生成带有 PCL 的 .PRN 文件(PRN 底部的二进制哈希,如下PJL 参数),然后使用 PHP 在文件顶部写入 PJL 参数。然后将那个 PRN 文件写入打印机队列?
  • 是的,这可能是可能的。你可以例如根据您的流量嗅探编写标题模板,并将常用变量替换为真实变量。这比实现一个完整的 PJL-API 更容易,这对于您的问题案例来说是多余的。很遗憾,我没有合适的打印机设置,所以我无法为您提供更多帮助。
【解决方案4】:

我的团队决定实现代码,调用可执行文件将每个文档转换为 PCL,然后获取生成的 PCL 并在其前面添加

@PJL SET KJOBMANAGERCODE="[此处的项目代码]"

然后我们将生成的文件写入打印机假脱机,打印机将在其中处理它并启动每个作业。

感谢大家的帮助。每个答案都极大地启发了我们实施计划的某个部分。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2017-04-21
    • 1970-01-01
    • 1970-01-01
    • 2023-03-13
    • 2012-05-28
    相关资源
    最近更新 更多