0

我必须编写一个功能来获取 PDF 文档并将其发送到带有一些 PJL 命令的打印机。到目前为止一切顺利,我将文档转换为 Postscript,使用所需的命令将 postscript 文件发送到打印机,然后打印机打印文档。

现在到实际的问题:我们软件需要打印的大部分文件都是发票,因此它们是精心制作的,每个元素都被精确定位,如果它偏离毫米,打印的文件是无效的。当直接通过 Adob​​e 或任何 pdf 查看软件打印文档时,我可以选择该actual size选项,一切都很好。虽然如果我通过 C# 和 PJL 打印它,文档的边距会根据打印它的打印机而有所不同。到目前为止,我们使用的是 pdfprinting.net,并且可以通过 选择该选项pdfPrint.Scale = PdfPrint.ScaleTypes.None,但是如何通过 PJL 进行选择?

// This are all the commands that I've tried, none of which achieved what I need
var parameters = new Dictionary<string, string>
{
    { "SET USERNAME",userName},
    //{"SET PAPER", "A4" },
    //{"SET MEDIATYPE", "PAPER" },
    //{"SET TOPMARGIN", "TM6MM" },
    //{"SET PRINTAREA", "INKEDAREA" },
    {"SET MARGINS", "SMALLER" },
    //{ "ENTER LANGUAGE","PDF"},
    { "ENTER LANGUAGE","POSTSCRIPT"},
};

var documentText = "\x1B%-12345X@PJL JOB NAME=" + jobName + " DISPLAY=" + jobDisplay;
foreach (var parameter in parameters)
{
    documentText += "\r\n@PJL " + parameter.Key + "=" + parameter.Value;
}

documentText += "\r\n";
documentText += pdfString;
documentText += "\r\n\x0D\x0A\x1B%-12345X\r\n";

RawPrint(printerAddress, documentText, documentName);
// RawPrint() calls the printer methods found in 'winspool.drv', imported via 'DllImport'
4

1 回答 1

1

检查 PJL 参考手册(第 12 版,这是我见过的最新版本)根本无法在 PJL 中缩放页面内容。

即使有,如果它转移到 PostScript(而不是 PCL)解释器环境,我也会感到惊讶,因为 PostScript 具有丰富的功能集来处理这种设置。所以基本上你需要让 PostScript 正确。

现在,当您获取 PDF 文件并从中生成 PostScript 时,几乎可以肯定您正在生成通用 PostScript;它与设备无关,因此它不考虑物理设备的各个方面。

最明显的是硬件边距和不可打印区域。由于纸张处理,许多设备对它们可以打印的介质部分有限制。当然,这些在不同的打印机之间会有所不同。

当然,当您从操作系统打印时,打印机设备驱动程序知道介质的可打印区域是什么(因为它是相关打印机的特定驱动程序),因此它可以安排将内容缩放到实际媒体。

Ghostscript 当然可以生成 PostScript(使用 ps2write 设备),它可以针对给定的打印机进行适当的缩放和翻译,前提是您知道该打印机的特性是什么。事实上,如果打印机足够复杂,PostScript 程序可能会询问打印机以检索其中一些特征(ImagingBBox、PageOffset、Margins、ImageShift),然后可以编写一个 PostScript 程序来动态调整内容的大小。页面,基于这些值(ps2write 生成的 PostScript 不这样做......)。

于 2018-04-30T07:22:17.700 回答