Files
monorepo/LCU.API.Internal.FileOperations/LCU.Api.Internal.FileOperations/Services/PdfServices/BatchPdfParserService.cs
T
2026-04-27 10:50:07 -05:00

93 lines
3.8 KiB
C#

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<BatchParsePdfRequest>(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;
}
}