Printing 确定接收到的数据是PostScript还是PCL

Printing 确定接收到的数据是PostScript还是PCL,printing,postscript,printer-control-language,Printing,Postscript,Printer Control Language,我有一个通过tcp/ip接收打印机数据的服务。当收到数据时,是否有可靠、有效的方法来检查数据流并确定数据是PostScript还是PCL数据?例如,我是否可以在数据流的开头查找字符来表示格式?Postscript数据必须以“%!ps”或“%!ps”开头-它可能是一个较长的可读字符串,如“%!ps-Adobe-3.0”-但基本上就是这样 最有可能的是PCL有一个类似的签名-我记得在过去见过它。我可能只会计算文件中转义字符的数量。PCL会有很多的。Postscript将有%s个符号。这不是一个完美的

我有一个通过tcp/ip接收打印机数据的服务。当收到数据时,是否有可靠、有效的方法来检查数据流并确定数据是PostScript还是PCL数据?例如,我是否可以在数据流的开头查找字符来表示格式?

Postscript数据必须以“%!ps”或“%!ps”开头-它可能是一个较长的可读字符串,如“%!ps-Adobe-3.0”-但基本上就是这样


最有可能的是PCL有一个类似的签名-我记得在过去见过它。

我可能只会计算文件中转义字符的数量。PCL会有很多的。Postscript将有%s个符号。这不是一个完美的解决方案,但它非常简单,我敢打赌它实际上是相当可靠的

我能看到的唯一“真正”的方法是实际解析PCL和postscript,看看哪一个有效。

我将添加我的2

就像这里提到的其他人一样,以编程方式标识文档的第一个尝试是查看前两个字符。如果它以
%开头,它是PostScript,如果它以转义字符开头(十六进制
1B
,oct
033
,ascii
27
),因为PCL很可能以PCL命令开头,那么它就是PCL。这可能会解决99%需要处理的文档。如果仍然未知,则可以在文档中搜索
showpage
字符串。如果是PostScript,则必须有一个showpage来呈现页面。如果您找不到转义字符,并且文件中有转义字符,您就知道它是PCL,如果没有showpage,并且没有转义字符,您可能会在PCL一侧出错,因为原始文本文件是有效的PCL,打印机可以在它们出现时将它们打印出来。

根据PCL,文件应该以ESC“E”开头。我认为必须遵循另一个ESC序列。所以我猜以字节1B 45 1B开头的文件很可能是PCL文件。 这会使不符合此规则的PCL文件无法识别


在我的用例中,macOS总是在开始时使用ESC E生成PCL。

在开始PCL或PostScript之前,您需要注意PJL命令。如果在开始时确实有PJL命令,您通常会看到PJL命令告诉您以下“@PJL ENTER LANGUAGE=PCLXL”的数据类型,而具体实现可能需要此命令,
/%*/字符串。这是DSC惯例的一部分。输入语言命令如何?这可以信赖吗?如果出现ENTER LANGUAGE PJL命令,那么它应该相当可靠——下一行应该是数据的开头(PostScript或PCL)。我想说,所有现实世界的PostScript打印文件中有99%以上都将使用介绍性的魔术字符串
!%(或其变体b0rken Windoze
^D!%
)。然而,根据官方的Adobe“红皮书”附言参考和语言手册,luser droog认为这不是一项硬性要求,这是正确的@jsbueno:注意,您列出的
!%PS
!%ps
!%PS-Adobe-3.0
的要求甚至比
!%
is(如果文件应遵循Adobe Document Structuring Conventions(DSC)版本3,则后一项是必需的)…您的打印客户端在其提交的PostScript和/或PCL数据结构中是否以某种方式“一致”?如果是,则可以很容易地确定文件类型。如果不是,这需要更多的努力……是的,它们是一致的。我最终使用了下面答案中的信息组合。我首先搜索PJL ENTER LANGUAGE命令。如果我找到了它,我会根据这个值进行判断。否则,我搜索%!PS,因为所有PostScript数据都应遵守DSC惯例。如果我仍然无法做出决定,我就默认使用PCL,因为这是绝大多数客户机正在使用的。