Impossibile unire 2 PDF utilizzando MemoryStream

 C Programming >> Programmazione C >  >> Tags >> PDF
Impossibile unire 2 PDF utilizzando MemoryStream

L'unione di pdf in C# o in qualsiasi altro linguaggio non è semplice senza l'utilizzo di librerie di terze parti.

Presumo che il tuo requisito per non utilizzare la libreria sia che la maggior parte delle librerie gratuite, i pacchetti nuget abbiano limitazioni o/e costino denaro per l'uso commerciale.

Ho fatto delle ricerche e ti ho trovato una libreria Open Source chiamata PdfClown con pacchetto nuget, disponibile anche per Java. È gratuito senza limitazioni (dona se vuoi). La libreria ha molte funzioni. In uno di questi puoi unire 2 o più documenti in un unico documento.

Fornisco il mio esempio che prende una cartella con più file pdf, la unisce e la salva nella stessa o in un'altra cartella. È anche possibile utilizzare MemoryStream, ma in questo caso non lo trovo necessario.

Il codice si spiega da sé, il punto chiave qui è usare 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);
    }
}

Per testarlo

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

Esempi di input
PDF doc A e PDF doc B

Esempio di output

Link alla mia ricerca:

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

Questa risposta di Stack Overflow (Combina due (o più) PDF) di Andrew Burns funziona per me:

        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]);
            }
        }

Non è proprio così che funzionano i PDF. I PDF sono file strutturati in un formato specifico. Non puoi semplicemente aggiungere i byte dell'uno all'altro e aspettarti che il risultato sia un documento valido.

Dovrai utilizzare una libreria che comprenda il formato e possa eseguire l'operazione per te o sviluppare la tua soluzione.