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中,我的理解是你不能这样做,你必须将每个圆圈指定为一个单独的"对象".
实际上,事实是你所描述的两个极端之间的中间地带.
这是真的:与PostScript不同,PDF不是一种编程语言(更不用说图灵完整版),而且你不能定义"循环".
而且,你不必须指定每圈(或嵌入图像或其他图形对象)分开.您可以很好地定义如何绘制圆(或图像,或其他)一次,然后在页面的其他位置或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营销选择称他们为PCL6或PCL XL).
"那么,现代打印机如何工作?我还能将HPGL/PCL发送到打印机吗?"
是的,这仍然有效:
XPS(听说过这个?!?),你可以发送XPS.如果设备了解这些语言的任何组合,那么您可以随意发送它理解的任何内容.
"现在,据我了解PDF格式,它类似于Postscript,但它不是像Postscript这样的语言,只能包含'对象'.所以,例如,在Postscript中你可以制作一个循环并说'打印这个圆圈50,000时间',移动它的确切位置.在PDF中,我的理解是你不能这样做"
你是对的,PDF(不像PostScript),不是一种编程语言.这是一个设计决策,即PDF不应理解循环或条件结构(而做的PostScript - PostScript是连图灵完备的编程语言,意思是:任何可编程可言,可以写为PostScript程序).
因此,虽然您仍然只能将一个圆(或甚至一个非常复杂的图形对象)定义为PDF对象:
但在陈述"PDF格式......与Postscript类似"时,你是不对的.它不是.PDF源自PostScript最初建立的相同图形模型.但那是关于它的.
运营商的PDF关键字不同.典型PDF的结构与PostScript完全不同.
最重要的是,PDF扩展了它从PostScript继承的图形模型(此外,它为典型的电子文档添加了一些其他方面).它在几个方向发展:
"所有打印机现在都标准化了Postscript吗?"
没有.
如果有的话,那么更现代的打印机更喜欢PDF而不是PostScript(虽然它们仍然可以保留PostScript处理功能作为后备选项).但最好询问您的供应商,或研究他们的营销手册.
"如果是这样,这是否意味着我最好的选择是生成Postscript,然后将原始数据发送到打印机? "
无论如何,这从来都不是你最好的选择,即使在"旧时代"也是如此!
毕竟,在大多数情况下,打印一个比单一页面更复杂的作业不仅涉及要求副本数量,而且......
这些工作功能不一定由"原始PostScript"控制.要使用大多数PostScript打印机型号控制特定的打印作业选项,您有两种方法:
<< ...vendor-specific or generic PS-code...>> setpagedevice将PostScript代码段的语句插入到作业数据流中,无论是在文档还是在单个页面级别上.
什么特定setpagedevice需要用于特定的功能,以通过特定的打印机型号来执行在定义PPD(短为PostScript打印机描述各个PostScript打印机驱动程序的)文件.该.ppd文件必须由相应的供应商与其打印机驱动程序一起提供.PPD是Adobe定义的文件格式规范.在某种程度上,它扩展了PostScript语言,并允许供应商在复杂的作业设置中"发明"自己的功能.
使用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以来更新XPS或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打印机?" 如果是这样,那么只需lpr -S remoteserver -P printername "-o l" jobfile.ps从DOS框中运行命令即可.
话虽如此 - 是的,您可以使用至少两种非打印机驱动程序来查询打印设备:
SNMP.如果您的设备具有网络(以太网/ wifi)接口并且了解简单网络管理协议,您可以通过此通道进行查询,并获得您所询问的任何SNMP类型问题的返回答案.用简单的语言(SNMP用语看起来有点不同):
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
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)数据时,您必须绕过制造商驱动程序。
要绕过打印机驱动程序,请使用通用/纯文本驱动程序。
这将从图片中消除驱动程序,然后您可以发送“原始数据”。
然后,您必须发送驱动程序生成的所有代码,这些代码旨在使您的工作更轻松。