Не удалось получить диапазон печати (диапазон страниц) из Job в winspool.drv - PullRequest
0 голосов
/ 05 марта 2019

Я разработал виртуальный принтер, который создает файл .pdf в моей системе.Я использую redmon, ghostscript, postscript, c #.

, когда порт перенаправляет Redmon, я хочу получить диапазон страниц, введенный пользователем во время печати.Я могу получить количество копий и другие вещи, но не могу получить диапазон страниц (диапазон печати).Я пытаюсь ниже код, чтобы получить количество копий и другие вещи.но не в состоянии получить диапазон страниц.пожалуйста помогите ....

        working code

    // Get last job from queue by printer name
    // NOTE :- CALL AFTER THE JOB DONE
    public static JobPropertyModel GetLastJobByPrinterName(string PrinterName)
    {
        JobPropertyModel jobPropertyModel = new JobPropertyModel();

        StringCollection printJobCollection = new StringCollection();
        string searchQuery = "SELECT * FROM Win32_PrintJob";

        // query to get the jobs from queue
        ManagementObjectSearcher searchPrintJobs =
                  new ManagementObjectSearcher(searchQuery);
        ManagementObjectCollection prntJobCollection = searchPrintJobs.Get();

        foreach (ManagementObject prntJob in prntJobCollection)
        {
            // get job name 
            System.String jobName = prntJob.Properties["Name"].Value.ToString();
            char[] splitArr = new char[1];
            splitArr[0] = Convert.ToChar(",");

            string PrinterNameFromJob = jobName.Split(splitArr)[0];
            string documentName = prntJob.Properties["Document"].Value.ToString();

            // if job is from our(CIRF) printer
            if (String.Compare(PrinterNameFromJob, PrinterName, true) == 0)
            {
                // get job details
                jobPropertyModel.dEVMODE = GetJobDetail(prntJob);
                jobPropertyModel.printJob = prntJob;

                return jobPropertyModel;
            }
        }

        return jobPropertyModel;
    }


    private static DEVMODE GetJobDetail(ManagementObject thePrintJob)
    {
        UInt32 jobId = 0;
        UInt32 needed = 0;
        String printerName;
        bool result;

        DEVMODE dEVMODE = new DEVMODE();
        IntPtr printerHandle = new IntPtr(0);

        jobId = (UInt32)thePrintJob.Properties["JobId"].Value;
        printerName = (String)thePrintJob.Properties["DriverName"].Value;

        try
        {
            // open a printer Note => it will pause the printer for while
            result = OpenPrinter("CIRF", out printerHandle, IntPtr.Zero);

            // Get buffer size for that job
            var resultd = GetJob(printerHandle, jobId, 2, IntPtr.Zero, 0, out needed);

            // Allocate HGlobal as per job needed
            IntPtr buffer = Marshal.AllocHGlobal((int)needed);

            // get job detail 
            result = GetJob(printerHandle, jobId, 2, buffer, needed, out needed);

            // convert Pointer to structure
            JOB_INFO_2 jobInfo = (JOB_INFO_2)Marshal.PtrToStructure(buffer, typeof(JOB_INFO_2));

            // get job properties
            dEVMODE = (DEVMODE)Marshal.PtrToStructure(jobInfo.pDevMode, typeof(DEVMODE));

            // free the memory
            Marshal.FreeHGlobal(buffer);

            // realise the printer
            ClosePrinter(printerHandle);

            return dEVMODE;
        }
        catch (Exception ex)
        {
            return dEVMODE;
        }

    }
...