Ghostscript剪辑一个pdf文件

Ghostscript clips a pdf file

我正在尝试使用这些设置使用 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 以编程方式添加这些内容吗?我从 google 的第一页尝试了许多不同的解决方案,但其中 none 有效并且它们似乎对打印的 pdf 没有影响。

当我尝试使用 Adob​​e 或 IE 打印它时,它会在我选择打印机后神奇地添加边距并且打印效果很好。

如何使用 Ghostscript 实现同样的效果?

好的,首先是 许多 您设置的开关没有效果:

-empty 不是 Ghostscript 可以理解的开关,我有点惊讶它不会导致错误。

-dPDFSETTINGS 只影响 pdfwrite 设备,这就是为什么它被记录在矢量设备部分。

-dCompatabilityLevel 只影响pdfwrite设备的输出。

-dNOSAFER 没有任何效果,因为这是默认设置。

-f 用于'close' 直接以-c 开头的PostScript 插入,如果不使用-c 则不需要-f

现在几乎可以肯定 Ghostscript 和您的 PDF 都没有 'bad margins',对您的问题最可能的解释是您使用的打印机无法打印到页面的边界,即 left/right 边缘, 并且有可能顶部和底部边缘被纸张传输机构使用,打印机无法在此处打印。

为了解决这个问题,您需要减小图像的大小,您可以 'probably' 通过设置 -dDEVICEWIDTHPOINTS 和 -dDEVICEHEIGHTPOINTS 以及 -dFIXEDMEDIA 来实现。计算出正确的宽度和高度值将取决于您。

在下方评论后添加

这个问题有两个部分,第一个是推断要打印的实际可用区域的大小,并将输出缩放到该大小。第二种是重新定位介质上的输出,以便全部打印出来。如果如您所说,内容明显小于媒体,那么您可以忽略重新缩放它,但为了完整起见,此处提供了整个解决方案。

现在如前所述,第一部分主要是通过创建固定大小来实现的canvas;这是通过任何媒体选择开关和添加 -dFIXEDMEDIA 完成的。

注意 如果您更改媒体大小,那么您显然也必须更改内容的比例,否则将不适合。因此,您还需要根据输入类型设置 PSFitPage、EPSFitPage 或 PDFFitPage(无论输入类型如何,最新版本的 Ghostscript 都可以使用 -dFitPage)。

作为实验,我使用文件 /ghostpdl/examples/text_graphic_image.pdf 并将输出发送到文件上的打印机:

此命令行:

gswin32 -dDEVICEHEIGHTPOINTS=391 -dDEVICEWIDTHPOINTS=306 -dFIXEDMEDIA -sDEVICE=mswinpr2 -sOutputFile=%printer%KensPrinter /ghostpdl/examples/text_graphic_image.pdf

生成输出,其中 3/4 的图像被剪掉(内容位于新定义的固定 canvas 大小之外)。如果我将其修改为:

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,导致名称损坏。或者可能是你用来 fork Ghostscritp 进程的任何东西。无论哪种情况,您都可能需要将 % 符号加倍。

您应该先从命令行让它运行,然后再将它运行到应用程序中。