コード例 #1
0
        public async Task <string> ConvertFile(string file, string destinationExtension)
        {
            var fi = new FileInfo(file);

            Log.Information("Start converting file: {FullName}", fi.FullName);

            try
            {
                var stopWatch = new Stopwatch();
                stopWatch.Start();

                var conversionSettings = new JobInitRequest
                {
                    FileNameWithExtension = fi.Name,
                    RequestedProcessType  = ProcessType.Rendering
                };

                var registrationResponse = await jobInitRequestClient.Request(conversionSettings);

                if (registrationResponse.IsInvalid)
                {
                    throw new Exception($"JobInit request was not valid. Error message: {registrationResponse.ErrorMessage}");
                }

                Log.Information("Successfully registered job for conversion of file {Name}. Got job id {JobId}", fi.Name,
                                registrationResponse.JobGuid);

                await UploadFile(registrationResponse, fi);

                Log.Information("File '{Name}' uploaded", fi.Name);

                var requestSettings = new ConversionStartRequest
                {
                    JobGuid = registrationResponse.JobGuid,
                    DestinationExtension = destinationExtension
                };

                Log.Information("Sent actual conversion request for job id {jobGuid}", registrationResponse.JobGuid);
                var convertionResponse = await conversionRequestClient.Request(requestSettings);

                if (convertionResponse.IsInvalid)
                {
                    throw new Exception(convertionResponse.ErrorMessage);
                }

                var result = await DownloadAndStoreFile(convertionResponse, fi.Directory);

                Log.Information(
                    $"Retrieved conversion result for file {fi.FullName} in {stopWatch.ElapsedMilliseconds} ms. Length of content is {result.LengthOfContent} bytes.");

                return(result.TargetPath);
            }
            catch (Exception ex)
            {
                Log.Error(ex, "Unexpected error while converting file {FullName}", fi.FullName);
                throw;
            }
        }
コード例 #2
0
        public JobInitResult RegisterNewJob(JobInitRequest jobInitRequest)
        {
            if (fileServer == null)
            {
                throw new InvalidOperationException("Sftp server is not configured and started");
            }

            try
            {
                // Create a new unique user and a unique directory for that user
                var newJobGuid = Guid.NewGuid().ToString("N");
                var user       = new FileServerUser(newJobGuid, password);
                Debug.Assert(user != null);
                var di = GetJobDirectory(newJobGuid);
                di.Create();

                // Create a sftp file system object and assign it to the user.
                var localFileSystem = CreateFileSystem(di.FullName);
                user.SetFileSystem(localFileSystem);
                lock (fileServerLock)
                {
                    fileServer.Users.Add(user);
                }

                var jobInitResult = new JobInitResult
                {
                    JobGuid   = newJobGuid,
                    User      = user.Name,
                    Password  = password,
                    UploadUrl = baseAddress,
                    Port      = port
                };

                // Add the information about the job to our local in memory storage
                var jobInfoDetails = new JobInfoDetails {
                    Request = jobInitRequest, Result = jobInitResult
                };
                jobStorage.AddOrUpdate(newJobGuid, jobInfoDetails, (k, v) => v);

                return(jobInitResult);
            }
            catch (Exception e)
            {
                Log.Error(e, e.Message);
                return(new JobInitResult
                {
                    IsInvalid = true,
                    ErrorMessage = e.Message
                });
            }
        }
コード例 #3
0
        public void Test(string sourceFolder)
        {
            try
            {
                LogConfigurator.ConfigureForService();

                var initClient               = CreateJobInitRequestClient();
                var extractionClient         = CreateDocumentExtractionRequestClient();
                var conversionClient         = CreateDocumentConversionRequestClient();
                var supportedFileTypesClient = CreateSupportedFileTypesRequestClient();

                // Create the target ouptut folder as subdirectory. Make sure it is empty
                var targetFolder = new DirectoryInfo(Path.Combine(sourceFolder, "Output"));
                if (targetFolder.Exists)
                {
                    targetFolder.Delete(true);
                }

                targetFolder.Create();

                var sourceFiles = new DirectoryInfo(sourceFolder).GetFiles("*.*", SearchOption.AllDirectories);
                var jobs        = new List <JobInitRequest>();

                foreach (var sourceFile in sourceFiles)
                {
                    var extractionJob = new JobInitRequest
                    {
                        FileNameWithExtension = sourceFile.FullName,
                        RequestedProcessType  = ProcessType.TextExtraction
                    };

                    var conversionJob = new JobInitRequest
                    {
                        FileNameWithExtension = sourceFile.FullName,
                        RequestedProcessType  = ProcessType.Rendering
                    };

                    jobs.Add(extractionJob);
                    jobs.Add(conversionJob);
                }

                // Print out supported file types
                var conversionSupportedFileTypes = supportedFileTypesClient
                                                   .Request(new SupportedFileTypesRequest {
                    ProcessType = ProcessType.Rendering
                }).GetAwaiter().GetResult();
                var extractionSupportedFileTypes = supportedFileTypesClient
                                                   .Request(new SupportedFileTypesRequest {
                    ProcessType = ProcessType.TextExtraction
                }).GetAwaiter().GetResult();
                Console.WriteLine($"Supported types for conversion: {string.Join(", ", conversionSupportedFileTypes.SupportedFileTypes)}");
                Console.WriteLine($"Supported types for text extraction: {string.Join(", ", extractionSupportedFileTypes.SupportedFileTypes)}");
                Console.WriteLine("");

                foreach (var job in jobs)
                {
                    // Init Job
                    var jobInitResult = initClient.Request(job).GetAwaiter().GetResult();

                    if (!jobInitResult.IsInvalid)
                    {
                        // Upload File
                        UploadFile(jobInitResult, new FileInfo(job.FileNameWithExtension));

                        // Start actual job, based on request type
                        switch (job.RequestedProcessType)
                        {
                        case ProcessType.TextExtraction:
                            var extractedText = extractionClient.Request(new ExtractionStartRequest {
                                JobGuid = jobInitResult.JobGuid
                            })
                                                .GetAwaiter().GetResult();
                            SaveTextExtractionResult(new FileInfo(job.FileNameWithExtension), extractedText.Text, targetFolder);
                            break;

                        case ProcessType.Rendering:
                            var conversionResult = conversionClient.Request(new ConversionStartRequest
                            {
                                JobGuid = jobInitResult.JobGuid,
                                DestinationExtension = GetDestinationBasedOnInput(new FileInfo(job.FileNameWithExtension).Extension)
                            })
                                                   .GetAwaiter()
                                                   .GetResult();
                            if (!conversionResult.IsInvalid)
                            {
                                DownloadAndStoreFile(conversionResult, targetFolder);
                            }
                            else
                            {
                                Console.WriteLine($"Unable to convert file. Error: {conversionResult.ErrorMessage}");
                            }

                            break;

                        default:
                            throw new ArgumentOutOfRangeException();
                        }
                    }
                }
            }
            catch (Exception e)
            {
                Console.WriteLine(e);
            }
        }
コード例 #4
0
        public async Task <string> ExtractText(string file)
        {
            var fi = new FileInfo(file);

            try
            {
                var stopWatch = new Stopwatch();
                stopWatch.Start();

                var conversionSettings = new JobInitRequest
                {
                    FileNameWithExtension = fi.Name,
                    RequestedProcessType  = ProcessType.TextExtraction
                };

                var registrationResponse = await jobRequestClient.Request(conversionSettings);

                Log.Information("Successfully registered job for text extraction of file {Name}. Got job id {JobId}", fi.Name,
                                registrationResponse.JobGuid);

                await UploadFile(registrationResponse, fi);

                Log.Information("File '{Name}' uploaded", fi.Name);

                var requestSettings = new ExtractionStartRequest
                {
                    JobGuid = registrationResponse.JobGuid
                };
                Log.Information("Sent actual text extraction request for job id {jobGuid}", registrationResponse.JobGuid);

                var extractionResult = await extractionRequestClient.Request(requestSettings);

                if (extractionResult.IsInvalid)
                {
                    throw new Exception(extractionResult.ErrorMessage);
                }

                var lengthInBytes = string.IsNullOrEmpty(extractionResult.Text) ? 0 : extractionResult.Text.Length;
                Log.Information("Retrieved content for file {Name} in {ElapsedMilliseconds} ms. Length of content is {lengthInBytes} bytes.", fi.Name,
                                stopWatch.ElapsedMilliseconds,
                                lengthInBytes);

                return(extractionResult.Text);
            }
            catch (Exception ex)
            {
                Log.Error(ex, "Unexpected error while extracting text for file {FullName}", fi.FullName);
                throw;
            }
            finally
            {
                if (fi.Exists)
                {
                    fi.Delete();
                    fi.Refresh();
                    if (fi.Exists)
                    {
                        Log.Warning($"Unable to delete file '{fi.FullName}'");
                    }
                }
            }
        }