Printing 使用不带Adobe的Ghostscript在理光MP 4000打印机上批量打印PDF文件

Printing 使用不带Adobe的Ghostscript在理光MP 4000打印机上批量打印PDF文件,printing,ghostscript,Printing,Ghostscript,我有一个要求,每天打印一堆现有的PDF文件到网络理光MP 4000打印机。我需要使用“HoldPrint”作业类型选项打印这些。我可以直接打印它,但我希望它做一个保持打印,不会与其他用户的打印混淆。我正在使用GhostScript9.10 直接打印(通过“Maciej”帖子中的函数调用): “-dPrinted-dBATCH-dNOPAUSE-dNOSAFER-qQUIET-sjobtype=holdprint-suserid=abc-dNumCopies=1-sDEVICE=ljet4-sOu

我有一个要求,每天打印一堆现有的PDF文件到网络理光MP 4000打印机。我需要使用“HoldPrint”作业类型选项打印这些。我可以直接打印它,但我希望它做一个保持打印,不会与其他用户的打印混淆。我正在使用GhostScript9.10 直接打印(通过“Maciej”帖子中的函数调用):

“-dPrinted-dBATCH-dNOPAUSE-dNOSAFER-qQUIET-sjobtype=holdprint-suserid=abc-dNumCopies=1-sDEVICE=ljet4-sOutputFile=\”\\spool\PrinterName\“\”C:\Printing\mypdffile.pdf\”

看起来我正在覆盖jobtype开关,但不确定如何获取它

我尝试了不同的组合,但根本不起作用。非常感谢您的帮助

-dPrinted-dBATCH-dNOPAUSE-dNumCopies=1-sDEVICE=ljet4-sOutputFile=%printer%printerName“C:\Printing\mypdffile.pdf”

更新:这是适合我的版本

        /*
         * Printer used: Ricoh Aficio MP 4000
         * Purpose: To print PDF files as a scheduled job to a network printer.
         * The files will be queued under a specific user id. 
         * The user prints the files under his account.
         * Pre-requisite: Install the network printer on the job server 
         * Manually configure Printer Job settings with user id 
         * and Job type set to "Hold Print" 
         */ 
        string _sourceFolder = “PDFFilesFolderPath”;
        DirectoryInfo di = new DirectoryInfo(_sourceFolder);
        var files = di.GetFiles().OrderBy(f => f.Name);
        string _printer = "BMIS"; // Printer name as seen in the Devices and Printers section
        foreach (var f in files)
        {
            PrintPDF(@"C:\Program Files\gs\gs9.10\bin\gswin32c.exe", 1, _printer, f.FullName);
        }


    /// <summary>
    /// Print PDF.
    /// </summary>
    /// <param name="ghostScriptPath">The ghost script path. Eg "C:\Program Files\gs\gs9.10\bin\gswin32c.exee"</param>
    /// <param name="numberOfCopies">The number of copies.</param>
    /// <param name="printerName">Exact name of the printer as seen under Devices and Printers.</param>
    /// <param name="pdfFileName">Name of the PDF file.</param>
    /// <returns></returns>

    public bool PrintPDF(string ghostScriptPath, int numberOfCopies, string printerName, string pdfFullFileName )
    {

        try
        {
            ProcessStartInfo startInfo = new ProcessStartInfo();
            startInfo.Arguments = " -dPrinted -dNoCancel=true -dBATCH -dNOPAUSE -dNOSAFER -q -dNumCopies=" + Convert.ToString(numberOfCopies) + " -sDEVICE=mswinpr2 -sOutputFile=%printer%" + printerName + " \"" + pdfFullFileName + "\"";

            startInfo.FileName = ghostScriptPath;
            startInfo.UseShellExecute = false;
            startInfo.WindowStyle = ProcessWindowStyle.Hidden;
            Process process = Process.Start(startInfo);
            process.WaitForExit(30000);
            if (process.HasExited == false) process.Kill();
            return process.ExitCode == 0;
        }
        catch (Exception ex)
        {
            System.Diagnostics.EventLog.WriteEntry("Application", ex.Message, EventLogEntryType.Error);
            throw;
        }
    }
/*
*所用打印机:理光AFICO MP 4000
*用途:将PDF文件作为计划作业打印到网络打印机。
*文件将在特定用户id下排队。
*用户打印其帐户下的文件。
*先决条件:在作业服务器上安装网络打印机
*使用用户id手动配置打印机作业设置
*和作业类型设置为“保持打印”
*/ 
字符串_sourceFolder=“PDFFilesFolderPath”;
DirectoryInfo di=新的DirectoryInfo(\u sourceFolder);
var files=di.GetFiles().OrderBy(f=>f.Name);
字符串_printer=“BMIS”//打印机名称,如“设备和打印机”部分所示
foreach(文件中的var f)
{
PrintPDF(@“C:\ProgramFiles\gs\gs9.10\bin\gswin32c.exe”,1,_printer,f.FullName);
}
/// 
///打印PDF。
/// 
///鬼脚本路径。例如“C:\ProgramFiles\gs\gs9.10\bin\gswin32c.exee”
///副本的数量。
///打印机的确切名称,如“设备和打印机”下所示。
///PDF文件的名称。
/// 
public bool PrintPDF(字符串ghostScriptPath、int numberOfCopies、字符串printerName、字符串pdfFullFileName)
{
尝试
{
ProcessStartInfo startInfo=新的ProcessStartInfo();
startInfo.Arguments=“-dPrinted-dNoCancel=true-dBATCH-dNOPAUSE-dNOSAFER-q-dNumCopies=“+Convert.ToString(numberOfCopies)+”-sDEVICE=mswinpr2-sOutputFile=%printer%”+printerName+“\”“+pdfFullFileName+”;
startInfo.FileName=ghostScriptPath;
startInfo.UseShellExecute=false;
startInfo.WindowStyle=ProcessWindowStyle.Hidden;
过程=过程启动(startInfo);
过程:外国退出(30000);
如果(process.HasExited==false)process.Kill();
return process.ExitCode==0;
}
捕获(例外情况除外)
{
System.Diagnostics.EventLog.WriteEntry(“应用程序”,例如消息,EventLogEntryType.Error);
投
}
}

Ghostscript既没有“jobtype”开关,也没有suserid开关,因此它们没有效果也就不足为奇了。可能你引用的帖子有更多的信息,但我找不到任何这样的帖子,也许你可以指向它(URL)

[稍后]

Setup.ps需要是一个PostScript文件(因为Ghostscript就是这样理解的,它是一个PostScript解释器)。从要设置DocumentName的文档中,DocumentName是用户设置词典的成员,因此:

mark
    /UserSettings <<
        /DocumentName (My name goes in here)
    >>
    (mswinpr2) finddevice
    putdeviceprops
setdevice
标记
/用户设置>
(mswinpr2)finddevice
Putteviceprops
设定装置
空白只是为了清楚起见。这几乎是从示例中逐字删除的

因此,您需要修改为每个作业发送的“setup.ps”。您可以为每个文件编写一个自定义setup.ps,也可以使用GS的“PostScript输入”功能,并使用-c和-f开关在命令行上提供setup.ps的全部内容。setup.ps所做的只是在运行自己的PostScript程序之前运行其中的PostScript(假设在命令行中将setup.ps放在PostScript程序之前)


事实上,这相当令人讨厌,这不是设备的正常配置方式,但mswinpr2设备最初是由Ghostscript团队之外的人编写的,大概是批量采用的。

谢谢Ken。我找到了部分解决方案。“-dPrinted-dBATCH-dNOPAUSE-dNOSAFER-q-dNumCopies=“+Convert.ToString(numberOfCopies)+”-sDEVICE=mswinpr2-sOutputFile=%printer%”+printerName+“\”“+pdfFullFileName+”\”;唯一的问题是,我通过打印机的config选项卡直接在打印机上控制Job type属性。现在我遇到的问题是,打印队列中的所有作业都被命名为Ghost script document.search to find动态发送文档名。到目前为止没有成功。从gs站点,它使用setup.ps文件完成,但不确定如何发送每个docname!这是我最初提到的帖子:我不确定我是否真的理解你的问题,不管是什么问题,听起来都与Ghostscript无关。如果您自己控制打印机,那么工作名称肯定由您决定吗?如果您参考正在阅读的Ghostscript文档(这些文档作为HTML文件提供,您不需要使用该网站),也可能会有所帮助。抱歉,不清楚。在“打印机设置”中设置作业文档名称对正在打印的所有PDF文件使用相同的名称,但我希望显示队列中每个文档的唯一名称。我有屏幕截图,但不知道如何上传。下面的链接提供了setup.ps文件的更多详细信息,以通过脚本提供documetname。第10.2节和第10.3节感谢You Ken将这一点讲清楚,并对其他人有用。我刚刚了解到,根据我们的代理政策,只有Adobe是允许的!每个人都想