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