我们开发了一种内部打印解决方案,允许用户管理他们的打印件(审核/合并/审查/发送到多台打印机)等......但是我们在流程的最后阶段遇到了问题 - 最终打印。
目前,我们的解决方案在PDF中存储文档(原始和合并后)。我们需要能够将这些文档发送到特定的打印机并在某些情况下(当用户选择了该选项时)将页面1打印到纸盘8而将其余部分打印到纸盘1.我们无法拆分PDF并打印它们是分开的,因为它们也必须由打印机作为单个作业装订。
我们的想法是使用ghostscript将PDF文件转换为PostScript文件,然后将PJL命令插入PostScript,然后使用gsprint打印此修改后的PostScript文件。
不幸的是,ghostscript,postscript,PJL和gsprint的组合似乎不起作用。我们尝试的PJL命令,我们可以通过windows copy命令发送到打印机的文本文件中工作,在放入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-&gt; PCL-&gt;添加PJL->发送到带有“复制”的打印机
不幸的是我们仍然遇到问题,我们的打印机似乎忽略了某些PJL命令(打印机肯定是PCL打印机)。
如果我们使用Microsoft Word生成的2页PDF,使用ghostscript将其转换为PCL,然后使用Notepad ++ add编辑该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的完全相同的工作要长得多,而且听起来它在内部做了不同的事情。
有什么想法吗?
答案 0 :(得分: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是一种编程语言,您将在任何随机文本中出现语法错误。但是,您可以将文本发送到PCL打印机,该打印机假定任何不以0x1B(转义)开头的内容都只是要打印的文本。
因此,使用Ghostscript生成PCL输出,如上所述插入PJL,然后将结果直接发送到打印机应该可以正常工作。当然,在PCL文件中识别每个页面的结尾可能会更困难。
答案 1 :(得分:1)
我们有类似的问题,这就是我们使用ghost脚本和PJL
的方式http://reddymails.blogspot.com/2014/07/how-to-print-documents-using-java-how.html
bfo.com也有一些商业罐子,它们在没有ghost脚本和纯Java方式的情况下做同样的事情。但你必须付钱:)