在 PJL 中设置页面缩放

Set page scaling in PJL

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

现在进入实际问题:我们软件需要打印的文件大部分是发票,所以制作的很仔细,每一个元素都精准定位,如果它偏离毫米,则打印的文档无效。当直接通过 Adob​​e 或任何 pdf 查看软件打印文档时,我可以 select actual size 选项,一切正常。尽管如果我通过 C# 和 PJL 打印它,文档根据打印它的打印机有不同的页边距。到目前为止,我们使用 pdfprinting.net,并且可以通过 pdfPrint.Scale = PdfPrint.ScaleTypes.None 编辑该选项 select,但我如何通过 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'

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

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

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

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

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

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