使用GhostScript打印PDF

因为它拉了我一段时间,所以我需要你对以下问题的支持。 我们有一个小的c#实用程序,它使用GhostScript打印给定PDF 。 此打印按预期方式但未能保留页面格式。 但是,当我切换Adobe Acrobat代替GhostScript时,页面会按预期打印。 所以我认为,我在GhostScript的命令行参数上犯了一些明显的错误。

背景

以下是核心c#逻辑,它在每个页面上打印具有不同样式的给定PDF文件。 给定的PDF文件有页面;

  1. 字体样式和颜色不一致
  2. 某些页面具有正常的字体大小,而其他页面的打印格式非常小
  3. 一些页面有推荐的保证金,但其他页面的保证金很小
  4. 有些页面是彩色的,其余的是灰色的。
  5. 有些页面是风景风格,其他是肖像

简而言之,我试图打印的PDF只是一个整合(将单个pdf加入一个大型pdf)的大量小尺寸pdf文档,具有不同的字体样式,大小,边距。

问题

以下逻辑使用GhostScript(v9.02)打印PDF文件。 虽然以下逻辑打印任何给定的PDF,但它无法保留页面格式,包括页眉,页脚,字体大小,边距,方向 (我的pdf文件包含横向和纵向的页面)。

有趣的是,如果我使用acrobat reader打印相同的PDF,那么它将按预期打印以及所有页面级格式。

PDF标本: 第一节 , 第二节

  void PrintDocument() { var psInfo = new ProcessStartInfo(); psInfo.Arguments = String.Format( " -dPrinted -dBATCH -dNOPAUSE -dNOSAFER -q -dNumCopies=1 -sDEVICE=ljet4 -sOutputFile=\"\\\\spool\\{0}\" \"{1}\"", GetDefaultPrinter(), @"C:\PDFOutput\test.pdf"); psInfo.FileName = @"C:\Program Files\gs\gs9.10\bin\gswin64c.exe"; psInfo.UseShellExecute = false; using (var process= Process.Start(psInfo)) { process.WaitForExit(); } } 

我想你以前问了这个问题,从你的代码示例中也很清楚你使用的是GSView ,而不是Ghostscript

现在,虽然GSView确实使用Ghostscript来完成繁重的工作,但是您无法区分这两个应用程序。

您仍然没有提供要查看的示例PDF文件,也​​没有提供命令行,尽管您现在至少设法引用了Ghostscript版本。 您还需要提供一个命令行(不是我不准备通过阅读您的代码来组装它),您应该从命令行尝试这个,而不是在您自己的应用程序中,以显示它不是您的应用程序错误。

您应该考虑将Ghostscript升级到当前版本。

请注意,快速阅读代码表明您指定了许多命令行选项(例如-dPDFSETTINGS),这些选项仅适用于将文件转换为PDF,而不是用于任何其他目的(例如打印)。

正如我之前所说,提供一个样本文件来重现问题,以及一个导致问题的命令行(最好是Ghostscript命令行)。 知道你正在使用哪台打印机也可能有用,虽然我不太可能有重复测试。

答案 – 更新16/12/2013

我设法解决了这个问题,如果能够帮助其他人,我希望附上工作解决方案。 特别感谢’KenS’,因为他花了很多时间来指导我。

总而言之,我最终决定使用GSView和GhostScript来打印PDF以绕过Adobe。 核心逻辑如下:

  //PrintParamter is a custom data structure to capture file related info private void PrintDocument(PrintParamter fs, string printerName = null) { if (!File.Exists(fs.FullyQualifiedName)) return; var filename = fs.FullyQualifiedName ?? string.Empty; printerName = printerName ?? GetDefaultPrinter(); //get your printer here var processArgs = string.Format("-dAutoRotatePages=/All -dNOPAUSE -dBATCH -sPAPERSIZE=a4 -dFIXEDMEDIA -dPDFFitPage -dEmbedAllFonts=true -dSubsetFonts=true -dPDFSETTINGS=/prepress -dNOPLATFONTS -sFONTPATH=\"C:\\Program Files\\gs\\gs9.10\\fonts\" -noquery -dNumCopies=1 -all -colour -printer \"{0}\" \"{1}\"", printerName, filename); try { var gsProcessInfo = new ProcessStartInfo { WindowStyle = ProcessWindowStyle.Hidden, FileName = gsViewEXEInstallationLocation, Arguments = processArgs }; using (var gsProcess = Process.Start(gsProcessInfo)) { gsProcess.WaitForExit(); } } 

你可以使用GSPRINT 。

我设法通过仅在目录中复制gsprint.exe / gswin64c.exe / gsdll64.dll并从那里启动它来使其工作。

示例代码:

  // This uses gsprint (mind the paths) private const string gsPrintExecutable = @"C:\gs\gsprint.exe"; private const string gsExecutable = @"C:\gs\gswin64c.exe"; string pdfPath = @"C:\myShinyPDF.PDF" string printerName = "MY PRINTER"; string processArgs = string.Format("-ghostscript \"{0}\" -copies=1 -all -printer \"{1}\" \"{2}\"", gsExecutable, printerName, pdfPath ); var gsProcessInfo = new ProcessStartInfo { WindowStyle = ProcessWindowStyle.Hidden, FileName = gsPrintExecutable , Arguments = processArgs }; using (var gsProcess = Process.Start(gsProcessInfo)) { gsProcess.WaitForExit(); }