#if WINDOWS
using EnvelopeGenerator.Application.Common.Extensions;
using EnvelopeGenerator.Application.Exceptions;
using EnvelopeGenerator.Domain.Constants;
using GdPicture14;
using MediatR;
namespace EnvelopeGenerator.Application.Pdf.Behaviors;
///
///
///
public class PdfMergeBehavior : IPipelineBehavior
{
private static readonly bool ALLOW_RASTERIZATION = true;
private static readonly bool ALLOW_VECTORIZATION = true;
private static readonly PdfConversionConformance PDFAConformanceLevel = PdfConversionConformance.PDF_A_1b;
///
///
///
///
///
///
///
///
public async Task Handle(BurnPdfCommand request, RequestHandlerDelegate next, CancellationToken cancel)
{
var doc = await next(cancel);
doc = request.Report is byte[] report
? MergeDocuments(doc, report)
: throw new InvalidOperationException("The final document report could not be merged." +
"There may be an error related to the behavior register order." +
"Request details:\n" + request.ToJson(Format.Json.ForDiagnostics));
string base64String = Convert.ToBase64String(doc);
return doc;
}
///
///
///
///
///
///
///
public static byte[] MergeDocuments(byte[] pDocument, byte[] pReport)
{
using var oDocumentStream = new MemoryStream(pDocument);
using var oReportStream = new MemoryStream(pReport);
using var oFinalStream = new MemoryStream();
using var oDocumentPDF = new GdPicturePDF();
using var oReportPDF = new GdPicturePDF();
GdPictureStatus oStatus = GdPictureStatus.OK;
// Load the source file into memory
oDocumentPDF.LoadFromStream(oDocumentStream, true);
oStatus = oDocumentPDF.GetStat();
if (oStatus != GdPictureStatus.OK)
throw new MergeDocumentException($"Document could not be loaded: {oStatus}");
// Load the report file into memory
oReportPDF.LoadFromStream(oReportStream, true);
oStatus = oReportPDF.GetStat();
if (oStatus != GdPictureStatus.OK)
throw new MergeDocumentException($"Report could not be loaded: {oStatus}");
// Merge the documents
var oMergedPDF = oDocumentPDF.Merge2Documents(oDocumentPDF, oReportPDF);
oStatus = oMergedPDF.GetStat();
if (oStatus != GdPictureStatus.OK)
throw new MergeDocumentException($"Documents could not be merged: {oStatus}");
// Convert to PDF/A
oMergedPDF.ConvertToPDFA(oFinalStream, PDFAConformanceLevel, ALLOW_VECTORIZATION, ALLOW_RASTERIZATION);
oStatus = oDocumentPDF.GetStat();
if (oStatus != GdPictureStatus.OK)
throw new MergeDocumentException($"Document could not be converted to PDF/A: {oStatus}");
return oFinalStream.ToArray();
}
}
#endif