private void ProcessNextJob_Group(NextJob next_job, string temp_ocr_result_filename)
        {
            // Check that this PDF has not failed before
            string check_failed_group_token = NextJob.GetCurrentJobToken(next_job.job, next_job.is_group);

            if (!failed_pdf_group_tokens.Contains(check_failed_group_token))
            {
                // Build up the page numbers string
                string page_numbers_string;
                {
                    int page_range_start = ((next_job.job.page - 1) / next_job.job.TEXT_PAGES_PER_GROUP) * next_job.job.TEXT_PAGES_PER_GROUP + 1;
                    int page_range_end   = page_range_start + next_job.job.TEXT_PAGES_PER_GROUP - 1;
                    page_range_end = Math.Min(page_range_end, next_job.job.pdf_renderer.PageCount);

                    StringBuilder sb = new StringBuilder();
                    for (int page = page_range_start; page <= page_range_end; ++page)
                    {
                        sb.Append(page);
                        sb.Append(',');
                    }
                    page_numbers_string = sb.ToString();
                    page_numbers_string = page_numbers_string.TrimEnd(',');
                }

                string ocr_parameters =
                    ""
                    + "GROUP"
                    + " "
                    + '"' + next_job.job.pdf_renderer.PDFFilename + '"'
                    + " "
                    + page_numbers_string
                    + " "
                    + '"' + temp_ocr_result_filename + '"'
                    + " "
                    + '"' + ReversibleEncryption.Instance.EncryptString(next_job.job.pdf_renderer.PDFUserPassword) + '"'
                    + " "
                    + '"' + next_job.job.language + '"'
                ;

                if (CheckOCRProcessSuccess(ocr_parameters))
                {
                    next_job.job.pdf_renderer.StorePageTextGroup(next_job.job.page, next_job.job.TEXT_PAGES_PER_GROUP, temp_ocr_result_filename);
                }
                else
                {
                    // If the group fails, then we queue it up for single OCR attempts...
                    string new_failed_group_token = NextJob.GetCurrentJobToken(next_job.job, next_job.is_group);
                    failed_pdf_group_tokens.Add(new_failed_group_token);

                    // ... and queue it up for single OCR attempts.
                    QueueJobSingle(next_job.job);
                }
            }
            else
            {
                // Queue previously failed attempts on this PDF file for single OCR attempts.
                QueueJobSingle(next_job.job);
            }
        }
        /// <summary>
        /// NB: This must be called inside the queue_lock!
        /// </summary>
        /// <param name="nextJob"></param>
        private void RecordThatJobHasStarted_LOCK(NextJob next_job, object queue_lock_REMINDER)
        {
            string           token        = NextJob.GetCurrentJobToken(next_job.job, next_job.is_group);
            HashSet <string> current_jobs = next_job.is_group ? current_jobs_group : current_jobs_single;

            if (current_jobs.Contains(token))
            {
                Logging.Error("Job is already running: {0}", token);
            }
            current_jobs.Add(token);
        }
Example #3
0
        public bool JobGroupHasNotFailedBefore(Job job)
        {
            string check_failed_group_token = NextJob.GetCurrentJobToken(job, true);

            //Utilities.LockPerfTimer l1_clk = Utilities.LockPerfChecker.Start();
            lock (queue_lock)
            {
                //l1_clk.LockPerfTimerStop();

                return(!failed_pdf_group_tokens.Contains(check_failed_group_token));
            }
        }
 private void RecordThatJobHasCompleted(NextJob next_job)
 {
     lock (queue_lock)
     {
         string           token        = NextJob.GetCurrentJobToken(next_job.job, next_job.is_group, false);
         HashSet <string> current_jobs = next_job.is_group ? current_jobs_group : current_jobs_single;
         if (!current_jobs.Contains(token))
         {
             Logging.Error("Job is not running, so can't remove it: " + token);
         }
         current_jobs.Remove(token);
     }
 }
        private void RecordThatJobHasCompleted(NextJob next_job)
        {
            string token = NextJob.GetCurrentJobToken(next_job.job, next_job.is_group);

            Utilities.LockPerfTimer l1_clk = Utilities.LockPerfChecker.Start();
            lock (queue_lock)
            {
                l1_clk.LockPerfTimerStop();
                HashSet <string> current_jobs = next_job.is_group ? current_jobs_group : current_jobs_single;
                if (!current_jobs.Contains(token))
                {
                    Logging.Error("Job is not running, so can't remove it: {0}", token);
                }
                current_jobs.Remove(token);
            }
        }
        private bool IsSimilarJobRunning(Job job, bool is_group, object queue_lock_REMINDER)
        {
            // Check if a similar group job is running
            if (current_jobs_group.Contains(NextJob.GetCurrentJobToken(job, true)))
            {
                return(true);
            }

            // If this is a single job, check if a similar single job is running
            if (!is_group)
            {
                if (current_jobs_single.Contains(NextJob.GetCurrentJobToken(job, false)))
                {
                    return(true);
                }
            }

            // No similar job is running...
            return(false);
        }
Example #7
0
        private void ProcessNextJob_Group(NextJob next_job, string temp_ocr_result_filename)
        {
            // Check that this PDF has not failed before
            if (JobGroupHasNotFailedBefore(next_job.job))
            {
                // Build up the page numbers string
                string page_numbers_string;
                {
                    int page_range_start = ((next_job.job.page - 1) / Job.TEXT_PAGES_PER_GROUP) * Job.TEXT_PAGES_PER_GROUP + 1;
                    int page_range_end   = page_range_start + Job.TEXT_PAGES_PER_GROUP - 1;
                    page_range_end = Math.Min(page_range_end, next_job.job.pdf_renderer.PageCount);

                    StringBuilder sb = new StringBuilder();
                    for (int page = page_range_start; page <= page_range_end; ++page)
                    {
                        sb.Append(page);
                        sb.Append(',');
                    }
                    page_numbers_string = sb.ToString();
                    page_numbers_string = page_numbers_string.TrimEnd(',');
                }

                string ocr_parameters =
                    ""
                    + "GROUP"
                    + " "
                    + '"' + next_job.job.pdf_renderer.DocumentPath + '"'
                    + " "
                    + page_numbers_string
                    + " "
                    + '"' + temp_ocr_result_filename + '"'
                    + " "
                    + '"' + ReversibleEncryption.Instance.EncryptString(next_job.job.pdf_renderer.PDFPassword) + '"'
                    + " "
                    + '"' + next_job.job.language + '"'
                ;

                // https://stackoverflow.com/questions/2870544/c-sharp-4-0-optional-out-ref-arguments
                if (CheckOCRProcessSuccess(ocr_parameters, out _))
                {
                    next_job.job.pdf_renderer.StorePageTextGroup(next_job.job.page, Job.TEXT_PAGES_PER_GROUP, temp_ocr_result_filename);
                }
                else
                {
                    // If the group fails, then we queue it up for single OCR attempts...
                    string new_failed_group_token = NextJob.GetCurrentJobToken(next_job.job, next_job.is_group);

                    //Utilities.LockPerfTimer l1_clk = Utilities.LockPerfChecker.Start();
                    lock (queue_lock)
                    {
                        //l1_clk.LockPerfTimerStop();

                        failed_pdf_group_tokens.Add(new_failed_group_token);
                    }

                    // ... and queue it up for single OCR attempts.
                    QueueJobSingle(next_job.job);
                }
            }
            else
            {
                // Immediately queue previously failed GROUP attempts on this PDF file as SINGLE OCR attempts instead,
                // without even trying the GROUP mode again, for it will certainly fail the second/third/etc.
                // time around as well.
                QueueJobSingle(next_job.job);
            }
        }