好的,第一件事是您设置的许多开关都没有效果:
-empty 不是 Ghostscript 可以理解的开关,我有点惊讶它不会导致错误。
-dPDFSETTINGS 仅影响 pdfwrite 设备,这就是它在矢量设备部分中记录的原因。
-dCompatabilityLevel 仅影响 pdfwrite 设备的输出。
-dNOSAFER 没有任何效果,因为这是默认设置。
-f 用于“关闭”以 -c 开头的直接 PostScript 插入,如果不使用 -c,则不需要 -f
现在几乎可以肯定 Ghostscript 和您的 PDF 都没有“差边距”,对您的问题最可能的解释是您使用的打印机无法打印到页面边界、左/右边缘以及可能的顶部和底部边缘被纸张传输机构使用,打印机无法在那里打印。
为了解决这个问题,您需要减小图像的大小,您可以“可能”通过设置 -dDEVICEWIDTHPOINTS 和 -dDEVICEHEIGHTPOINTS 和 -dFIXEDMEDIA 来做到这一点。由您决定正确的宽度和高度值。
在下面的评论之后添加
这个问题有两个部分,第一部分是推断实际可用区域的大小进行打印,并将输出缩放到该大小。第二个是然后重新定位介质上的输出,以便全部打印。如果如您所说的内容比媒体小得多,那么您可以忽略重新缩放它,但为了完整起见,此处提供了整个解决方案。
现在如前所述,第一部分主要是通过创建固定大小的画布来实现的;这是通过任何媒体选择开关和添加 -dFIXEDMEDIA 来完成的。
注意如果您更改媒体大小,那么您显然也必须更改内容的比例,否则将不适合。因此,您还需要根据输入类型设置 PSFitPage、EPSFitPage 或 PDFFitPage(无论输入类型如何,最新版本的 Ghostscript 都可以使用 -dFitPage)。
作为一个实验,我使用了文件 /ghostpdl/examples/text_graphic_image.pdf 并将输出发送到 FILE 上的打印机:
这个命令行:
gswin32 -dDEVICEHEIGHTPOINTS=391 -dDEVICEWIDTHPOINTS=306 -dFIXEDMEDIA -sDEVICE=mswinpr2 -sOutputFile=%printer%KensPrinter /ghostpdl/examples/text_graphic_image.pdf
产生输出,其中 3/4 图像被剪掉(内容位于新定义的固定画布大小之外)。如果我将其修改为:
gswin32 -dDEVICEHEIGHTPOINTS=391 -dDEVICEWIDTHPOINTS=306 -dFIXEDMEDIA -dPDFFitPage -sDEVICE=mswinpr2 -sOutptuFile=%printer%KensPrinter /ghostpdl/examples/text_graphic_image.pdf
然后结果是原件的完美复制,尺寸为 1/4(每个方向一半)。
因此,您需要做的第一件事是在打印机上建立介质的实际可打印区域,然后您可以将宽度和高度正确设置为固定介质,并告诉 Ghostscript 缩放页面以适应。
但是,这仍会将打印的图像留在介质的左下方。由于该区域无法打印,因此您需要将打印的图像移动到页面中心。正如我所建议的,您可以使用 BeginPage 过程来执行此操作。这个:
gswin32 -dDEVICEHEIGHTPOINTS=391 -dDEVICEWIDTHPOINTS=306 -dFIXEDMEDIA -dPDFFitPage -sDEVICE=mswinpr2 -sOutptuFile=%printer%KensPrinter -c "<</BeginPage {100 100 translate}>> setpagedevice" -f /ghostpdl/examples/text_graphic_image.pdf
产生打印图像向上和向右移动 100 个点的输出。
我相信稍微调查一下,您就可以确定您的打印机能够打印的确切位置,并创建适当大小的不可打印边距。
请注意,对我来说,%printer% 语法不会导致打印机选择对话框。我怀疑您的代码(无论是什么语言)正在扩展 %p,从而导致名称损坏。或者可能是你用来分叉一个 Ghostscritp 进程的任何东西。无论哪种情况,您都可能需要将 % 符号加倍。
您应该首先从命令行启动它,然后再将它应用到应用程序中。