93 lines
3.8 KiB
C#
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;
|
|
}
|
|
} |