2 PDFs können mit MemoryStream nicht zusammengeführt werden

 C Programming >> C-Programmierung >  >> Tags >> PDF
2 PDFs können mit MemoryStream nicht zusammengeführt werden

Das Zusammenführen von PDF-Dateien in C# oder einer anderen Sprache ist ohne die Verwendung einer Bibliothek von Drittanbietern nicht einfach.

Ich nehme an, Ihre Anforderung für die Nichtverwendung der Bibliothek ist, dass die meisten kostenlosen Bibliotheken, Nuget-Pakete Einschränkungen unterliegen oder/und für die kommerzielle Nutzung Geld kosten.

Ich habe recherchiert und eine Open-Source-Bibliothek namens PdfClown mit Nuget-Paket gefunden, die auch für Java verfügbar ist. Es ist ohne Einschränkung kostenlos (spenden Sie, wenn Sie möchten). Die Bibliothek hat viele Funktionen. So können Sie 2 oder mehr Dokumente zu einem Dokument zusammenführen.

Ich liefere mein Beispiel, das einen Ordner mit mehreren PDF-Dateien nimmt, ihn zusammenführt und in demselben oder einem anderen Ordner speichert. Es ist auch möglich, MemoryStream zu verwenden, aber ich finde es in diesem Fall nicht notwendig.

Der Code ist selbsterklärend, der Schlüsselpunkt hier ist die Verwendung von 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);
    }
}

Um es zu testen

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

Eingabebeispiele
PDF-Dokument A und PDF-Dokument B

Ausgabebeispiel

Links zu meiner Forschung:

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

Diese Antwort von Stack Overflow (Combine two (or more) PDF's) von Andrew Burns funktioniert für mich:

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

So funktionieren PDFs nicht ganz. PDFs sind strukturierte Dateien in einem bestimmten Format. Sie können nicht einfach die Bytes der einen an die anderen anhängen und erwarten, dass das Ergebnis ein gültiges Dokument ist.

Sie müssen eine Bibliothek verwenden, die das Format versteht und die Operation für Sie erledigen kann, oder Ihre eigene Lösung entwickeln.