3

我们开发了一种内部打印解决方案,允许用户管理他们的打印(审核/合并/审查/发送到多台打印机)等......但是我们在流程的最后 - 最终打印时遇到了问题。

目前,我们的解决方案将文档(原始和合并后)存储在 PDF 中。我们需要能够将这些文档发送到特定的打印机,并在某些情况下(当用户选择该选项时)将第 1 页打印到托盘 8,将其余的打印到托盘 1。我们无法拆分 PDF 并打印将它们分开,因为它们也必须由打印机作为单个作业装订。

我们的想法是使用 ghostscript 将 PDF 文件转换为 PostScript 文件,然后将 PJL 命令插入 PostScript,然后使用 gsprint 打印修改后的 PostScript 文件。

不幸的是,ghostscript、postscript、PJL 和 gsprint 的组合似乎不起作用。我们尝试的 PJL 命令,我们可以在通过 windows 复制命令发送到打印机的文本文件中工作,但在放入 PostScript 文件并使用 gsprint 打印时似乎没有相同的影响。

谁能发现我们对 PostScript 所做的任何可怕的缺陷,或者知道为什么我们的 PostScript->PJL amends->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->使用“副本”发送到打印机

不幸的是,我们仍然遇到这个问题,我们的打印机似乎忽略了某些 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 时的完全相同的作业要长得多,而且听起来它在内部做一些不同的事情。

有任何想法吗?

4

2 回答 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 是一种编程语言,任何随机文本都会出现语法错误。但是,您可以将文本发送到 PCL 打印机,该打印机假定不以 0x1B(转义)开头的任何内容都只是要打印的文本。

因此,使用 Ghostscript 生成 PCL 输出,像上面那样插入 PJL,然后将结果直接发送到打印机应该可以工作。当然,在 PCL 文件中识别每一页的结尾可能会更加困难。

于 2012-12-05T08:17:09.427 回答
1

我们遇到了类似的问题,这就是我们使用 ghost 脚本和 PJL 的方式

http://reddymails.blogspot.com/2014/07/how-to-print-documents-using-java-how.html

bfo.com 也有一些商业 jars,它们在没有 ghost 脚本的情况下以纯 java 方式做同样的事情。但你必须为此付出代价:)

于 2015-02-06T21:47:07.740 回答