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