由于 OP 不喜欢我的(或任何其他)原始答案足以接受它,他同时甚至授予了赏金。
让我尝试添加原始答案中可能缺少的任何内容。
“在过去,有两种主要类型的打印机:理解 HPGL 的 HP 打印机和 Postscript 打印机。”
即使在过去,也有更多类型的打印机,或者更确切地说:页面描述语言...但 PCL、HP/GL 和 PostScript 可能对大多数人来说是最重要的处理印刷技术。
“因此,您可以使用这两种语言中的任何一种发送打印件,打印机会将您的代码转换为页面上的点。”
不,这并非在所有情况下都有效。
这仅在打印机理解两种这两种语言时才有效(一些更昂贵的 HP 型号可以做到这一点)。
某些打印机型号(即使在过去)仅支持 HP/GL。有些人只了解 PCL 的特定版本(PCL、FWIW 是一个完整的打印机语言系列,由大约十几个成员组成:还有一些较新的成员与老一代几乎没有任何遗传共同点——除了惠普营销部门选择称他们为 PCL6 或 PCL XL)。
“那么,现代打印机是如何工作的?我仍然可以将 HPGL/PCL 发送到打印机”
是的,这仍然是一样的:
- 如果您的“现代打印机”理解 HP/GL,您可以向其发送 HP/GL 数据。
- 如果它理解 PCL,您可以发送 PCL。
- 如果它理解 PostScript,您可以发送 PostScript。
- 如果它理解 PDF,您可以发送 PDF。
- 如果它理解
XPS(听说过这个?!?),您可以发送 XPS。
- 但是,如果它只理解 PCL3(好吧,那么它无论如何都不是现代打印机 :),您无法发送 PCL6e...
如果设备能够理解这些语言的任意组合,那么您可以随意发送它能够理解的任何内容。
"现在,据我了解,PDF 格式类似于 Postscript,但它不是 Postscript 之类的语言,只能包含“对象”。因此,例如,在 Postscript 中,您可以创建一个循环并说“打印这个圆圈 50,000 次”,移动它的确切位置。在 PDF 中,我的理解是你不能这样做“
你说得对,PDF(与 PostScript 不同)不是一种编程语言。这是一个设计决定,PDF 不应该理解循环或条件结构(而 PostScript 可以 - PostScript 甚至是 Turing-complete 作为一种编程语言,这意味着:任何可编程的东西 ,可以写成 PostScript 程序)。
所以,虽然您仍然可以将一个圆(甚至是一个非常复杂的图形对象)定义为 PDF 对象一次:
- 您无法通过一个非常短的编程语句来表达一个长循环,告诉渲染器在每次迭代期间显示此对象。
- 相反,您必须单独手动声明每个迭代(然后您可以调用显示预渲染的对象)。
但是您说“PDF 格式...类似于 Postscript”时是不对的。它不是。 PDF 源自与 PostScript 最初建立的相同图形模型。但仅此而已。
运算符的 PDF 关键字不同。典型 PDF 的结构与 PostScript 完全不同。
最重要的是,PDF 扩展了它从 PostScript 继承的图形模型(另外,它为典型的电子文档添加了一些其他方面)。它向几个方向发展:
- 随着时间的推移,它引入了更多的色彩空间。
- 它支持更多的字体类型。
- 它为所有绘制的对象实现了'透明度'功能。
- 它提出了“层”(“可选内容组”,OCG,PDF 用语)的概念。
- 它引入了交互式元素(按钮、链接、超链接、表单域)。
- 它支持更多不同的压缩方案。
- 它可以利用更丰富的文档元数据集。
- 它引入了 ICC 颜色配置文件和全面的 ICC 颜色管理。
- ...还有更多内容。
“现在所有打印机都在 Postscript 上标准化了吗?”
没有。
如果有的话,与 PostScript 相比,更现代的打印机更喜欢 PDF(虽然他们仍然可能保留 PostScript 处理功能作为后备选项)。但最好询问您的供应商,或研究他们的营销手册。
“如果是这样,这是否意味着我最好的选择是生成 Postscript,然后将其发送到打印机?”
无论如何,这从来没有是你最好的选择,即使在“过去”也不是!
毕竟,在大多数情况下,打印比一页更复杂的作业不仅涉及询问份数,还涉及...
- ...您还想选择分页器尺寸,甚至可以为首页选择一个特定的纸盘(带有刊头信或蓝色封面纸),另一个纸盘用于页面主体,第三个纸盘用于最后一张;
- ...您想告诉设备装订每组,或在每张纸上打孔;
- ...您想对一些工作进行对折和骑马订,以完成小册子,
- ...还有什么。
这些作业功能不一定由“原始 PostScript”控制。要控制大多数 PostScript 打印机型号的特定打印作业选项,您有两种方法:
-
将 PostScript sn-ps 的 << ...vendor-specific or generic PS-code...>> setpagedevice 语句插入到作业数据流中,无论是在文档级别还是在单个页面级别。
PPD(PostScript 打印机说明的缩写)中定义了特定打印机型号执行特定功能所需的特定 setpagedevice相应 PostScript 打印机驱动程序的文件。这个.ppd 文件必须由各自的供应商连同其打印机驱动程序一起提供。 PPD 是一种文件格式 specification defined by Adobe。在某种程度上,它扩展了 PostScript 语言,并允许供应商在涉及复杂的作业设置时“发明”他们自己的功能。
使用 PJL(Printer Job Language 的缩写)标题为实际打印数据(作为 PostScript 发送)添加前缀,由几个(或多个)组成到几十)行来调用特定的工作特征。
PJL 最初由 HP 发明并用于 PCL,但很快就被其他供应商采用为其他打印机语言。所以现在你可以为大多数可以打印 PostScript、PCLxx、HP/GL 或 PDF 的打印机使用 PJL 标题行,因为大多数供应商都支持它。在这种情况下,最后的 PJL 行告诉打印机真正的作业数据是什么语言:PostScript、PCLxxx、PDF、HP/GL 等等……通过如下语句:
ESC%-12345X@PJL ENTER LANGUAGE = PostScript
“如果我发送 Postscript,我是否必须以某种方式告诉打印机它是 Postscript?”
如果您使用 PJL 标题预先修复您的工作,请参阅上面的最后一段。
对于纯 PostScript 打印机,您可能更愿意使用 <<..>>setpagedevice 语句。而且这样的打印机会自动理解 PostScript...
如果您列出您拥有的打印机型号也会有所帮助。
“在 Windows 中,我知道“标准”打印方式,即查询设备功能并请求设备上下文,然后您可以在该上下文上使用 Windows 调用绘制线条、形状和文本。”
这实际上是它的工作原理也适用于 Windows 上的 PostScript 打印机(嗯,自 Windows 8 以来基于 XPS or OXPS 的较新打印工作流程有点不同.. .)。通常,“设备能力”为相应的打印机驱动程序所知并由相应的打印机驱动程序托管。当您完成“使用 Windows 调用绘制线条、形状和文本”时,驱动程序会将这些调用转换为 PostScript 并将其发送到打印机。
这与它在 Linux、Unix 或 Mac OS X 上的工作方式不同:
在 Linux(和 Unix)上,每个应用程序都必须生成它自己想要发送到打印机的 PostScript 页面描述。没有“驱动程序”可以帮助做到这一点。如果最终目标打印机不支持 PostScript,CUPS 将自动将其从收到的 PostScript 转换为供应商或型号特定的页面描述格式。 (一些应用程序可能能够生成其中一种 PCL 语言。)
在 Mac OS X 上,应用程序通常将 PDF 生成为打印假脱机格式(CUPS 会根据供应商的打印机驱动程序自动将此文件转换为不同的打印机语言,该驱动程序通常包括 pdf-to-someting CUPS 过滤器根据需要)。
“但是,与 Postscript(或 HPGL/PCL)相比,这显然是极其原始的。”
我不明白你为什么要在这种情况下将其描述为“极其原始”。
“有没有一种方法可以直接与打印机驱动程序通信,或者告诉 Windows:'这是我的 Postscript 代码,请将其传递给打印机进行打印'?”
正如我之前所说:在 Windows 上,如果应用程序想要打印到 PostScript 打印机,它通常不会自己生成其 PostScript 代码[^1],它也不会生成任何其他特定于打印机的格式化本身(最终设备是 XPS 打印机除外)。通常,它会生成 EMF 作为假脱机格式,并让打印子系统(和打印机驱动程序)处理可能需要的任何转换。
或者你是说:“我有这个现成的 PostScript 文件(在别处生成),我想打印到 PostScript 打印机?” 如果是这样,那么只需运行类似 @987654343 的命令@ 来自 DOS 框。
话虽如此 -- 是的,您至少可以采用两种非打印机驱动程序的方式来查询您的打印设备:
-
SNMP。如果您的设备有网络(以太网/wifi)接口并且理解简单网络管理协议,您可以通过这个渠道查询它,并获得您提出的任何 SNMP 类型问题的返回答案。用简单的语言(SNMP 用语看起来有点不同):
- 您目前的墨水量是多少?
- 您可以处理的最大媒体尺寸是多少?
- 你有多少个纸盘?
- 托盘 1 的填充量是多少?
- 您在现场打印了多少页?自上次启动以来有多少次?
- 您可以处理哪些打印机语言?
- 您支持哪种打印数据传输协议? HPJetDirect/AppSocket? LPR/LPD? IPP?
- 您有可用的硬盘空间吗?
- 你有多少内存?
- 您目前还连接了哪些其他打印客户端?
- ...等等。
PJL 查询。也可以通过向打印机发送几行简单的PJL 语句(并评估响应)来检索上述某些信息。
IPP 查询。 Internet 打印协议 还支持查询设备功能(如果设备可以与 IPP 通信)。
再说一遍:“有什么方法可以告诉 Windows:'这是我的 Postscript 代码,请将其传递给打印机打印'?”
您甚至可以完全绕过 Windows 并使用 netcat.exe 实用程序(有时也称为 nc.exe)将作业文件发送到打印机:
-
将 PostScript 作业发送到在 TCP 端口 9100 上等待传入作业的网络打印机:
cat filename.ps | netcat.exe -h printer-ip-address-or-hostname -p 9100
对于 PCL 或任何格式的作业当然也是如此……如果打印机知道这种格式。您需要解决哪个确切的 TCP 端口取决于您的特定型号(在手册中查找)。如何为打印机创建 PostScript、PCL 或任何文件取决于您。
[^1] ...除了一些像 Acrobat 这样的 Adobe 程序,它们确实可以生成自己的 PostScript。