TekH e68965543e refactor(BurnPdfCommand): add Report property to forward report.
- Reverse the order in which behaviors are added.
2025-11-12 12:47:19 +01:00

88 lines
3.2 KiB
C#

#if WINDOWS
using EnvelopeGenerator.Application.Common.Extensions;
using EnvelopeGenerator.Application.Exceptions;
using EnvelopeGenerator.Domain.Constants;
using GdPicture14;
using MediatR;
namespace EnvelopeGenerator.Application.Pdf.Behaviors;
/// <summary>
///
/// </summary>
public class PdfMergeBehavior : IPipelineBehavior<BurnPdfCommand, byte[]>
{
private static readonly bool ALLOW_RASTERIZATION = true;
private static readonly bool ALLOW_VECTORIZATION = true;
private static readonly PdfConversionConformance PDFAConformanceLevel = PdfConversionConformance.PDF_A_1b;
/// <summary>
///
/// </summary>
/// <param name="request"></param>
/// <param name="next"></param>
/// <param name="cancel"></param>
/// <returns></returns>
/// <exception cref="NotImplementedException"></exception>
public async Task<byte[]> Handle(BurnPdfCommand request, RequestHandlerDelegate<byte[]> 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;
}
/// <summary>
///
/// </summary>
/// <param name="pDocument"></param>
/// <param name="pReport"></param>
/// <returns></returns>
/// <exception cref="MergeDocumentException"></exception>
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