使用gsprint打印PostScript文件时出现PJL命令相关问题

3
我们开发了一种内部打印解决方案,允许用户管理他们的打印(审计/合并/审核/发送到多个打印机)等等...但是我们在流程的最后一步 - 最终打印时遇到了问题。
目前,我们的解决方案将文档(原始文档和合并后的文档)存储为PDF。我们需要能够将这些文档发送到特定的打印机,并在某些情况下(当用户选择该选项时)将第一页打印到托盘8,其余页面打印到托盘1。我们无法拆分PDF并单独打印它们,因为它们还必须作为单个作业由打印机装订。
我们的想法是使用ghostscript将PDF文件转换为PostScript文件,然后在PostScript中插入PJL命令,然后使用gsprint打印此修改后的PostScript文件。
不幸的是,ghostscript、postscript、PJL和gsprint的组合似乎不起作用。我们尝试的PJL命令可以通过windows复制命令发送到打印机的文本文件中使其正常工作,但在放入PostScript文件并使用gsprint打印时似乎没有同样的效果。
有人能否发现我们在对PostScript进行操作时存在严重缺陷,或者有任何想法,为什么我们的PostScript->PJL修正->gsprint工作流可能不起作用?
在网上很难找到示例,因此我们放置PJL命令的位置可能是不正确的。
(//注释不包含在最终文件中)
<ESC>%-12345X@PJL JOB<ESC>&l8H           //start job printing first page 
@PJL ENTER LANGUAGE = Postscript         //to tray 8 (letterhead)
@PJL COMMENT CANPJL SET STAPLE=ONEUPLEFT //indicate the document should be stapled
%!PS-Adobe-3.0                           //start of PostScript file proper
---
%%PageTrailer                            //end of first page
<ESC>%-12345X@PJL EOJ<ESC>%-12345X       //end the first job
%%Page: 2
<ESC>%-12345X@PJL JOB<ESC>&l7H           //start 2nd job to print remaining
---                                      //pages to tray 1 (plain)
---
%%EOF
<ESC>%-12345X@PJL EOJ<ESC>%-12345X       //end 2nd job

我们接着使用修改后的PostScript并使用gsprint,具体如下:
gsprint -noquery -ghostscript gswin32c -printer "printer" "C:\postscriptfile.ps"

这些内容都会默认打印到默认的托盘上,并且没有装订,也就是说,这些内容都不能按预期工作。
我希望我们试图实现的目标很清楚。任何帮助都将不胜感激。
提前致谢。
PS:我们所有的打印机都是佳能打印机。
编辑:根据下面KenS的答案,似乎逻辑工作流程应该是PDF->PCL->添加PJL->使用“copy”发送到打印机
不幸的是,我们仍然在这方面遇到问题,某些PJL命令似乎被我们的打印机忽略了(这些打印机肯定是PCL打印机)。
如果我们拿一个由Microsoft Word生成的2页PDF文件,使用ghostscript将其转换为PCL文件,然后使用Notepad++编辑该PCL文件并添加以下内容:
<ESC>%-12345X@PJL JOB NAME = "My Print Job Name"<CR><LF>
@PJL SET DUPLEX = ON
@PJL SET OUTBIN = LOWER
@PJL ENTER LANGUAGE = PCL
...original PCL data...
<ESC>%-12345X@PJL EOJ<CR><LF>
<ESC>%-12345X

文档从下面的输出托盘出来,但没有双面打印。但更奇怪的是,当DUPLEX = ON时,打印机似乎要花费更长时间来打印与DUPLEX = OFF相同的作业,并且听起来它在内部执行了不同的操作。

有任何想法吗?


双面打印可能是非标准的(通常是这样)。由于您使用的是Windows系统,可以尝试将双面作业(例如2页空白页面)打印到打印机上,看看它们是否以单张纸的形式输出?如果可以,请将相同的作业打印到文件中,并查看文件中嵌入了哪些控制序列以供Windows驱动程序使用。哦等等.... - KenS
双面打印通常在终止作业时会被重置,并且任何尾页都会被清除。我猜测文件中有不止一个关闭的文档。你能分享一个例子吗?最好是两个空白页面,但我想每页一个单词也可以。 - KenS
你最终解决了这个问题吗?我们也在尝试类似的事情,遇到了你所面临的同样的问题。 - John
不是真的,这个项目被搁置了,我没有机会回去处理它。抱歉。 - Martyn
@Martyn:你在PJL头部使用哪种行尾?我发现如果行尾不一致,有些打印机会出问题。PJL“标准”只需要<LF>,但有些打印机可能需要<CR>和<LF>两者都要,混合使用有时也会导致问题。 - dreamlax
2个回答

3
我认为您误解了gsprint的操作。它会接受一个输入文件,将其渲染成位图,在适当的画布上绘制该位图,然后使用Windows打印系统将该画布打印到打印机上。它根本没有控制打印机的能力,因此嵌入任何预期控制打印机(而不是渲染)的内容都没有任何效果。
另外,PJL与HP PCL打印机相关联,而不是PostScript打印机。尽管您的PJL可能适用于PCL打印机,因为它将每个页面视为单独的作业,但在PostScript打印机上根本不起作用,并且可能会导致错误,这取决于解释器是否忽略PJL命令。
为了控制打印机,您需要确定打印机支持哪种输入格式(PostScript或PCL),然后将PDF转换为该格式,然后插入适当的控制序列。对于PCL打印机,您可以合理地使用PJL,对于PostScript打印机,应使用setpagdevice运算符进行控制。假设您有打印机的Windows .WPD或.PPD文件,则可以在其中找到相关的控制序列,或通过打印几个测试文件并检查其内容来找到所需的控制序列。
顺便说一下,您说当将文本文件发送到打印机时使用的命令有效。这意味着打印机至少理解PJL,并且几乎肯定是PCL打印机。您无法将文本发送到PostScript打印机,因为PostScript是一种编程语言,任何随机文本都会生成语法错误。但是,您可以将文本发送到假定除了以0x1B(转义)开头的内容外,其他所有内容都是要打印的文本的PCL打印机上。
因此,使用Ghostscript生成PCL输出,像上面那样插入您的PJL,然后将结果直接发送到打印机可能会起作用。当然,在PCL文件中识别每个页面的结尾可能会更加困难。

啊,好的,那就有道理了。所以我想 gsprint 就不行了。我会更新我的问题并加入更多的想法。谢谢。 - Martyn
实际上,有相当多不同的PostScript RIP可以接受PJL,它并不完全局限于PCL打印机。事实上,PPD标准特别允许在任何JCL之前加上任何JCL,包括PJL(请参见“JCLStart”,“JCLEnd”和“JCLToPSInterpreter”关键字)。PJL通常用作MFD的JCL(至少是那些没有专有PDL的MFD)。我正在使用的MFD可以接受PJL封装的PostScript、PDF、PCL和TIFF。 - dreamlax
完全正确的是,多语言设备将接受PJL,主要是因为它们接受PCL。然而,PJL不是PostScript规范的一部分。我认为在我的回答中已经涵盖了可能性的范围。 - KenS

1

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接