首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >使用GhostScript打印PDF

使用GhostScript打印PDF
EN

Stack Overflow用户
提问于 2013-12-11 16:16:18
回答 4查看 20.1K关注 0票数 5

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

背景

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

  1. 字体样式和颜色不一致
  2. 有些页面具有正常的字体大小,而另一些页面则以非常小的字体打印。
  3. 有些页面建议页边距,但另一些页的页边距很小。
  4. 有些书页是彩色的,其余的是灰色的。
  5. 有些书页是风景画,而另一些则是肖像。

简洁地说,我试图打印的PDF只不过是一个整合(将单个pdfs合并成一个大pdf),它包含了许多不同字体、大小、边距的pdf文档。

问题

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

有趣的是,如果我使用acrobat阅读器打印相同的PDF,那么它将与所有页面级别的格式一起按预期打印。

样本:第一节第二节

代码语言:javascript
运行
复制
  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();
        }
    }
EN

回答 4

Stack Overflow用户

回答已采纳

发布于 2013-12-16 11:59:56

答案-更新16/12/2013

我设法把它修好了,如果它能帮助别人的话,我想把它封装起来。特别感谢'KenS‘,因为他花了很多时间来指导我。

总之,我最终决定使用GSView和GhostScript一起打印PDF以绕过Adobe。核心逻辑给出如下;

代码语言:javascript
运行
复制
 //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();

                }

        }
票数 2
EN

Stack Overflow用户

发布于 2013-12-11 16:31:13

我认为您以前问过这个问题,而且从您的代码示例中也可以很清楚地看到,您使用的是GSView,而不是Ghostscript。

现在,虽然GSView确实使用Ghostscript来完成繁重的任务,但您无法区分这两个应用程序,这是一个值得关注的问题。

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

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

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

因此,正如我前面所说的,提供一个示例文件来再现问题,并提供一个命令行(最好是Ghostscript命令行)来造成问题。知道您使用的打印机可能也是有用的,虽然这是极不可能的,我将有一个重复的测试。

票数 2
EN

Stack Overflow用户

发布于 2014-10-17 07:50:06

你可以用GSPRINT

我只将gsprint.exe/gswin64c.exe/gsdll64.dll复制到目录中并从目录中启动,从而成功地使其工作。

样本代码:

代码语言:javascript
运行
复制
    // 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();

            }
票数 2
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/20524323

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档