【问题标题】:Bulk print in javascript/php?在 javascript/php 中批量打印?
【发布时间】:2013-12-12 19:16:00
【问题描述】:

有没有办法在 javascript/php 中实现批量/批量打印?我在网上搜索,找到的大部分答案都是.netjava。我需要一次排队大约 600 个文档。我找到了PECL printer library,但文档说它是only available under Windows 9.x, ME, NT4 and 2000PECL library 在 linux 服务器下工作吗?使用 PECL 库好还是有其他选择?

【问题讨论】:

  • 您正在查看的扩展名为“打印机”。 PECL 是您可以从中获取它的站点的名称……如果该扩展的稳定版本曾经发布过。从来没有,而且图书馆在五年多的时间里没有得到积极的发展。
  • 您在哪里打印?服务器?客户端?你在打印什么?
  • @Brad 我需要在客户端打印几个文档。这些文档是动态创建的,并且将采用不同的格式。我需要一次对所有文档进行排队,并且客户端还应该能够控制打印机属性,例如打印机、页数等。

标签: javascript php printing


【解决方案1】:

在 Windows 中控制打印机并不是一件大事,因为我们有许多可用的 win32api,或者可以创建入口点来动态打印。由于 PHP 是服务器端,JavaScript 是客户端脚本语言。

在我看来,未经许可/通知在客户端进行批量打印/打印是不可能的。因此,用户必须授权打印作业。

开发人员在 Linux 下打印的经验较少。即使我知道的不多,但我知道一种方法。我从未尝试过或做过。在 PHP 下没有任何内置的打印/控制功能。 PHP 下也没有类似的扩展可以这样做。但是在 Linux 下有一个命令称为 LPR(行式打印机守护协议),如果在 PHP 下授权 shell_exec 执行 shell 命令,则可以在 PHP 下使用该命令进行打印。命令如下:

shell_exec("lpr -P 'printer' -r 'filename.txt');

您必须通过RFC Protocol 进行 LPR。您必须为 Daemon 创建抽象层来控制和发送打印命令。 here 提供了一个创建守护进程的好例子。

经过这些事情,你就可以在Linux下通过PHP打印文档了。

其他问题

想通过网站/本地主机进行客户端打印

小答案

不,您不能在未经用户许可的情况下直接控制客户端打印机,这也取决于每个会话。所以,如果你想获得访问权是另一个会话,你必须再次获得用户的权限。

长答案

是的,它可以通过许多调整和在某些条件下进行控制。由于大多数用户使用窗口作为相应的答案。但是要了解它的工作原理,您必须了解打印对话框的内部结构。

打印对话框分为两部分。一个是 Windows API,另一个是打印机驱动程序。 Windows API 是由作为 Windows 操作系统的一部分的各种 DLL(动态链接库)保存的一组通用代码。 Windows API 提供了一个允许所有程序都可以使用的通用干扰,它允许所有程序访问同一组打印机驱动程序,而不是打印机制造商必须创建驱动程序软件。

打印机驱动程序以不同的语言创建,它们控制硬件的不同部分以将指令发送到打印机。控制流程的主要打印机驱动程序是PCL5和PostScript等,打印机驱动程序更改特定打印机理解的自定义标记语言。

所以,基本上我们需要直接访问 DLL,并且通过现代浏览器(Chrome、Firefox 等)这是不可能的,但一个浏览器可以提供访问,即 Internet Explorer,它是 Windows 操作系统本身的一部分。

因此,第一个条件是用户必须使用 Internet Explorer 并且我不知道通过其他方式访问。接下来要直接访问可以通过 ActiveX 控件完成的 API。原则上它不依赖于 Microsoft Windows,但实际上,大多数 ActiveX 控件都需要 Microsoft Windows 或 Windows 模拟器。大多数还要求客户端在 Intel x86 硬件上运行,因为它们包含已编译的代码

因此,只能通过用户提示访问 ActiveX 控件。因此,用户必须手动更改控件,或者用户必须再次提供对网页的访问权限。如果更改设置,则对计算机有很大的危险,因为它提供对计算机硬件和其他组件的访问。计算机很容易被黑客入侵。因此,您必须非常谨慎地使用它。因此,第三个条件是直接访问 ActiveX 控件

我用过ScriptX,免费版可以设置一些基本参数,见下例:

<!-- MeadCo ScriptX -->
<object id=factory style="display:none"
  classid="clsid:1663ed61-23eb-11d2-b92f-008048fdd814"
  codebase="http://[your path here]/smsx.cab#Version=7.0.0.8 ">
</object>


<script>
  function printWindow() {
    factory.printing.header = "This is MeadCo";
    factory.printing.footer = "Printing by ScriptX";
    factory.printing.portrait = false;
    factory.printing.leftMargin = 1.0;
    factory.printing.topMargin = 1.0;
    factory.printing.rightMargin = 1.0;
    factory.printing.bottomMargin = 1.0;
    factory.printing.Print(false);
  }
</script>

我已经提供了方法,你必须按照你的要求去做。我再一次告诉你,请不要更改 ActiveX 的设置以启用,这对用户造成了很大的威胁。机器很容易被黑客入侵,并对计算机中可用的信息构成极大威胁。

【讨论】:

  • 感谢您的回答@Vineet1982,+1。我需要执行客户端打印。我能做到吗?我可以控制打印机属性吗?
  • @Console 提供您对查询的回复
  • 感谢您提供非常好的解释,但我真的在寻找 Linux 服务器的答案。我会为你提供赏金,因为它帮助了我,并且将来一定会帮助其他人。
  • @Console 你想说批量打印客户端使用 linux 而不是 windows
【解决方案2】:

PECL printer library 用于服务器端打印。您必须将打印机连接到运行脚本的服务器。

如果您的客户需要打印,您不能使用它。您不能单独使用 JS 进行“打印机排队”。如果您仅限于使用浏览器,最好的方法是将您要打印的所有页面加载到一个带有适当 CSS 分页符的 HTML 页面中。但请注意,可能存在浏览器性能问题,具体取决于该页面的大小。

您可以做的另一件事是在内部将该 HTML 转换为 PDF,然后允许客户端打印它。这不允许排队,但可以达到目的。

【讨论】:

  • 感谢您帮助我@KPL,+1。但是,如果客户必须一次打印大约 600 个文档,该解决方案是否可行?
  • 是的,您可以使用它打印尽可能多的页面。我首选的方法是将 HTML 转换为 PDF,然后允许客户端打印。您可以使用 wkhtmltopdf (code.google.com/p/wkhtmltopdf‎) 之类的东西进行转换。
【解决方案3】:

为什么不使用 css page-break-before 告诉浏览器内容应该在一个新页面中,并根据需要多次克隆元素

例如

.page
{
    page-break-before: always;
}
<div class="page">
  something to be printed in a whole page
</div>

<div class="page">
  something to be printed in a whole page
</div>

<div class="page">
  something to be printed in a whole page
</div>

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2010-09-26
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多