【问题标题】:GhostScript (PostScript): Printer cut- off borders when scaling down from A* to A4GhostScript (PostScript):从 A* 缩小到 A4 时的打印机截断边框
【发布时间】:2017-01-16 07:43:14
【问题描述】:

我正在开发供外部应用程序使用的“GS Wrapper”(使用 9.20 SDK)。例如,我将 A0 表缩小为 A1、A2 和 A3,它工作正常。 (PDF转PS,然后打印)

问题:当我将任何输入格式缩小到 A4 时,打印机会切断内容的边框(这些是技术图纸,距离纸张边缘每 5 毫米有一个黑色边框)。

  • 是否有机会将 A4(到 A4)再次缩小约 95% 并使图像居中? (这应该会导致基础图像更小,例如黑色边框距离纸张边框约 10 毫米)

我使用以下参数进行缩放:

GhostArg[0] = "-dNOPAUSE";
GhostArg[1] = "-dBATCH";
GhostArg[2] = "-dSAFER";
GhostArg[3] = "-dNOPAUSE";
GhostArg[4] = "-g2480x3508";
GhostArg[5] = "-dPDFFitPage";
GhostArg[6] = "-r300x300";
GhostArg[7] = "-sDEVICE=ps2write";
GhostArg[8] = Output;
GhostArg[9] = Input;

解决方案更新:

我设法通过在 Arg[8] 和 Arg[9] 之间插入这三行来解决这个问题:

GhostArg[9] = "-c";
GhostArg[10] = "<< /BeginPage { 0.99 0.99 scale 10 10 translate } >> setpagedevice";
GhostArg[11] = "-f"; 

感谢 KenS 的 /BeginPage 提示。

【问题讨论】:

    标签: c ghostscript postscript


    【解决方案1】:

    听起来您的打印机有一个不可打印区域。这种情况并不少见,纸张处理需要在打印时握住纸张,这可能导致介质的某些区域无法打印。

    如果您的内容到达介质边缘,则打印机可能无法在此处打印,从而导致内容被裁剪。

    完全可以让 ps2write 将媒体内容拖放到更小的尺寸,但你不能让它(自动)缩小并移动内容位置,因为内容适合媒体尺寸。

    但是,FitPage 机制不查看内容,只查看媒体大小请求。因此,如果输入请求 A3 并且所选媒体是 A4(并且是固定的),则应用缩放因子将内容缩放到所需的媒体大小(并且忽略 A3 的媒体请求)。

    所以你可以做的就是让你的代码保持原样,但是添加一个 BeginPage 或 Install 过程,它使用 scale 运算符来进一步减小页面上标记的大小,并使用 translate 运算符来移动稍微原点,以便最终内容居中。

    类似的东西(仅作为示例,未经测试):

    <<
      /BeginPage {
        0.95 0.95 scale
        16 20 translate
      }
    >> setpagedevice
    

    顺便说一句,您知道 Ghostscript 是根据 AGPL 获得许可的吗?

    另外,我强烈建议您不要使用 -g 和 -r 开关,而只需使用 -dDEVICEWIDTHPOINTS 和 -dDEVICEHEIGHTPOINTS 来更改媒体大小。

    -g 开关以像素为单位工作,但高级输出设备(例如 pdfwrite 和 ps2write)不发射像素,它们写入高级矢量对象。但是,由于 PostScript 和 PDF 图形模型的不同,某些元素确实需要渲染为图像并以这种方式包含在 PostScript 输出中。通过将分辨率设置为 300,您可以修复呈现这些元素(例如包含透明度的页面)的分辨率。我建议你不要这样做,除非你在一个非常严格控制的工作流程中工作并且知道最终输出的分辨率。

    通过使用 DEVICEHEIGHTPOINTS 和 DEVICEWIDTHPOINTS 开关,您可以控制介质尺寸,而无需参考分辨率。请注意,在 PostScript(和 PDF)中,1 磅 = 1/72 英寸。

    【讨论】:

    • 我尝试使用-c-f 开关添加/BeginPage (..),但这导致不再有输出,也许我不能同时将它与PDFFitPage 一起使用时间?我不修改原始源代码,只是将它用作库,以便我可以在托管上下文中使用它。意味着,我不必重新分配我的代码?但是,我每次都知道最终输出的分辨率,但我想我会将我的代码从 -gx 更改为 -dDEVICE*。
    • 如果您使用的是库(可能是 DLL),那么您必须遵守我所理解的 AGPL,因为您的用户需要能够替换您正在使用的“库”使用不同的版本,可能是不同的版本,这意味着 API 可能已更改。如果发生这种情况,他们需要能够修改您的源代码,这就是您需要 AGPL 代码的原因。当然,我不是律师,您的解释可能会有所不同。您应该可以将 BeginPage 与 -dFitPage 一起使用,但我还没有(如我所说)尝试过。您可以尝试使用 /Install 而不是 /BeginPage。我稍后再试。
    • 嗯,我使用这个 API:ghostscript.com/doc/9.02/API.htm。只是从使用谷歌我不确定许可证,我唯一做的就是使用库供个人使用,所以我不确定重新分发它(因为我不接触他们的 DLL,只使用标题和库文件并在我自己的 DLL 上导出一个方法,以满足我对托管代码的需要...)我尝试了 FitPage 和没有,没有 GS 在创建 PS 时只会使用工作表的“一块”。我用我的解决方案更新了我的问题;缩放和翻译命令为我做了。
    • 如果它的个人使用你没问题,它只是向其他人提供代码或使用代码的服务,这是一个问题。个人使用总是可以的。哦,我很高兴它对你有用:-)
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2018-12-23
    • 2012-07-17
    • 2015-04-27
    • 1970-01-01
    • 1970-01-01
    • 2015-07-19
    • 1970-01-01
    相关资源
    最近更新 更多