using System; using System.IO; using System.Text; using PdfSharp.Pdf; using PdfSharp.Pdf.IO; using Serilog; using Newtonsoft.Json; using LCU.Library.Internal.FileOperationsModels.Models; using LCU.Api.Internal.FileOperations.Services.FileActionServices; using LCU.Api.Internal.FileOperations.Validations; using LCU.Library.Internal.LCUServiceFactory.Configurations; namespace LCU.Api.Internal.FileOperations.Services.PdfServices; public class BatchPdfParserService : FileActionService, IFileActionService, IBatchPdfParserService { public BatchPdfParserService(ServicesFactoryConfiguration servicesFactoryConfiguration) : base(servicesFactoryConfiguration) { } public RequestResponse ExecuteAction(QueueRequest queueRequest) { var requestResponse = new RequestResponse(); try { var request = JsonConvert.DeserializeObject(queueRequest.Request); requestResponse = PerformRequest(request); requestResponse.ReturnResponse = request; return requestResponse; } catch (Exception exception) { return RequestResponseHelper.ExceptionUpdateRequestResponse(requestResponse, queueRequest.FileOperationType, exception.Message); } } public RequestResponse PerformRequest(BatchParsePdfRequest request) { return OperationService.PerformOperation(request, IsRequestValid, BatchParsePdfs); } public void BatchParsePdfs(BatchParsePdfRequest batchParsePdfRequest) { try { var inputDocument = PdfReader.Open(batchParsePdfRequest.FullPdfPath, PdfDocumentOpenMode.Import); foreach(var batchPdf in batchParsePdfRequest.BatchPdfs) { ParseAndSavePdf(batchParsePdfRequest, batchPdf, inputDocument); } } catch (Exception exception) { Log.Error(exception, $"Failure to Batch Parse Pdfs. ParsePdfRequest:{JsonConvert.SerializeObject(batchParsePdfRequest)}"); throw new Exception($"Failure to Batch Parse Pdfs. ExceptionMessage:{exception.Message}"); } } public void ParseAndSavePdf(BatchParsePdfRequest batchParsePdfRequest, BatchPdf batchPdf, PdfDocument inputDocument) { var outputDocument = AddPdfPagesToOutputDocument(batchPdf.PageStart, batchPdf.PageStop, inputDocument); string name = Path.GetFileNameWithoutExtension(batchParsePdfRequest.PdfName); var newPdfName = string.IsNullOrWhiteSpace(batchPdf.ParsedPdfname) ? $"{name}.{batchPdf.PageStart}.pdf" : batchPdf.ParsedPdfname; var newPath = Path.Combine(batchParsePdfRequest.RootPath, newPdfName); Encoding.RegisterProvider(CodePagesEncodingProvider.Instance); outputDocument.Save(newPath); } public PdfDocument AddPdfPagesToOutputDocument(int pageStart, int pageStop, PdfDocument inputDocument) { var startIndex = pageStart - 1; var stopIndex = pageStop - 1; var outputDocument = new PdfDocument(); for (int page = startIndex; page <= stopIndex; page++) { outputDocument.Version = inputDocument.Version; outputDocument.Info.Title = inputDocument.Info.Title; outputDocument.Info.Creator = inputDocument.Info.Creator; outputDocument.AddPage(inputDocument.Pages[page]); } return outputDocument; } public RequestResponse IsRequestValid(BatchParsePdfRequest request, RequestResponse requestResponse) { requestResponse = DirectoryValidation.ValidateDirectoryExists(request.RootPath, requestResponse); requestResponse = FileValidation.ValidateFileExists(request.FullPdfPath, requestResponse); return requestResponse; } }