GhostScript (PostScript):从 A* 缩小到 A4 时打印机截断边框
GhostScript (PostScript): Printer cut- off borders when scaling down from A* to A4
我正在开发供外部应用程序使用的 "GS Wrapper"(使用 9.20 SDK)。例如,我将 A0 Sheet 缩小到 A1、A2 和 A3,它工作正常。 (PDF 到 PS,然后打印)
问题:当我将任何输入格式缩小到 A4 时,打印机会切断内容的边框(这些是技术图纸,每个 sheet 边缘有一个黑色边框)。
- 是否有机会再次缩小 A4(至 A4)约 95% 并使图像居中? (这应该会导致基本图像变小,比如黑色边框之后距离 sheet 边框约 ~10mm)
我使用以下参数进行缩放:
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 提示。
听起来您的打印机有一个 non-printable 区域。这种情况并不少见,纸张处理需要在打印时托住纸张,这可能会导致介质的某些区域无法打印。
如果您的内容到达了介质的边缘,可能打印机无法打印到那里,导致内容被裁剪。
完全可以让 ps2write 将媒体内容缩小到更小的尺寸,但您不能让它(自动)缩小并移动内容位置,因为内容适合媒体尺寸。
但是,FitPage 机制不查看内容,只查看媒体大小请求。因此,如果输入请求 A3 并且所选媒体为 A4(且固定),则应用比例因子将内容缩放到所需的媒体大小(并且忽略 A3 的媒体请求)。
所以你可以做的是保留现有的代码,但添加一个 BeginPage 或 Install 过程,它使用缩放运算符进一步减小页面上标记的大小,并使用翻译运算符来稍微移动原点,使最终内容居中。
类似于(仅示例,未经测试):
<<
/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 英寸。
我正在开发供外部应用程序使用的 "GS Wrapper"(使用 9.20 SDK)。例如,我将 A0 Sheet 缩小到 A1、A2 和 A3,它工作正常。 (PDF 到 PS,然后打印)
问题:当我将任何输入格式缩小到 A4 时,打印机会切断内容的边框(这些是技术图纸,每个 sheet 边缘有一个黑色边框)。
- 是否有机会再次缩小 A4(至 A4)约 95% 并使图像居中? (这应该会导致基本图像变小,比如黑色边框之后距离 sheet 边框约 ~10mm)
我使用以下参数进行缩放:
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 提示。
听起来您的打印机有一个 non-printable 区域。这种情况并不少见,纸张处理需要在打印时托住纸张,这可能会导致介质的某些区域无法打印。
如果您的内容到达了介质的边缘,可能打印机无法打印到那里,导致内容被裁剪。
完全可以让 ps2write 将媒体内容缩小到更小的尺寸,但您不能让它(自动)缩小并移动内容位置,因为内容适合媒体尺寸。
但是,FitPage 机制不查看内容,只查看媒体大小请求。因此,如果输入请求 A3 并且所选媒体为 A4(且固定),则应用比例因子将内容缩放到所需的媒体大小(并且忽略 A3 的媒体请求)。
所以你可以做的是保留现有的代码,但添加一个 BeginPage 或 Install 过程,它使用缩放运算符进一步减小页面上标记的大小,并使用翻译运算符来稍微移动原点,使最终内容居中。
类似于(仅示例,未经测试):
<<
/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 英寸。