如何将数据发送到现代打印机?PDF,PostScript,HPGL等

Tyl*_*den 10 windows printing pdf postscript

我正在尝试理解我使用打印机以编程方式进行通信的选项,以便从应用程序软件中打印出来.换句话说,当用户告诉我的应用程序他们想要打印某些内容时会发生什么.我理解它在"旧时代"的运作方式,并试图了解更复杂的现代世界.

在过去,有两种主要类型的打印机:HP打印机,它们了解HPGL和Postscript打印机.因此,您可以使用这两种语言之一发送打印件,打印机会将您的代码转换为页面上的点.您还可以将位图嵌入为二进制数据.例如,在HPGL(或PCL)中,您可以给出一个基本上说"请打印此位图,这里是栅格数据"的命令,然后是一个巨大的二进制数据块.显然,如果你这样做,进入打印机的数据量会更多,并且可能会阻塞打印机.Postscript具有相同的能力.如果您打印文本,您可以告诉打印机在字体TimesNewRoman(或其他)中打印文本"xyz",打印机将为您计算所有点(这意味着打印机必须知道字体,

现在,据我所知,PDF格式与Postscript类似,但它不是像Postscript这样的语言,只能包含"对象".因此,例如,在Postscript中,您可以制作一个循环并说"打印此圆圈50,000次",移动其确切位置.在PDF中,我的理解是你不能这样做,你必须将每个圆圈指定为一个单独的"对象".

那么,现代打印机如何工作?我还可以将HPGL/PCL发送到打印机吗?所有打印机现在都标准化了Postscript吗?如果是这样,这是否意味着我最好的选择是生成Postscript,然后将原始数据发送到打印机?如果我发送Postscript,我是否必须以某种方式告诉打印机它是Postscript?

在Windows中,我知道打印的"标准"方式,即查询设备功能和请求设备上下文,然后您可以使用该上下文的Windows调用绘制线条,形状和文本.然而,与Postscript(或HPGL/PCL)相比,这显然非常原始.有没有办法可以直接与打印机驱动程序通信,或者告诉Windows:"这是我的Postscript代码,请将其传递给打印机进行打印"?

Kur*_*fle 14

"所以,例如,在Postscript中你可以制作一个循环并说"打印这个圆圈50,000次",移动它的确切位置.在PDF中,我的理解是你不能这样做,你必须将每个圆圈指定为一个单独的"对象".

实际上,事实是你所描述的两个极端之间的中间地带.

  1. 这是真的:与PostScript不同,PDF不是一种编程语言(更不用说图灵完整版),而且你不能定义"循环".

  2. 而且,你必须指定每圈(或嵌入图像或其他图形对象)分开.您可以很好地定义如何绘制圆(或图像,或其他)一次,然后在页面的其他位置或PDF文档中重复使用该定义.这称为"引用对象".当重新使用对象,则可以通过改变一些当前的"ENVIROMENTAL"定义(如设置其属性不同的(颜色,缩放,旋转)的不同图形状态,其包括CTM,所述当前变换矩阵).


关于你的其他一些观点:

  • 不,从来没有只有两种类型的打印机,HPGL和PostScript.

  • 即使在过去,也有十几种不同的'打印机语言'.PCL甚至比HPGL更受欢迎.不要忘记不同打印机语言的所有专有发明.听说过的AFP,高级功能打印?这种语言印刷 - 仍然打印! - 比PostScript更多的纸张.它不再是专有的,但它是由IBM发明的用于主​​机打印laaaarge可变数据的运行,主要用于计费目的......曾经听说过ESC/P?KPDL?XPS?

  • 是的,您仍然可以将HPGL发送到打印机 - 但不是每台打印机.始终可以为至少一种您能够生成和发送的语言授予打印机权限.

  • 是的,现在有打印机型号可以直接使用PDF.但它们仍然不是主要类型.他们中的一些人"作弊"并且仍然将主要的内置解释器作为PostScript引擎:这些引用PDF并首先将其静默转换为PostScript.其他人可以处理PDF而无需后退到PostScript.


"在Windows中,我知道打印的"标准"方式,即查询设备功能并请求设备上下文,然后您可以在该上下文中使用Windows调用绘制线条,形状和文本.

不要认为术语"设备上下文"确实意味着Windows直接与打印机硬件通信以查询功能并请求设备上下文.有时它会,有时不会.它总是依赖于一些称为"打印机驱动程序"的软件(它还控制打印数据的打印机语言应该转换为).打印机驱动程序可能能够查询设备并询问"您是否有双工器单元?您有装订设备吗?" 然后为作业生成所需的设备上下文.

只有一种非常现代的方法,由' 打印机工作组 '开发的IPP Everywhere,将能够摆脱大多数特定型号的打印机驱动程序必须做的事情,并将开始主要依赖于直接询问在"无人驾驶"确定要传递给物理设备的确切打印数据之前的设备.

但IPP Everywhere尚未广泛流行,既不是供应商,也不是管理员,也不是用户.但是,一旦PC被遗忘,95%的计算设备将超级移动......


Kur*_*fle 12

由于OP不喜欢我(或任何其他)原始答案,因此他甚至可以获得赏金.

让我尝试添加原始答案中可能缺少的内容.


"在过去,有两种主要类型的打印机:HP打印机,它们了解HPGL和Postscript打印机."

即使在过去,也有更多类型的打印机,或者更确切地说:页面描述语言 ......但PCL,HP/GL和PostScript对于大多数处理打印技术的人来说可能是最重要的.

"因此,您可以使用这两种语言中的任何一种发送打印件,打印机会将您的代码转换为页面上的点."

不,这在所有情况下都不起作用.

这仅适用于打印机了解两种语言(某些更昂贵的HP型号)的情况.

有些打印机型号(即使在过去)也只能理解HP/GL.有些人只了解特定版本PCL(PCL,FWIW,是一个完整的打印机语言系列,由十几个成员组成:而且一些新版本与旧版本几乎没有任何遗传共同点 - 除了HP营销选择称他们为PCL6PCL 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是连图灵完备的编程语言,意思是:任何可编程可言,可以写为PostScript程序).

因此,虽然您仍然只能将一个圆(或甚至一个非常复杂的图形对象)定义为PDF对象:

  • 您无法通过非常短的编程语句表达长循环,告诉渲染器在每次迭代期间显示此对象.
  • 相反,您必须单独手动声明每个迭代(然后您可以调用预渲染对象).

但在陈述"PDF格式......与Postscript类似"时,你是不对的.它不是.PDF源自PostScript最初建立的相同图形模型.但那是关于它的.

运营商的PDF关键字不同.典型PDF的结构与PostScript完全不同.

最重要的是,PDF扩展了它从PostScript继承的图形模型(此外,它为典型的电子文档添加了一些其他方面).它在几个方向发展:

  • 随着时间的推移,它引入了更多色彩空间
  • 它支持更多字体类型.
  • 它为所有绘制的对象实现了"透明度"功能.
  • 它提出了"层"的概念("可选内容组",OCG,用PDF说法).
  • 它引入了交互式元素(按钮,链接,超链接,表单域).
  • 它支持更多不同的压缩方案.
  • 它可以使用更丰富的文档元数据集.
  • 它引入了ICC颜色配置文件和完整的ICC颜色管理.
  • ......还有一些.

"所有打印机现在都标准化了Postscript吗?"

没有.

如果有的话,那么更现代的打印机更喜欢PDF而不是PostScript(虽然它们仍然可以保留PostScript处理功能作为后备选项).但最好询问您的供应商,或研究他们的营销手册.

"如果是这样,这是否意味着我最好的选择是生成Postscript,然后将原始数据发送到打印机? "

无论如何,这从来都不是你最好的选择,即使在"旧时代"也是如此!

毕竟,在大多数情况下,打印一个比单一页面更复杂的作业不仅涉及要求副本数量,而且......

  • ...您还想选择寻呼机尺寸,甚至可以选择第一页的特定托盘(带有标头字母或蓝色封面纸),另一个用于主页的托盘和用于最后一页的第三个托盘;
  • ...你想告诉设备装订每一套,或者在每张纸上打孔;
  • ...你想把中心折叠和马鞍缝合一些工作,以获得完成的小册子,
  • ......什么不是.

这些工作功能不一定由"原始PostScript"控制.要使用大多数PostScript打印机型号控制特定的打印作业选项,您有两种方法:

  1. << ...vendor-specific or generic PS-code...>> setpagedevice将PostScript代码段的语句插入到作业数据流中,无论是在文档还是在单个页面级别上.

    什么特定setpagedevice需要用于特定的功能,以通过特定的打印机型号来执行在定义PPD(短为PostScript打印机描述各个PostScript打印机驱动程序的)文件.该.ppd文件必须由相应的供应商与其打印机驱动程序一起提供.PPD是Adobe定义的文件格式规范.在某种程度上,它扩展了PostScript语言,并允许供应商在复杂的作业设置中"发明"自己的功能.

  2. 使用PJL(打印机作业语言的简称)标题前缀实际打印数据(以PostScript形式发送),该标题包含几行(或多达几十行)以调用特定的作业功能.

PJL最初由HP发明并用于PCL,但很快被其他供应商用于其他打印机语言.因此,现在您可以将PJL标题行用于大多数可以打印PostScript,PCLxx,HP/GL或PDF的打印机,因为它通常得到大多数供应商的支持.在这种情况下,最后一条PJL线告诉打印机真正的作业数据是什么语言:PostScript,PCLxxx,PDF,HP/GL,等等...通过如下声明:

    ESC%-12345X@PJL ENTER LANGUAGE = PostScript 
Run Code Online (Sandbox Code Playgroud)

"如果我发送Postscript,我是否必须以某种方式告诉打印机它是Postscript?"

如果您使用PJL标头预先修复作业,请参阅上面的最后一段.

对于纯PostScript打印机,您可能更喜欢使用<<..>>setpagedevice语句.这样的打印机会自动了解PostScript ...

如果您列出了处置中的打印机型号,也会有所帮助.

"在Windows中,我知道'标准'打印方式,即查询设备功能并请求设备上下文,然后您可以在该上下文中使用Windows调用绘制线条,形状和文本."

这实际上它也适用于Windows 上的PostScript打印机(嗯,自Windows 8以来更新XPSOXPS基于打印的工作流程有点不同......).通常,"设备能力"由相应的打印机驱动程序知道并托管.完成"使用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打印机?" 如果是这样,那么只需lpr -S remoteserver -P printername "-o l" jobfile.ps从DOS框中运行命令即可.

话虽如此 - 是的,您可以使用至少两种非打印机驱动程序来查询打印设备:

  1. SNMP.如果您的设备具有网络(以太网/ wifi)接口并且了解简单网络管理协议,您可以通过此通道进行查询,并获得您所询问的任何SNMP类型问题的返回答案.用简单的语言(SNMP用语看起来有点不同):

    • 你目前的墨水量是多少?
    • 您可以处理的最大媒体大小是多少?
    • 你有多少个纸盘?
    • 托盘1的填充水平是多少?
    • 你在现场打印了多少页?自上次启动以来有多少?
    • 您可以处理哪种打印机语言?
    • 您支持哪种打印数据传输协议?HPJetDirect/AppSocket?LPR/LPD?IPP?
    • 你有硬盘空间吗?
    • 你有多少RAM?
    • 目前有哪些其他打印客户端连接到您?
    • ...还有很多.
  2. PJL查询.通过向PJL打印机发送几行简单语句(并评估响应),也可以检索上述某些信息.

  3. 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
    
    Run Code Online (Sandbox Code Playgroud)

    对于PCL或任何格式作业当然也是如此... 如果打印机知道这种格式.您需要解决的确切TCP端口取决于您的特定型号(在手册中查找).如何为打印机创建PostScript,PCL或任何文件由您决定.


[^ 1] ...除了一些Adobe程序,例如Acrobat,它们确实可以生成自己的PostScript.


Mis*_*ood -3

在 Windows 环境中,常见格式是 WMF。Windows 元文件。WMF 是矢量和位图的组合。

WMF 格式是 MS 制作的,用于与 Windows GDI 一起恢复图像。WMF 文件包含重建图像所需的所有内容,因此可以将它们转换为任何其他图形格式。

打印机制造商通常创建自己的打印机命令集。他们可能会选择采用事实上的标准并与专利/版权持有者达成协议。

如果您制造 Postscript 打印机,您的潜水员会将 WMF 转换为 Postscript。

Windows 应用程序通过 Windows GDI API 创建元数据 (WMF),而由打印机制造商编写的 Windows 驱动程序将 WMF 转换为他们自己的打印机命令。

微软在一年前的昨天(2014 年 5 月 15 日)将 WMF 规范发布到公共领域:Windows 图元文件格式 PDF

当您拥有打印机可以正确解释的“原始”(例如 Postscript、HPGL)数据时,您必须绕过制造商驱动程序。

要绕过打印机驱动程序,请使用通用/纯文本驱动程序。

这将从图片中消除驱动程序,然后您可以发送“原始数据”。

然后,您必须发送驱动程序生成的所有代码,这些代码旨在使您的工作更轻松。