Ghostscript.NET 忽略后记

Posted

技术标签:

【中文标题】Ghostscript.NET 忽略后记【英文标题】:Ghostscript.NET ignores postscript 【发布时间】:2016-09-08 10:11:14 【问题描述】:

当我在 windows cmd 中使用带有 setup.ps postscript 文件的 ghostscript 时,它会完美地打印我的 pdf。

setup.ps

mark
/OutputFile (%printer%HP LaserJet 1018)
/BitsPerPixel  1 
/NoCancel false     
/UserSettings
   <<
      /DocumentName(document) 
      /MaxResolution 360  
   >>

(mswinpr2)finddevice 
putdeviceprops
setdevice
    <<
      /BeginPage 10 -55 translate
    >>
setpagedevice

命令行

start /d "C:\Program Files (x86)\gs\gs9.19\bin" gswin32.exe -sOutputFile="%printer%HP LaserJet 1018" -dBATCH -dNOPAUSE -dFIXEDMEDIA setup.ps a.pdf

(我不知道为什么它需要在 setup.ps 和命令行中使用 sOutputFile 但否则它不起作用)

现在,当我在使用 Ghostscript.NET 包装器的 C# 项目中放置相同的开关时。

  private static void CreateSetupPsFile(string printername)
    
        const string Translationstring = @"10 -15 translate";
        string ps = $@"
                      mark
                /OutputFile (%printer%printername)
                /BitsPerPixel  1 
                /NoCancel false     % don't show the cancel dialog
                /UserSettings
                    <<
                    /DocumentName(document) % name for the Windows spooler
                    /MaxResolution 360  
                    >>

                (mswinpr2)finddevice % select the Windows device driver
                putdeviceprops
              setdevice
                    <<
                    /PageOffset [30 -30] 
                    >>
                    setpagedevice";
        File.WriteAllText("setup.ps", ps);

    

    private static void PrintA4(string pdfFileName, PrinterSettings printerSettings)
    
        using (var processor = new GhostscriptProcessor(GsDll))
        
            CreateSetupPsFile(printerSettings.PrinterName);
            var switches = new List<string>
            
                $"-sOutputFile=\"%printer%printerSettings.PrinterName\"",
                @"-dBATCH",
                @"-dNOPAUSE",
                @"-dFixedMedia",
                "setup.ps",
                "-f",
                pdfFileName

            ;
            processor.StartProcessing(switches.ToArray(), null);

    

它完全忽略了 setup.ps 文件中的所有内容。 有谁知道为什么?它只是忽略并且不说出了什么问题

提前谢谢你

更新

我设法运行了一些 poscript... 显然包装器需要像这样给出后记:

 var switches = new List<string>
                

                    @"-dBATCH",
                    @"-dNOPAUSE",
                    @"-sDEVICE=mswinpr2",
                    $@"-sOutputFile=%printer%printerSettings.PrinterName",
                    "-c",
                    $"<</BeginPage translateString>> setpagedevice",
                    "-f",
                    pdfFileName

                ;
                processor.StartProcessing(switches.ToArray(), null);

不是这样的:

 var switches = new List<string>
                

                    @"-dBATCH",
                    @"-dNOPAUSE",
                    @"-sDEVICE=mswinpr2",
                    $@"-sOutputFile=%printer%printerSettings.PrinterName",
                    $"-c <</BeginPage translateString>> setpagedevice -f",
                    pdfFileName

                ;
                processor.StartProcessing(switches.ToArray(), null);

真是难以置信。

【问题讨论】:

是的,您必须使用 -c 来引入 PostScript,我没有意识到您正在这样做,因为您的原始示例不包含它,它只是运行 setup.ps。虽然 -f 不是必需的(因为您没有使用 -c),但它没有害处,所以我没有费心提及它。 .NET 代码希望将开关分开似乎确实很奇怪,但我无法帮助您,我对那里的代码一无所知。 现在我只是在尝试一切,而且我意识到这些开关是区分大小写的。我放弃了 setup.ps 的解决方案,我试图让它工作.. 不知何故 那是因为开关是PostScript,而且PostScript是区分大小写的...... 【参考方案1】:

你怎么知道它忽略了 setup.ps 中的内容?

在 PostScript 程序中添加一些调试,例如

(Inside setup.ps) == flush

我看到的第一件也是最明显的事情是你认为 setup.ps 包含:

<<
  /BeginPage 10 -55 translate
>>
setpagedevice

但您创建 setup.ps 的代码包含:

                <<
                /PageOffset [30 -30] 
                >>
                setpagedevice";

显然这些不一样,这让我怀疑你正在执行你认为的 PostScript 代码。

你对我上一个问题的回答进展如何?

添加一个示例以在不使用 setup.ps 或非标准扩展的情况下完成所有 hacky setup.ps 的工作。

首先,您不需要使用 finddevice、putdeviceprops 或 setdevice。只需在命令行上设置设备并使用 setpagedevice 设置属性。这是标准 PostScript 和设备的配置方式。 Ghostscript 可能会在幕后使用其非标准的东西,但您不必担心。

比如:

gswin32 -sDEVICE=mswinpr2 -sOutputFile=%printer%PrinterName -c "<</BitsPerPixel 1 /NoCancel false /DocumentName (dummy) /MaxResolution 360 /BeginPage 10 10 translate>> setpagedevice" -f PDF.pdf

因为您没有使用 finddevice/putdeviceprops/setdevice,所以您不必为尝试设置 OutputFile 两次而烦恼。我假设您确实想要 BeginPage 而不是 PageOffset。我不知道你是否真的想要所有这些特定于设备的设置,因为我不知道你使用的是什么打印机,所以我把它们留下了。

显然我无法测试这个,因为我没有你的打印机,但它应该可以工作。 setup.ps 中的所有乱七八糟的东西都是坏消息,如果可能的话,我会避免它。

【讨论】:

啊,是的,我把以前版本的 setup.ps 放在那里,我的错。 (Inside setup.ps) == flush 到底是做什么的?另外我在哪里可以得到一些后记教程,因为这对我来说都是胡言乱语。无论如何,问题不是错误的设置,而是包装器什么都不做。它在命令行中一切正常,包括我上一个问题的解决方案,但包装器只是完全忽略任何东西并每次打印相同的确切内容...... 主要参考的是 PostScript 语言参考手册,还有蓝皮书和绿皮书(教程和食谱)。所有这些都可以从 Adob​​e 网站获得(在某个地方,他们一直在更改它)。我不知道您所说的“包装器”是什么意思。如果您的意思是 setup.ps,那么它不是包装器,而是一段程序代码。如果您发现我对您上一个问题的回答很有用,那么这里的礼仪就是接受答案......我再次回到“你怎么知道 setup.ps 什么都不做?”我看不到任何证据表明它正在被处决。如果不是,那么它将“什么都不做” 我也不会使用你在 setup.ps 中的所有内容,它使用 Ghostscript 特定的非标准扩展来处理特定于驱动程序的设置。除非你有需要,否则我会全部放弃。 通过“包装器”我的意思是:ghostscriptnet.codeplex.com 我再次重申,当它们在命令行中运行时,开关没有任何问题。在 .NET 中用于运行 ghostscript 库的 WRAPPER 使用相同的输入为我提供了完全不同的输出并剪辑了所有内容 对,但是您没有显示任何证据表明“包装器”实际上正在执行 setup.ps。避免使用它的一个很好的理由。您不需要它,您可以直接从命令行完成所有设置工作,而无需使用所有 hacky PostScript 扩展。我将添加一个没有它的例子(我相信)感谢您接受我之前的回答:-)

以上是关于Ghostscript.NET 忽略后记的主要内容,如果未能解决你的问题,请参考以下文章

Ghostscript.NET 图片文字质量问题

Ghostscript.net 多线程问题

Ghostscript.net 打印 pdf 页面方向

在 ASP.NET Azure 网站上使用 Ghostscript.Net

使用 Ghostscript.NET 包装器打印 PDF - 空白页

Ghostscript.NET 多线程问题