首页 文章

Ghostscript剪辑pdf文件

提问于
浏览
0

我正在尝试使用这些设置使用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 回答

  • 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上的打印机:

    这个命令行:

    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(每个方向的一半) .

    因此,您需要做的第一件事是在打印机上 Build 媒体的实际可打印区域,然后您可以将宽度和高度正确地设置为固定媒体,并告诉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进程的任何东西都可以 . 在任何一种情况下,您可能需要将%符号加倍 .

    您应该首先从命令行开始工作,然后将其放入应用程序中 .

相关问题