Ghostscript 正在生成巨大的文件
Ghostscript is producing huge files
我正在使用 GhostPrint 打印一个非常简单的 PDF 文件。它只有一页,只有两个字,有两种不同的背景颜色。 PDF 文件为 86KB。
当我尝试使用 GhostScript 打印它时,它会创建一个 17.5MB 或 95MB 的打印作业,具体取决于我的 BitsPerPixel。因为我希望它是彩色的,所以我尝试了 4 BitsPerPixel 和 24 BitsPerPixel。如果我使用 Adobe 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();
如何在不损失太多质量的情况下减小文件大小?我希望这是可能的,因为 Adobe Reader 可以做到。
PS。我知道将 Adobe Reader 与 window 隐藏等一起使用,但这在我的用例中不起作用,因为我需要能够指定要使用的打印机,duplex/simplex , color/grey 和份数.
mswinpr2 设备通过以所选打印机的分辨率和颜色深度将输入呈现为位图来工作。 PDF 当然(至少可能)是一种矢量格式,因此可以容纳更紧凑的表示形式。
在一般情况下 没有 方式从 Ghostscript 打印到 Windows 打印机并且不呈现内容,因此无法创建较小的文件。当然,由于您正在打印到 PostScript 打印机(从您的打印机名称猜测),您可以使用 ps2write 设备而不是 mswinpr2。由于 PostScript 也是一种矢量格式,因此更加紧凑。但是这样你就不会使用 mswinpr2 设备,你将不得不自己将生成的 PostScript 文件发送到打印机。
我有点惊讶你发现中间假脱机文件的大小是个问题。您始终可以将输出 直接 发送到打印机,而不是使用 %printer% 语法将其假脱机。
我正在使用 GhostPrint 打印一个非常简单的 PDF 文件。它只有一页,只有两个字,有两种不同的背景颜色。 PDF 文件为 86KB。 当我尝试使用 GhostScript 打印它时,它会创建一个 17.5MB 或 95MB 的打印作业,具体取决于我的 BitsPerPixel。因为我希望它是彩色的,所以我尝试了 4 BitsPerPixel 和 24 BitsPerPixel。如果我使用 Adobe 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();
如何在不损失太多质量的情况下减小文件大小?我希望这是可能的,因为 Adobe Reader 可以做到。
PS。我知道将 Adobe Reader 与 window 隐藏等一起使用,但这在我的用例中不起作用,因为我需要能够指定要使用的打印机,duplex/simplex , color/grey 和份数.
mswinpr2 设备通过以所选打印机的分辨率和颜色深度将输入呈现为位图来工作。 PDF 当然(至少可能)是一种矢量格式,因此可以容纳更紧凑的表示形式。
在一般情况下 没有 方式从 Ghostscript 打印到 Windows 打印机并且不呈现内容,因此无法创建较小的文件。当然,由于您正在打印到 PostScript 打印机(从您的打印机名称猜测),您可以使用 ps2write 设备而不是 mswinpr2。由于 PostScript 也是一种矢量格式,因此更加紧凑。但是这样你就不会使用 mswinpr2 设备,你将不得不自己将生成的 PostScript 文件发送到打印机。
我有点惊讶你发现中间假脱机文件的大小是个问题。您始终可以将输出 直接 发送到打印机,而不是使用 %printer% 语法将其假脱机。