Ghostscript 正在生成巨大的文件

Posted

技术标签:

【中文标题】Ghostscript 正在生成巨大的文件【英文标题】:Ghostscript is producing huge files 【发布时间】:2016-04-26 08:02:46 【问题描述】:

我正在使用 GhostPrint 打印一个非常简单的 PDF 文件。它只是一页,有 2 个单词,有两种不同的背景颜色。 PDF 文件为 86KB。 当我尝试使用 GhostScript 打印它时,它会在 17.5MB 或 95MB 上创建一个打印作业,具体取决于我的 BitsPerPixel。因为我希望它是彩色的,所以我尝试了 4 BitsPerPixel 和 24 BitsPerPixel。如果我使用 Adob​​e Reader 打印相同的文件,打印作业大约为 200KB,并且我发现打印质量没有差异。 我正在使用以下代码通过 C# 控制台应用程序进行打印:

            string printerName = "Konica Minolta PS Color Laser Class Driver";
            string ghostScriptPath = "C:\\Program Files (x86)\\gs\\gs9.19\\bin\\gswin32c.exe";
            string pdfFilePath = "C:\\Users\\TestUser\\Documents\\ColorTest.pdf";
            arguments += " -dPrinted -dBATCH -dNOPAUSE -dNOSAFER -q -BitsPerPixel=24 -dNumCopies=1 -sDEVICE=mswinpr2 -sOutputFile=\"\\\\spool\\" + printerName + "\" \"" + pdfFilePath + "\" ";
            ProcessStartInfo startInfo = new ProcessStartInfo();
            startInfo.Arguments = arguments;
            startInfo.FileName = ghostScriptPath;
            startInfo.UseShellExecute = false;

            startInfo.RedirectStandardError = true;
            startInfo.RedirectStandardOutput = true;

            Process process = Process.Start(startInfo);
            Console.WriteLine(process.StandardError.ReadToEnd() + process.StandardOutput.ReadToEnd());
            process.WaitForExit(30000);

            if (process.HasExited == false)
            
                process.Kill();
            
            Console.WriteLine("Exitcode: " + process.ExitCode);
            Console.ReadLine();

如何在不损失太多质量的情况下减小文件大小?我希望它可能,因为 Adob​​e Reader 可以做到。

PS。我知道在隐藏窗口等情况下使用 Adob​​e Reader,但这在我的用例中不起作用,因为我需要能够指定要使用的打印机、双面/单面、颜色/灰色和份数。

【问题讨论】:

【参考方案1】:

mswinpr2 设备通过以所选打印机的分辨率和颜色深度将输入渲染为位图来工作。 PDF 当然(至少可能)是一种矢量格式,因此可以拥有更紧凑的表示形式。

在一般情况下,没有方法可以从 Ghostscript 打印到 Windows 打印机并且不呈现内容,因此无法创建更小的文件。当然,由于您要打印到 PostScript 打印机(根据您的打印机名称猜测),您可以使用 ps2write 设备而不是 mswinpr2。由于 PostScript 也是一种矢量格式,因此更加紧凑。但是您将不会使用 mswinpr2 设备,您必须自己将生成的 PostScript 文件发送到打印机。

您发现中间假脱机文件的大小是个问题,对此我感到有些惊讶。您始终可以将输出直接发送到打印机,而不是使用 %printer% 语法假脱机。

【讨论】:

感谢您的回复。文件大小的问题是打印需要很长时间,尤其是在 PDF 较大的情况下。我将如何在 C# 中将 Postscript 文件发送到打印机? 从命令行 "copy /b device:" 其中 是文件的名称,而 device: 是设备所在端口的名称。 /b 表示二进制复制。我不知道你会如何从 C# 中做到这一点,我不是 C# 开发人员。自然打印需要很长时间,您在主机上渲染位图并将其发送到打印机,如果您发送 PostScript,那么繁重的工作就会被卸载到打印机,这针对该任务进行了优化,即使它有可用资源较少。 嗨,KenS。再次感谢您的回复。使用它,我可以更快地将其打印到打印件上。然而有一个问题。它不是双面打印的,即使我在创建 ps 文件时指定了 -dDuplex 。我正在使用:-sProcessColorModel=DeviceGray -sColorConversionStrategy=Gray -r300 -dSAFER -dBATCH -dNOPAUSE -dDuplex -sDEVICE=ps2write -sOutputFile=C:\\Users\\Soren\\Documents\\test.ps C:\\Users\ \Soren\\Documents\\DuplexTest.pdf"。你知道我如何通过 Ghostscript 创建一个 Postscript 文件,像你说的那样在将其复制到打印机时进行双面打印吗? -dDuplex 对 ps2write 没有任何作用,这是一个 IJS 选项(这就是它在 devices.htm 的 IJS 部分中的原因)。假设您使用的是最新版本的 Ghostscript,您可以使用 PSDocOptions distiller 参数将 Duplex 控制 PostScript 添加到 ps2write 的输出中。类似于 -c "> setpagedevice)>> setpagedevice" -f 之类的东西,如 VectorDevices.htm,第 6.5 节 PostScript 文件输出中所述。

以上是关于Ghostscript 正在生成巨大的文件的主要内容,如果未能解决你的问题,请参考以下文章

嗨,我正在寻找在 solaris 环境中将 docx 文件集转换为 pdf 的解决方案

如何使用 Ghostscript 和 Ghostscript .NET 通过嵌入 IIC 配置文件生成正确的 PDF/A

GhostScript 和 PDF/A?

Ghostscript 创建巨大的图像,比预期的像素多一个数量级

Ghostscript 和 pxlcolor:如何在生成的 PCL 中生成额外的 PJL 条目

Treepoem 条码生成器无法找到 ghostscript