【问题标题】:How do I send data to a modern printer? PDF, PostScript, HPGL, etc如何将数据发送到现代打印机? PDF、PostScript、HPGL 等
【发布时间】:2015-03-14 11:08:03
【问题描述】:

我正在尝试了解我以编程方式与打印机通信以从应用程序软件中打印某些内容的选项。换句话说,当用户告诉我的应用程序他们想要打印一些东西时会发生什么。我了解它在“旧时代”的运作方式,并试图了解更复杂的现代世界。

在过去,主要有两种打印机:理解 HPGL 的 HP 打印机和 Postscript 打印机。因此,您可以使用这两种语言中的任何一种发送打印件,打印机会将您的代码转换为页面上的点。您还可以将位图嵌入为二进制数据。例如,在 HPGL(或 PCL)中,您可以给出一个命令,该命令基本上会说“请打印此位图,这是光栅数据”,然后是一个巨大的二进制数据块。显然,如果您这样做,进入打印机的数据量会更多,并且可能会阻塞打印机。后记也有同样的能力。如果您打印文本,您可以告诉打印机以 TimesNewRoman 字体(或其他字体)打印文本“xyz”,然后打印机将为您计算所有点(这意味着打印机必须知道字体,或者您必须下载字体提前到打印机)。

现在,据我了解,PDF 格式类似于 Postscript,但它不是 Postscript 之类的语言,只能包含“对象”。因此,例如,在 Postscript 中,您可以创建一个循环并说“打印这个圆圈 50,000 次”,移动它的确切位置。在 PDF 中,我的理解是你不能这样做,你必须将每个圆圈指定为一个单独的“对象”。

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

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

【问题讨论】:

  • 您用[windows] 标记了您的问题。您说的是哪个版本的 Windows?服务器2000?经验? 2003 年?远景?服务器2012?视窗 8? 8.1? 10?反转录?移动的?行政长官?电话?
  • 你已经得到了非常准确的答案,我认为是时候放弃你的赏金或添加 cmets 来解释为什么你认为这些答案并没有真正回答你的问题。

标签: windows pdf printing postscript


【解决方案1】:

'因此,例如,在 Postscript 中,您可以创建一个循环并说“打印这个圆圈 50,000 次”,移动它的确切位置。在 PDF 中,我的理解是你不能这样做,你必须将每个圆圈指定为一个单独的“对象”。'

实际上,在你描述的两个极端之间,事实更接近于中间立场。

  1. 确实如此:与 PostScript 不同,PDF 不是一种编程语言(更不用说图灵完备的语言),而且您不能定义“循环”。

  2. 而且,您不必必须分别指定每个圆圈(或嵌入的图像或其他图形对象)。您可以很好地定义一次如何绘制一个圆圈(或图像,或其他),然后在页面或 PDF 文档的其他位置重新使用该定义。这称为“引用对象”。当您重用一个对象时,您可以通过更改一些当前的“环境”定义(例如包含CTM图形状态)来设置不同的属性(颜色、缩放、旋转) ,当前变换矩阵)。


关于您的其他一些观点:

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

  • 即使在过去,也有十几种不同的“打印机语言”。 PCL 甚至比 HPGL 更受欢迎。不要忘记不同打印机语言的所有专有发明。听说过 AFP高级功能打印?这种语言打印出来了——而且还在打印! -- 比 PostScript 做的多张纸。它不再是专有的,但它是由 IBM 发明的,用于主机打印可变数据的 laaaarge 运行,主要用于计费目的……听说过 ESC/P 吗? KPDL? XPS?

  • 是的,您仍然可以将 HPGL 发送到打印机,但不能发送到每台打印机。打印机必须始终支持至少一种您能够生成和发送的语言。

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


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

不要假设“设备上下文”一词确实意味着 Windows 直接与打印机硬件对话以查询功能并请求设备上下文。有时会,有时不会。它总是依赖于一些称为“打印机驱动程序”的软件(它还控制打印数据应转换为哪种打印机语言)。打印机驱动程序可能能够查询设备并询问“你有双面打印单元吗?你有装订设备吗?”然后自己生成所需的设备上下文为了这份工作。

只有由 'Printer Working Group' 开发的非常现代的方法 IPP Everywhere 才能摆脱大部分旧模型 -特定的打印机驱动程序必须这样做,并且在“无驱动”最终确定要传递给物理设备的确切打印数据之前,将开始主要依赖直接询问设备。

但 IPP Everywhere 尚未广泛流行,无论是供应商、管理员还是用户。但是,一旦 PC 被遗忘,95% 的计算设备将成为超级移动设备……

【讨论】:

    【解决方案2】:

    由于 OP 不喜欢我的(或任何其他)原始答案足以接受它,他同时甚至授予了赏金。

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


    “在过去,有两种主要类型的打印机:理解 HPGL 的 HP 打印机和 Postscript 打印机。”

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

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

    不,这并非在所有情况下都有效。

    这仅在打印机理解两种这两种语言时才有效(一些更昂贵的 HP 型号可以做到这一点)。

    某些打印机型号(即使在过去)仅支持 HP/GL。有些人只了解 PCL 的特定版本(PCL、FWIW 是一个完整的打印机语言系列,由大约十几个成员组成:还有一些较新的成员与老一代几乎没有任何遗传共同点——除了惠普营销部门选择称他们为 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 甚至是 Turing-complete 作为一种编程语言,这意味着:任何可编程的东西 ,可以写成 PostScript 程序)。

    所以,虽然您仍然可以将一个圆(甚至是一个非常复杂的图形对象)定义为 PDF 对象一次:

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

    但是您说“PDF 格式...类似于 Postscript”时是不对的。它不是。 PDF 源自与 PostScript 最初建立的相同图形模型。但仅此而已。

    运算符的 PDF 关键字不同。典型 PDF 的结构与 PostScript 完全不同。

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

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

    “现在所有打印机都在 Postscript 上标准化了吗?”

    没有。

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

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

    无论如何,这从来没有是你最好的选择,即使在“过去”也不是!

    毕竟,在大多数情况下,打印比一页更复杂的作业不仅涉及询问份数,还涉及...

    • ...您还想选择分页器尺寸,甚至可以为首页选择一个特定的纸盘(带有刊头信或蓝色封面纸),另一个纸盘用于页面主体,第三个纸盘用于最后一张;
    • ...您想告诉设备装订每组,或在每张纸上打孔;
    • ...您想对一些工作进行对折和骑马订,以完成小册子,
    • ...还有什么。

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

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

      PPDPostScript 打印机说明的缩写)中定义了特定打印机型号执行特定功能所需的特定 setpagedevice相应 PostScript 打印机驱动程序的文件。这个.ppd 文件必须由各自的供应商连同其打印机驱动程序一起提供。 PPD 是一种文件格式 specification defined by Adobe。在某种程度上,它扩展了 PostScript 语言,并允许供应商在涉及复杂的作业设置时“发明”他们自己的功能。

    2. 使用 PJLPrinter 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 框。

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

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

      • 您目前的墨水量是多少?
      • 您可以处理的最大媒体尺寸是多少?
      • 你有多少个纸盘?
      • 托盘 1 的填充量是多少?
      • 您在现场打印了多少页?自上次启动以来有多少次?
      • 您可以处理哪些打印机语言?
      • 您支持哪种打印数据传输协议? HPJetDirect/AppSocket? LPR/LPD? IPP?
      • 您有可用的硬盘空间吗?
      • 你有多少内存?
      • 您目前还连接了哪些其他打印客户端?
      • ...等等。
    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
      

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


    [^1] ...除了一些像 Acrobat 这样的 Adob​​e 程序,它们确实可以生成自己的 PostScript。

    【讨论】:

    • 另一种将 PS 文件发送到打印机的方法是调用 API 的 ExtEscape 函数,将打印机句柄、转义运算符 POSTSCRIPT_DATA 和后记数据作为参数传递。转义运算符 QUERYESCSUPPORT 也可用于了解驱动程序是否支持 POSTSCRIPT_DATA 转义
    【解决方案3】:

    我认为 pdf 是编译后的 postscript 基本上是相同的东西,如果不是相同的东西,只是一个被编译成二进制 blob,另一个是 ascii。

    并非所有打印机都会使用 postscript,谢天谢地,当您可以免费在计算机上运行它并使用更少的资源并更快地打印时,他们往往会为此收取额外费用。 (或在廉价的假脱机上)

    PCL 在非 HP 打印机和 HP 上非常常见。但没有普遍的答案。您仍然需要逐个打印机,查看哪个支持和/或作为附加组件购买的内容,然后从该列表中管理员启用的内容。然后当然是说任何语言的版本。

    这就是 CUPS 的全部意义所在。一种抽象和隐藏这些细节的方法。

    【讨论】:

      【解决方案4】:

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

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

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

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

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

      微软在一年前的昨天(2014 年 5 月 15 日)将 WMF 规范发布到公共领域:Windows Metafile Format PDF

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

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

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

      然后,您必须发送司机生成的所有代码,这些代码旨在让您的工作更轻松。

      【讨论】:

      • “如果您制造 Postscript 打印机,您的潜水员会将 WMF 转换为 Postscript”,不正确。 “Windows 应用程序通过 Windows GDI API 创建元数据 (WMF),由打印机制造商编写的 Windows 驱动程序将 WMF 转换为他们自己的打印机命令。”也不是真的,这不是它的工作方式。事实上,驱动程序可以接收不同类型的输入,例如 XPS、Postscript、PCL 或驱动程序将转换的直接 GDI 函数调用。但是打印机驱动程序不需要直接处理 WMF 格式。
      【解决方案5】:

      如果您想完全自动化打印过程,请安装 FolderMill (http://www.foldermill.com/)。该程序会自动将打印的文档转换为所需的格式,选择免费的打印机并生成打印作业。

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2013-07-01
        • 1970-01-01
        • 2019-06-15
        • 2023-01-10
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多