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); }
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); }
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); } }