尝试使用具有并行循环的多个 GhostScript 实例进行打印。

Posted

技术标签:

【中文标题】尝试使用具有并行循环的多个 GhostScript 实例进行打印。【英文标题】:Trying to print using multiple instances of GhostScript with Parallel loop. 【发布时间】:2017-02-14 16:41:49 【问题描述】:

我有一个使用 GhostScript.NET 打印 PDF 文档的功能。如果一个用户尝试打印,一切都会正常工作,但是当多个用户尝试同时打印时,它不会打印所有文档。我认识到我将创建多个 ghostscript 实例以实现多个同时打印。我遇到了这个问题:

Ghostscript.NET Multithreading Issue

其中一位用户说要创建一个并行 forloop,但老实说,我不确定如何构造一个以便创建正确数量的 GhostScript 实例。

我有主要功能:

 public static void PrintFormPdfData(byte[] formPdfData, string printer)
    
        var filename = @"C:\TEMP\report.pdf";
        using (var file = new FileStream(filename, FileMode.Create, FileAccess.ReadWrite))
        
            file.Write(formPdfData, 0, formPdfData.Length);
            using (GhostscriptProcessor processor = new GhostscriptProcessor())
            
                List<string> switches = new List<string>();
                switches.Add("-empty");
                switches.Add("-dPrinted=false");
                switches.Add("-dBATCH");
                switches.Add("-dPDFFitPage");
                switches.Add("-dNOPAUSE");
                switches.Add("-dNOSAFER");
                switches.Add("-dNumRenderingThreads=3");
                switches.Add("-dNumCopies=1");
                switches.Add("-sDEVICE=mswinpr2");
                switches.Add("-sOutputFile=%printer%" + printer);
                switches.Add(filename);
                try
                
                    processor.StartProcessing(switches.ToArray(), null);
                
                catch (Exception ex)
                
                    Console.WriteLine(ex.Message);
                
                finally
                
                    File.Delete(filename);
                
            
        
    

任何帮助将不胜感激。

【问题讨论】:

您的代码的问题是您为所有调用者使用相同的文件路径 是的,我在下面解决了这个问题。 【参考方案1】:

我想出了如何使用 Parallel ForEach...这是我更新的代码,供有兴趣同时运行多个 ghostscript 实例的人使用:

public static void PrintingQueue(Queue<byte[]> printQueue, string printer, int copies)
    
        Parallel.ForEach(printQueue, (currentFile) =>
        
            currentFile = printQueue.Dequeue();
            PrintFormPdfData(currentFile, printer, copies);
        );
    

    private static void PrintFormPdfData(byte[] pdfFormBytes, string printer, int copies)
    
        var fileName = Path.GetTempFileName();
        using (var file = new FileStream(fileName, FileMode.Create, FileAccess.ReadWrite))
        
            file.Write(pdfFormBytes, 0, pdfFormBytes.Length);
            using (GhostscriptProcessor processor = new GhostscriptProcessor())
            
                List<string> switches = new List<string>();
                switches.Add("-empty");
                switches.Add("-dPrinted");
                switches.Add("-dBATCH");
                switches.Add("-dPDFFitPage");
                switches.Add("-dNOPAUSE");
                switches.Add("-dNOSAFER");
                switches.Add("-dNumRenderingThreads=3");
                switches.Add("-dNumCopies=1");
                switches.Add("-sOutputFile=%printer%" + printer);
                switches.Add("-sDEVICE=mswinpr2");
                switches.Add(fileName);
                try
                
                    processor.StartProcessing(switches.ToArray(), null);
                
                catch (Exception ex)
                
                    Console.WriteLine(ex.Message);
                
                file.Close();
            
            File.Delete(fileName);
        
    

【讨论】:

以上是关于尝试使用具有并行循环的多个 GhostScript 实例进行打印。的主要内容,如果未能解决你的问题,请参考以下文章

使用 ghostscript 将 .ps 转换为 .pcx

在不使用推力的情况下,每个线程具有多个元素的并行前缀总和

具有多个接收器的 pyspark 并行处理

并行运行多个子进程 - python 2.7

处理多个文件时 Ghostscript 出现致命错误

如何阻止 Ghostscript 和 pdfwrite 将图像分解为多个 XObject?