using System.IO; using iText.Kernel.Pdf; using iText.Kernel.Utils; using Microsoft.Extensions.Logging; using Microsoft.Extensions.Logging.Abstractions; using static EnvelopeGenerator.Jobs.FinalizeDocument.FinalizeDocumentExceptions; namespace EnvelopeGenerator.Jobs.FinalizeDocument; public class PDFMerger { private readonly ILogger _logger; public PDFMerger() : this(NullLogger.Instance) { } public PDFMerger(ILogger logger) { _logger = logger; } public byte[] MergeDocuments(byte[] document, byte[] report) { try { using var finalStream = new MemoryStream(); using var documentReader = new PdfReader(new MemoryStream(document)); using var reportReader = new PdfReader(new MemoryStream(report)); using var writer = new PdfWriter(finalStream); using var targetDoc = new PdfDocument(documentReader, writer); using var reportDoc = new PdfDocument(reportReader); var merger = new PdfMerger(targetDoc); merger.Merge(reportDoc, 1, reportDoc.GetNumberOfPages()); targetDoc.Close(); return finalStream.ToArray(); } catch (Exception ex) { _logger.LogError(ex, "Failed to merge PDF documents"); throw new MergeDocumentException("Documents could not be merged", ex); } } }