#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