No se pueden fusionar 2 archivos PDF con MemoryStream

 C Programming >> Programación C >  >> Tags >> PDF
No se pueden fusionar 2 archivos PDF con MemoryStream

Fusionar pdf en C# o cualquier otro lenguaje no es sencillo sin usar una biblioteca de terceros.

Supongo que su requisito para no usar la biblioteca es que la mayoría de las bibliotecas gratuitas, los paquetes nuget tienen limitaciones o cuestan dinero para uso comercial.

Investigué y encontré una biblioteca de código abierto llamada PdfClown con paquete nuget, también está disponible para Java. Es gratis sin limitación (dona si quieres). La biblioteca tiene muchas características. Uno de ellos puede fusionar 2 o más documentos en un solo documento.

Proporciono mi ejemplo que toma una carpeta con varios archivos pdf, los fusiona y los guarda en la misma u otra carpeta. También es posible usar MemoryStream, pero no lo encuentro necesario en este caso.

El código se explica por sí mismo, el punto clave aquí es usar SerializationModeEnum.Incremental :

public static void MergePdf(string srcPath, string destFile)
{
    var list = Directory.GetFiles(Path.GetFullPath(srcPath));
    if (string.IsNullOrWhiteSpace(srcPath) || string.IsNullOrWhiteSpace(destFile) || list.Length <= 1)
        return;
    var files = list.Select(File.ReadAllBytes).ToList();
    using (var dest = new org.pdfclown.files.File(new org.pdfclown.bytes.Buffer(files[0])))
    {
        var document = dest.Document;
        var builder = new org.pdfclown.tools.PageManager(document);
        foreach (var file in files.Skip(1))
        {
            using (var src = new org.pdfclown.files.File(new org.pdfclown.bytes.Buffer(file)))
            { builder.Add(src.Document); }
        }

        dest.Save(destFile, SerializationModeEnum.Incremental);
    }
}

Para probarlo

var srcPath = @"C:\temp\pdf\input";
var destFile = @"c:\temp\pdf\output\merged.pdf";
MergePdf(srcPath, destFile);

Ejemplos de entrada
PDF documento A y PDF documento B

Ejemplo de salida

Enlaces a mi investigación:

  • https://csharp-source.net/open-source/pdf-libraries
  • https://sourceforge.net/projects/clown/
  • https://www.oipapio.com/pregunta-3526089

Esta respuesta de Stack Overflow (Combinar dos (o más) PDF) de Andrew Burns funciona para mí:

        using (PdfDocument one = PdfReader.Open("pdf 1.pdf", PdfDocumentOpenMode.Import))
        using (PdfDocument two = PdfReader.Open("pdf 2.pdf", PdfDocumentOpenMode.Import))
        using (PdfDocument outPdf = new PdfDocument())
        {
            CopyPages(one, outPdf);
            CopyPages(two, outPdf);

            outPdf.Save("file1and2.pdf");
        }

        void CopyPages(PdfDocument from, PdfDocument to)
        {
            for (int i = 0; i < from.PageCount; i++)
            {
                to.AddPage(from.Pages[i]);
            }
        }

Así no es como funcionan los archivos PDF. Los archivos PDF son archivos estructurados en un formato específico. No puede simplemente agregar los bytes de uno a otro y esperar que el resultado sea un documento válido.

Vas a tener que usar una biblioteca que entienda el formato y pueda hacer la operación por ti, o desarrollar tu propia solución.