private WorkflowProcessingResult ProcessWorkflow(PDFApi pdfApiInstance, ImageApi imageApiInstance, OperationsWorkflow workflow, FileToProcess fileToProcess, int workerNumber) { List <string> warningMessages = new List <string>(); bool contentRemoved = false; bool versionChanged = false; bool linearized = false; string fileID = null; foreach (Operation operation in workflow.OperationsToBePerformed) { Error actionError = null; ReduceErrorInfo reduceErrorInfo = null; long remainingTokens = 0; if (_cancellationPending) { return(null); } switch (operation.Type) { case Operation.OperationType.LoadPDF: PdfVersion outputVersion = (PdfVersion)operation.Parameters; PdfLoadDocumentResponse loadDocumentResponse = HandleLoadPDF(pdfApiInstance, outputVersion, fileToProcess, workerNumber); if (loadDocumentResponse == null) { OnError(LogMessagesUtils.ReplaceMessageSequencesAndReferences(FrameworkGlobals.MessagesLocalizer.GetString("message_invalid_response_received", FrameworkGlobals.ApplicationLanguage), actionName: "Load")); return(null); } remainingTokens = loadDocumentResponse.RemainingTokens; actionError = loadDocumentResponse.Error; fileID = loadDocumentResponse.FileId; break; case Operation.OperationType.LoadImage: ImageLoadResponse imageLoadResponse = HandleLoadImage(imageApiInstance, fileToProcess, workerNumber); if (imageLoadResponse == null) { OnError(LogMessagesUtils.ReplaceMessageSequencesAndReferences(FrameworkGlobals.MessagesLocalizer.GetString("message_invalid_response_received", FrameworkGlobals.ApplicationLanguage), actionName: "Load")); return(null); } remainingTokens = imageLoadResponse.RemainingTokens; actionError = imageLoadResponse.Error; fileID = imageLoadResponse.FileId; break; case Operation.OperationType.ReducePDF: PDFReduceActionConfiguration reduceActionConfiguration = (PDFReduceActionConfiguration)operation.Parameters; PdfReduceResponse reduceResponse = HandleReducePDF(pdfApiInstance, reduceActionConfiguration, fileToProcess, fileID, workerNumber, warningMessages); if (reduceResponse == null) { OnError(LogMessagesUtils.ReplaceMessageSequencesAndReferences(FrameworkGlobals.MessagesLocalizer.GetString("message_invalid_response_received", FrameworkGlobals.ApplicationLanguage), actionName: "Reduce")); return(null); } remainingTokens = reduceResponse.RemainingTokens; contentRemoved = reduceResponse.ContentRemoved; versionChanged = reduceResponse.VersionChanged; actionError = reduceResponse.Error; reduceErrorInfo = reduceResponse.ErrorInfo; linearized = reduceActionConfiguration.FastWebView; break; case Operation.OperationType.OCRPDF: PDFOCRActionConfiguration ocrActionConfiguration = (PDFOCRActionConfiguration)operation.Parameters; PdfOCRResponse ocrResponse = HandleOCRPDF(pdfApiInstance, ocrActionConfiguration, fileToProcess, fileID, workerNumber); if (ocrResponse == null) { OnError(LogMessagesUtils.ReplaceMessageSequencesAndReferences(FrameworkGlobals.MessagesLocalizer.GetString("message_invalid_response_received", FrameworkGlobals.ApplicationLanguage), actionName: "OCR")); return(null); } remainingTokens = ocrResponse.RemainingTokens; actionError = ocrResponse.Error; break; } if (actionError != null) { string errorMessage = reduceErrorInfo != null && reduceErrorInfo.ErrorCode != ReduceErrorCode.OK ? ErrorManager.GetMessageFromReduceActionError(reduceErrorInfo, fileToProcess.FileAbsolutePath) : ErrorManager.GetMessageFromPassportPDFError(actionError, operation.Type, fileToProcess.FileAbsolutePath); OnError(errorMessage); return(null); } else { RemainingTokensUpdateEventHandler.Invoke(remainingTokens); } } return(new WorkflowProcessingResult(contentRemoved, versionChanged, linearized, fileID, warningMessages)); }
public void Start(int workerCount, string destinationFolder, FileProductionRules fileProductionRules, OperationsWorkflow workflow, string apiKey) { lock (_locker) { _cancellationPending = false; } InitializeApiInstances(out PDFApi pdfApiInstance, out ImageApi imageApiInstance, apiKey); destinationFolder = ParsingUtils.EnsureFolderPathEndsWithBackSlash(destinationFolder); bool fileSizeReductionIsIntended = OperationsWorkflowUtilities.IsFileSizeReductionIntended(workflow); for (int i = 1; i <= workerCount; i++) { int workerNumber = i; // Launch the workers. Thread thread = new Thread(() => Process(pdfApiInstance, imageApiInstance, workerNumber, fileProductionRules, workflow, destinationFolder, fileSizeReductionIsIntended)); thread.Start(); _busyWorkersCount++; } }
private void Process(PDFApi pdfApi, ImageApi imageApi, int workerNumber, FileProductionRules fileProductionRules, OperationsWorkflow workflow, string destinationFolder, bool fileSizeReductionIsIntended) { while (PickFile(out FileToProcess fileToProcess)) { if (_cancellationPending) { break; } try { long inputFileSize = FileUtils.GetFileSize(fileToProcess.FileAbsolutePath); bool inputIsPDF = Path.GetExtension(fileToProcess.FileAbsolutePath).ToUpper() == ".PDF"; if (!CheckInputFileSizeValidity(inputFileSize, fileToProcess.FileAbsolutePath)) { continue; } WorkflowProcessingResult workFlowProcessingResult = ProcessWorkflow(pdfApi, imageApi, workflow, fileToProcess, workerNumber); if (workFlowProcessingResult != null) { string outputFileAbsolutePath = destinationFolder + fileToProcess.FileRelativePath; bool fileSuccesfullyProcessed = HandleOutputFileProduction(fileToProcess, workFlowProcessingResult.FileID, workerNumber, workflow.SaveOperation, workflow.SaveOperationConfiguration, pdfApi, imageApi, fileProductionRules, workFlowProcessingResult, fileSizeReductionIsIntended, inputIsPDF, inputFileSize, outputFileAbsolutePath); TryCloseDocumentAsync(pdfApi, workFlowProcessingResult.FileID); if (fileSuccesfullyProcessed) { OnFileSuccesfullyProcessed(new FileOperationsResult(fileToProcess.FileAbsolutePath, inputFileSize, FileUtils.GetFileSize(outputFileAbsolutePath), !inputIsPDF), workFlowProcessingResult.WarningMessages); } else { continue; } } } catch (Exception exception) { OnError(ErrorManager.GetMessageFromException(exception, fileToProcess.FileAbsolutePath)); } if (_workPaused && !_cancellationPending) { // If pause has been requested, wait for resume signal WorkerPauseEventHandler.Invoke(workerNumber); _waitHandle.WaitOne(); } } OnWorkerWorkCompletion(workerNumber); }