用JavaScript和插件进行沉默的PDF打印

496 阅读6分钟

今天,我将向你介绍我刚刚创建的一个插件。这是一个 默默地打印PDF文件的插件,也就是说,不要求用户确认

这个插件暴露了一个REST API,这样就 可以使用JavaScript 在不确认的情况下打印一个PDF。只要向插件路径发出HTTP GET请求,发送PDF的名称打印机的名称

最棒的是,你可以使用Windows提供的虚拟打印机,这样你就可以以生态的方式进行测试。

在这篇文章中,我将向你展示该插件的文档和它的所有细节,包括你如何获得它。

使用该插件

只要你想打印,该插件就应该在后台运行。你可以手动运行它或 把它放在Windows的启动程序中文件夹来自动启动。

顺便说一下,这个默默打印PDF的插件不会在窗口中运行,它会被隐藏。要停止它,请到任务管理器中去。

然而,有时可能会根据操作打开一个弹出窗口或临时窗口(例如,如果指示的PDF不存在)。

关于PDFToPrinter

在插件的同一位置,必须存在名为PDFtoPrinter.exe 的文件,对此没有其他选择。

这个文件不是我的,所以我不能分发它。但在我看来,你可以完全免费地下载它,正如我在关于从命令行打印PDF的帖子中指出的那样。

打印机

任何出现在Windows控制面板中的打印机都能够被这个插件使用,只要确保你正确输入它们的名字。

事实上,这个插件可以打印到墨水、碳粉、热敏打印机(POS)甚至是虚拟打印机

文件名

在我要放的例子中,我将假设PDF文件被称为ticket.pdf 。让我们来看看第一种情况。

如果PDF与插件在同一位置

如果可执行的插件和PDF在同一个目录(文件夹)下,你必须只向API发送文件的名称。例如,在这种情况下,它将是ticket.pdf

如果PDF是在另一个地方

如果是在与插件不同的目录下,或者你喜欢绝对路径,你可以毫无问题地指出该路径。例如,我的桌面上有ticket.pdf ,所以全路径是。

C:\Users\Luis Cabrera Benito\Desktop\ticket.pdf

通过这种方式,你可以打印PDF,无论其位置如何,只要插件可以访问它。我的意思是,该PDF必须与该插件在同一台电脑上。

API文档

这个插件在localhost:8080 ,并暴露了两个路径;一个是打印本地PDF,一个是打印远程PDF

根路径是请求打印PDF文档的地方,在URL中指明以下参数。

  1. impresora: 打印机的名称,因为它出现在控制面板上
  2. nombrePdf:PDF文件的绝对路径或名称。如果它不存在,将显示一个弹出窗口。

例如,要在ZJ58 打印机上打印一个名为ticket.pdf 的PDF,我将向以下URL发出GET请求。

http://localhost:8080/?nombrePdf=ticket.pdf&impresora=ZJ58

正如我前面指出的,如果我想打印一个在其他地方的PDF,我会用这样的GET请求来做。

http://localhost:8080/?nombrePdf=C:\\Users\\Luis%20Cabrera%20Benito\\Desktop\\ticket.pdf&impresora=ZJ58

注意,PDF的位置有空格,但我用实体%20 。这可以在下面的函数中用JavaScript完成。

Gist上查看代码。

还要考虑到路径必须有对角线\ ,所以如果你想在语言中表示路径,你必须用它本身转义,也就是像这样:\\ 。你会在例子中更好地理解它。

顺便说一下,如果一切顺利,API将返回一个200响应代码。如果有错误,则返回500代码(如果有错误,将在响应体中出现)。

我想澄清的是,即使API返回200响应,如果打印机不存在或有一些内部错误,这将不会被报告。最常见的情况是打印机不存在;其他情况都在控制范围内。

通过URL从互联网打印远程PDF

正如你所注意到的,到此为止,我已经教你如何打印本地的PDF。但你可以打印你的主机上或互联网网站上的PDF。

例如,要从互联网上打印一个在https://parzibyte.github.io/cv/assets/cv_LuisCabreraBenito.pdf ,在Microsoft Print to PDF 打印机上的PDF,我将向以下URL发出GET请求。

http://localhost:8080/url?impresora=Microsoft%20Print%20to%20PDF&urlPdf=https://parzibyte.github.io/cv/assets/cv\_LuisCabreraBenito.pdf

请注意,现在的请求是向localhost:8080/url ,因为当它向localhost:8080/ ,是为了打印一个本地的PDF。参数是impresora ,表示打印机的名称,urlPdf ,表示要打印的PDF的URL。

再举一个例子,如果我想在POS58 打印机上打印localhost/archivos/mi_pdf.pdf 中的PDF,我将向以下URL提出请求。

http://localhost:8080/url?impresora=POS58&urlPdf=localhost/archivos/mi\_pdf.pdf

**重要提示:**从云端默默地打印PDF的网站或域并不重要。

唯一重要的是它是公开的(任何访问该URL的人都可以访问它),因为在内部,该插件将下载它,然后打印它;所有这些都是以沉默的方式。

获得该插件 - 下载

该插件不是开源的,也不是免费的;它的成本是25美元。如果你想得到它,请给我留言

目前,它只与Windows兼容。显然,如果你没有这个插件,下面的例子就不能用,但一旦你有了它在后台运行,你就可以测试它们。

例子

我将开始解释这些例子。记住,你可以从这个链接中尝试它们,并在这个链接中看到资源库的源代码。

例子1

让我们来看看第一个例子。在这个例子中,我们假设PDF文件(ticketx.pdf)与插件在同一目录下。代码看起来是这样的。

Gist上查看该代码。

我们在第50行发出请求,并在第51行处理响应。

例2:用户提供的值

如果你想让用户能够指明打印机和PDF的名称或路径等值,你可以这样做,这里有一个例子。

Gist上查看该代码。

示例3:PDF的绝对路径

如果你想用绝对路径来表示PDF的名称(万一它和插件不在同一个目录下),那么记住要转义反斜杠。这里有一个例子。

Gist上查看代码。

我提到的序列转义是在第47行,请注意,由于Windows的路径是用\ ,我必须用\\ 转义这个字符。另外,我还使用了替换空格的功能,因为我的路径中有空格。

例子4:从URL打印PDF

这里我向你展示一个通过URL打印PDF的例子。

Gist上查看该代码。

总结

简而言之,只要下载PDFtoPrinter.exe 文件,联系我获得插件,把两个文件放在同一个目录下,然后运行插件,可以在启动Windows时运行,也可以手动运行。

有了这些例子和API,就足以理解它是如何工作的了,但我也在YouTube上给你留了一段视频。

顺便说一下,我还有另一个插件可以打印到POS热敏打印机上。

The postSilent PDF Print with JavaScript and pluginappeared first onParzibyte's blog.