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



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

Ghostscript.NET 多线程问题

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

我有主要功能:

 public static void PrintFormPdfData(byte[] formPdfData, string printer)
    {
        var filename = @"C:TEMPreport.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);
                }
            }
        }
    }

任何帮助将不胜感激。

我想出了如何使用并行...这是我为任何有兴趣运行多个 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);
        }
    }

最新更新