ghostscript - Ghostscript mswinpr2 打印单色,除非 BitsPerPixel=24 创建非常大的假脱机文件
问题描述
2018 年 7 月 6 日
嗨,肯,感谢您提供的所有信息!很抱歉花了一段时间才回复您,但根据您的建议,我们离开并做了一些工作。我们现在在 100dpi 时降到了大约 10.4MB。
我们在这种低分辨率下的问题是字体和条形码的完整性。
到目前为止,我们管理大量假脱机文件大小的唯一方法是通过命令行使用 Adobe 的 AcroRd32.exe。这提供了大约 2.5MB 的惊人大小。分辨率似乎很好,关键是条形码和字体也很好。然而,使用这种方法进行大量打印并不理想。
您知道为什么以这种方式打印会产生如此小的假脱机文件吗?我们遇到了一些颜色问题,但分辨率似乎非常好。
是什么让 AcroRd32.exe 与我们迄今为止尝试过的所有其他程序不同?您的建议将不胜感激。
谢谢你。丽兹尔
我需要通过 ghostscript 打印一个图像重的 pdf 目录。如果我不降低分辨率,假脱机文件会变得非常大。最终,我们需要通过 VPN 连接打印 pdf 文件,这意味着文件大小需要保持在 5MB 左右或更低。我们对大约 300 dpi 的分辨率感到满意。
此命令创建一个 1.74 MB 的文件:
C:\Users\admin>"c:\Program Files\gs\gs9.23\bin\gswin64c.exe" -dNOPAUSE -dQUIET -dBATCH -c "mark /OutputFile (%printer%Pro C5100Sseries E-22B PS 1.1) /UserSettings <> (mswinpr2) finddevice putdeviceprops setdevice" -f "myCatalogue.pdf"
此命令创建一个 84.7MB 的文件:
c:\Program Files\gs\gs9.23\bin\gswin64c.exe" -dNOPAUSE -dQUIET -dBATCH -c "mark /BitsPerPixel 24 /OutputFile (%printer%Pro C5100Sseries E-22B PS 1.1) /UserSettings <> ( mswinpr2) finddevice putdeviceprops setdevice" -f "myCatalogue.pdf"
如果我没有指定 /BitsPerPixel 24,pdf 将以单色打印。但是,这会将文件大小推高到 84.7MB。
在网上找到了这个解释: 一些 Windows 设备驱动程序错误地返回一个低值,导致 BitsPerPixel 可以强制我们映射到单色,甚至在全彩色设备上抖动,使得 -dBitsPerPixel=24 是强制性的。
是否有其他人遇到过此问题或有关通过 VPN 批量打印文件大小不超过 5MB 的 pdf 文件的替代方法的任何建议?
解决方案
mswinpr2 的工作方式是将输入文件渲染为位图,然后将位图 blit 到 Windows 设备上下文,然后告诉设备上下文打印它。这会调用打印管道,该管道使用 Windows 打印机驱动程序来创建适合打印机读取的文件。
根据打印机的不同,这可能是 PCL、PostScript、XPS、GDI 或打印机制造商专有的某些其他语言(例如 Zebra 打印机的 ZPL)。
以这种方式工作的优势在于它利用了 Windows 对特定打印机类型的广泛支持。否则,Ghostscript 将不得不为每台不同的打印机配备一个驱动程序,而这在很久以前就成了一项不可能完成的任务。
缺点当然是打印的是一个巨大的位图。所以它很大。
如果您考虑 300 dpi A4 页面,每个分量 RGB 8 位,那么图像将是:
以英寸为单位的宽度 * 分辨率 (dpi) * 每个样本的位数 (24)
8.27 * 300 * 3 = 每扫描线 7443 字节
然后有:
以英寸为单位的高度 * 分辨率 (dpi) 页面上的扫描线 11.69 * 300 = 3507
所以我们将扫描线大小*扫描线数乘以得到图像大小:
7443 * 3507 = 26,102,601 字节或略低于 25 MB
因此,您的 5 MB 图像目标需要您压缩文件并获得至少 5:1 的压缩比。因此,一种解决方案是尝试压缩文件并在另一端解压缩。
现在,关于这个设备的一件事是它的属性是由打印机控制的。Ghostscript 设备查询打印机并根据打印机的分辨率自行调整。我怀疑您的打印机实际上设置为以 600 dpi 渲染,这就是为什么您的假脱机文件比建议的 300 dpi 分辨率大 4 倍的原因。
该设备也不支持降低颜色质量,除了单色(我怀疑你的 1.74MB 文件就是这样)。因此,您的选择是单色、每个分量 1 位 CMYK 或 24 位 RGB。
您可以在 Ghostscript 网站上找到有关 Ghostscript 设备的文档,并在此处找到此设备的详细信息
您唯一能做的(我还没有尝试过)就是设置 MaxResolution 参数。但正如我上面所展示的,这只会让你达到 25Mb。如果您想要低于此值,则必须进一步降低分辨率。进一步下降 5 倍意味着将分辨率降低一半以上。
看起来你会看到大约 135 dpi。
推荐阅读
- java - 显示 ArrayList(EJB 会话 + Servlet + JSP,无 JDBC)
- python-3.x - 将向量张量嵌入矩阵张量
- r - 生成两个具有相同 x 轴中断的图
- c# - 在 C# 中验证日期字符串的最佳方法
- sql - 在有计数中查找重复元素
- node.js - 更改 mp3 文件的作者
- uwp - Azure DevOps 中的 UWP AppxBundle - 错误 MSB4126 - x86|x64|ARM
- powershell - 使用 Powershell 基于现有 HP 电源计划创建高性能电源计划
- python - 跨 NumPy 数组矢量化字符串格式
- java - Raw Spring 5 和 Commons FileUpload 不起作用