Przejdź do treści stopki
KORZYSTANIE Z IRONPDF

Jak połączyć tablice bajtów PDF w języku C#

Tworzyc obiekty PdfDocument z tablic bajtowych i uzywac PdfDocument.Merge() do polaczenia ich w jeden PDF bez zapisywania na dysku. Ta metoda automatycznie zajmuje sie zlozona struktura PDF, pozwalajac na laczenie dokumentow przechowywanych w bazach danych lub otrzymywanych z API bez zapisu tymczasowych plikow.

Praca z plikami PDF przechowywanymi jako tablice bajtowe jest powszechna we wspolczesnych aplikacjach C#. Czy to pobieranie dokumentow PDF z bazy danych, otrzymywanie ich z uslug internetowych, czy przetwarzanie w pamieci, mozliwosc laczenia wielu plikow PDF w jeden bez zapisywania na dysku jest niezbedna dla przeplywow pracy w Enterprise. IronPDF ulatwia to dzieki intuicyjnemu API. W tym artykule przejdziesz krok po kroku, jak laczyc tablice bajtowe PDF w C#, analizujac rozne podejscia, w tym obsluge MemoryStream i rzeczywiste wzorce baz danych.

Czym sa tablice bajtowe PDF i dlaczego warto je laczyc?

Tablica bajtowa to surowe dane binarne reprezentujace plik PDF w pamieci. Podczas pracy z dokumentami PDF w C#, czesto napotkasz sytuacje, gdy pliki istnieja jako tablice bajtowe, a nie na dysku. Jest to szczegolnie powszechne podczas pobierania dokumentow z baz danych, gdzie PDF-y sa przechowywane jako kolumny binarne, czy podczas otrzymywania dokumentow z REST API.

Funkcjonalnosc MemoryStream w .NET -- opisana w dokumentacji Microsoft MemoryStream -- sprawia, ze obsluga tych tablic bajtowych jest wydajna, zwlaszcza w polaczeniu z odpowiednim zarzadzaniem pamiecia dla duzych dokumentow. Zamiast zapisywac tymczasowe pliki, mozna ladowac, przetwarzac i zapisywac PDF-y calkowicie w pamieci -- co jest szybsze, czystsze i unika problemow z uprawnieniami do systemu plikow.

Dlaczego nie mozna poprostu polaczyc tablic bajtowych PDF?

Proste polaczenie dwoch tablic bajtowych PDF nie zadziala. W przeciwienstwie do zwyklych plikow tekstowych, pliki PDF maja zlozone wewnetrzne struktury z naglowkami, tabelami odniesienia i specyficznymi konwencjami formatowania. Specyfikacja ISO 32000 PDF definiuje skomplikowane zasady dotyczace struktury dokumentu, w tym metadanych, osadzania czcionek i warstw szyfrowania. Bezposrednie dolaczenie bajtow powoduje uszkodzenie pliku. Potrzebujesz odpowiedniej biblioteki PDF do parsowania tych tablic bajtowych i laczenia ich wlasciwie, zachowujac cala integralnosc strukturalna.

IronPDF zajmuje sie wszystkimi tymi zlozonosciami wewnetrznie. Mozna laczyc dokumenty PDF za pomoca kilku linii kodu, zachowujac czcionki, obrazy i formatowanie dokladnie takie, jakie byly w plikach zrodlowych.

Kiedy warto laczyc tablice bajtowe?

To podejscie dziala dobrze, gdy:

  • Dokumenty sa przechowywane w bazie danych SQL Server lub PostgreSQL jako kolumny binarne
  • Twoja aplikacja otrzymuje dane PDF z zewnetrznego API lub mikroserwisu
  • Przetwarzasz przesylanie plikow w ASP.NET bez zapisywania ich na dysku
  • Dzialasz w srodowisku chmurowym, takim jak Azure Functions lub AWS Lambda, gdzie tymczasowe przechowywanie plikow jest ograniczone

Podczas pracy z Azure Blob Storage lub podobnymi uslugami chmurowymi, operacje na tablicach bajtowych sa niezbedne, poniewaz pobierasz surowe bajty, przetwarzasz je i wysylasz wynik -- wszystko bez dotykania systemu plikow.

Jak dodać bibliotekę PDF do swojego projektu?

Zaczynamy od dodania pakietu IronPDF NuGet do projektu. Pakiet jest dostępny na stronie NuGet.org. Mozna go zainstalowac za pomoca Konsoli Menedzera Pakietow lub .NET CLI:

Install-Package IronPdf
Install-Package IronPdf
SHELL
dotnet add package IronPdf
dotnet add package IronPdf
SHELL

Aby uzyskac szczegolowe opcje instalacji, w tym wdrozenie Docker lub konfiguracje Linux, zobacz przewodnik zaawansowanej instalacji. Jesli wdrazasz w minimalnym srodowisku, IronPDF Slim znacznie zmniejsza miejsce zajmowane przy wdrozeniu.

Po zainstalowaniu dodaj nastepujace przestrzenie nazw w gornym czesci pliku C#:

using IronPdf;
using System.IO;
using System.Collections.Generic;
using IronPdf;
using System.IO;
using System.Collections.Generic;
Imports IronPdf
Imports System.IO
Imports System.Collections.Generic
$vbLabelText   $csharpLabel

IronPDF wspiera platformy Windows, macOS i Linux. Integruje sie z ASP.NET Core, Blazor, aplikacjami konsolowymi i srodowiskami chmurowymi bez dodatkowej konfiguracji.

Interfejs Menedzera Pakietow NuGet Visual Studio pokazujacy wyniki wyszukiwania biblioteki IronPDF, z wybrana do instalacji wersja 2025.9.4 w projekcie IronTesting - widoczny przycisk Instaluj i rozwijalna lista wersji.

!{--01001100010010010100001001010010010000010101001001011001010111110100011101000101010101000101111101010011010101000100000101010010010101000100010101000100010111110101011101001001010100010010000101111101010000010100100100111101000100010101010100001101010100010111110101010001010010010010010100000101001100010111110100001001001100010011110100001101001011--}

Jak polaczyc dwie tablice bajtowe PDF w C#?

Oto pelny przyklad pokazujacy, jak polaczyc dwie tablice bajtowe PDF w jeden dokument PDF:

// Simulate two PDF byte arrays (in practice, these come from a database or API)
byte[] pdfBytes1 = File.ReadAllBytes("document1.pdf");
byte[] pdfBytes2 = File.ReadAllBytes("document2.pdf");

// Create PdfDocument objects from byte arrays
var pdf1 = new PdfDocument(pdfBytes1);
var pdf2 = new PdfDocument(pdfBytes2);

// Merge the two PDF documents
PdfDocument combinedPdf = PdfDocument.Merge(pdf1, pdf2);

// Convert the combined PDF back to a byte array
byte[] mergedPdfBytes = combinedPdf.BinaryData;

// Optionally save the merged PDF to disk
File.WriteAllBytes("merged.pdf", mergedPdfBytes);
// Simulate two PDF byte arrays (in practice, these come from a database or API)
byte[] pdfBytes1 = File.ReadAllBytes("document1.pdf");
byte[] pdfBytes2 = File.ReadAllBytes("document2.pdf");

// Create PdfDocument objects from byte arrays
var pdf1 = new PdfDocument(pdfBytes1);
var pdf2 = new PdfDocument(pdfBytes2);

// Merge the two PDF documents
PdfDocument combinedPdf = PdfDocument.Merge(pdf1, pdf2);

// Convert the combined PDF back to a byte array
byte[] mergedPdfBytes = combinedPdf.BinaryData;

// Optionally save the merged PDF to disk
File.WriteAllBytes("merged.pdf", mergedPdfBytes);
Imports System.IO

' Simulate two PDF byte arrays (in practice, these come from a database or API)
Dim pdfBytes1 As Byte() = File.ReadAllBytes("document1.pdf")
Dim pdfBytes2 As Byte() = File.ReadAllBytes("document2.pdf")

' Create PdfDocument objects from byte arrays
Dim pdf1 As New PdfDocument(pdfBytes1)
Dim pdf2 As New PdfDocument(pdfBytes2)

' Merge the two PDF documents
Dim combinedPdf As PdfDocument = PdfDocument.Merge(pdf1, pdf2)

' Convert the combined PDF back to a byte array
Dim mergedPdfBytes As Byte() = combinedPdf.BinaryData

' Optionally save the merged PDF to disk
File.WriteAllBytes("merged.pdf", mergedPdfBytes)
$vbLabelText   $csharpLabel

Klasa PdfDocument akceptuje bezposrednio surowe tablice bajtowe w swoim konstruktorze. Gdy masz dwa egzemplarze PdfDocument, PdfDocument.Merge() laczy je w jeden dokument. Wlasciwosc BinaryData nastepnie daje wynik jako tablice bajtowa, gotowa do zapisania z powrotem w bazie danych lub przeslania przez API.

API PdfDocument zapewnia szeroka funkcjonalnosc wykraczajaca poza proste laczenie, w tym manipulacje stronami, ekstrakcje tekstu i obsluge formularzy. Po uzyskaniu scalonego dokumentu, mozna zastosowac dowolne z tych operacji przed wyciagnieciem koncowej tablicy bajtowej.

Jak wyglada wynik scalony?

Przegladarka PDF wyswietlajaca pomyslnie scalone dokumenty PDF z 'PDF One' na stronie 1 i 'PDF Two' na stronie 2, pokazujaca wyrazne granice dokumentow i zachowane formatowanie przy 100% powiekszeniu.

Wynikowy plik PDF zawiera wszystkie strony z obu dokumentow zrodlowych w kolejnosci, w jakiej zostaly przekazane do Merge(). Numeracja stron, czcionki, obrazy i osadzone tresci sa zachowane. Scalony dokument zachowuje sie identycznie jak kazdy inny PDF -- mozna go paginowac, komentowac, podpisywac lub kompresowac za pomoca tych samych metod IronPDF, ktore stosujesz do kazdego dokumentu.

Jak dziala proces scalania wewnetrznie?

Gdy przesylasz tablice bajtowa do konstruktora PdfDocument, IronPDF parsuje dane binarne i buduje reprezentacje w pamieci struktury PDF. Metoda PdfDocument.Merge() laczy nastepnie wiele dokumentow, dodajac strony z kazdego zrodla w kolejnosci, przebudowujac tabeli indeksow krzyzowych i rozwiazujac wszelkie konflikty nazw czcionek lub zasobow miedzy dokumentami.

Dlatego nie mozna po prostu polaczyc tablic bajtowych -- tabela indeksow krzyzowych w pierwszym PDF wskazuje na przesuniecia w tym pliku. Po zlaczeniu, te przesuniecia sa nieprawidlowe, poniewaz drugi plik je przesunal. IronPDF przebudowuje cala strukture poprawnie, co skutkuje waznym, dobrze sformatowanym PDF.

Jak polaczyc wiecej niz dwa pliki PDF jednoczesnie?

IronPDF zapewnia przeciązenie List dla laczenia dowolnej liczby dokumentow w jednej operacji. Jest to bardziej efektywne niz laczenie wielu dokumentow dwu-pilkowych:

// Load four PDFs as byte arrays
List<byte[]> pdfByteArrays = new List<byte[]>
{
    File.ReadAllBytes("example1.pdf"),
    File.ReadAllBytes("example2.pdf"),
    File.ReadAllBytes("example3.pdf"),
    File.ReadAllBytes("example4.pdf")
};

// Convert each byte array to a PdfDocument
List<PdfDocument> pdfsToMerge = new List<PdfDocument>();
for (int i = 0; i < pdfByteArrays.Count; i++)
{
    pdfsToMerge.Add(new PdfDocument(pdfByteArrays[i]));
}

// Merge all documents in one call
PdfDocument combinedPdf = PdfDocument.Merge(pdfsToMerge);
byte[] finalPdfBytes = combinedPdf.BinaryData;

// Apply compression if the result is large
if (finalPdfBytes.Length > 1024 * 1024 * 10) // 10 MB
{
    combinedPdf.CompressImages(90);
    finalPdfBytes = combinedPdf.BinaryData;
}
// Load four PDFs as byte arrays
List<byte[]> pdfByteArrays = new List<byte[]>
{
    File.ReadAllBytes("example1.pdf"),
    File.ReadAllBytes("example2.pdf"),
    File.ReadAllBytes("example3.pdf"),
    File.ReadAllBytes("example4.pdf")
};

// Convert each byte array to a PdfDocument
List<PdfDocument> pdfsToMerge = new List<PdfDocument>();
for (int i = 0; i < pdfByteArrays.Count; i++)
{
    pdfsToMerge.Add(new PdfDocument(pdfByteArrays[i]));
}

// Merge all documents in one call
PdfDocument combinedPdf = PdfDocument.Merge(pdfsToMerge);
byte[] finalPdfBytes = combinedPdf.BinaryData;

// Apply compression if the result is large
if (finalPdfBytes.Length > 1024 * 1024 * 10) // 10 MB
{
    combinedPdf.CompressImages(90);
    finalPdfBytes = combinedPdf.BinaryData;
}
Imports System.IO

' Load four PDFs as byte arrays
Dim pdfByteArrays As New List(Of Byte()) From {
    File.ReadAllBytes("example1.pdf"),
    File.ReadAllBytes("example2.pdf"),
    File.ReadAllBytes("example3.pdf"),
    File.ReadAllBytes("example4.pdf")
}

' Convert each byte array to a PdfDocument
Dim pdfsToMerge As New List(Of PdfDocument)()
For i As Integer = 0 To pdfByteArrays.Count - 1
    pdfsToMerge.Add(New PdfDocument(pdfByteArrays(i)))
Next

' Merge all documents in one call
Dim combinedPdf As PdfDocument = PdfDocument.Merge(pdfsToMerge)
Dim finalPdfBytes As Byte() = combinedPdf.BinaryData

' Apply compression if the result is large
If finalPdfBytes.Length > 1024 * 1024 * 10 Then ' 10 MB
    combinedPdf.CompressImages(90)
    finalPdfBytes = combinedPdf.BinaryData
End If
$vbLabelText   $csharpLabel

To podejscie skaluje sie do dowolnej liczby dokumentow. Kazdy PDF jest ladowany do obiektu PdfDocument, dodawany do listy, a nastepnie laczony w jednym wywolaniu. Dla duzych wynikowych plikow kompresja PDF redukuje ostateczny rozmiar bez utraty znaczacej jakosci.

Kiedy nalezy uzywac MemoryStream do laczenia PDF?

Podejscie MemoryStream daje wieksza kontrolę przy integracji z innymi bibliotekami .NET, ktore dzialaja na strumieniach zamiast tablicy bajtowych. Jest to przydatne, gdy masz juz dostepny strumien (na przyklad z odpowiedzi HTTP lub SDK przechowywania blobow):

using (var stream1 = new MemoryStream(pdfBytes1))
using (var stream2 = new MemoryStream(pdfBytes2))
{
    var pdf1 = new PdfDocument(stream1);
    var pdf2 = new PdfDocument(stream2);

    var merged = PdfDocument.Merge(pdf1, pdf2);

    // Add metadata to the merged document
    merged.MetaData.Author = "Your Application";
    merged.MetaData.Title = "Merged Document";
    merged.MetaData.CreationDate = DateTime.Now;

    byte[] result = merged.BinaryData;
}
using (var stream1 = new MemoryStream(pdfBytes1))
using (var stream2 = new MemoryStream(pdfBytes2))
{
    var pdf1 = new PdfDocument(stream1);
    var pdf2 = new PdfDocument(stream2);

    var merged = PdfDocument.Merge(pdf1, pdf2);

    // Add metadata to the merged document
    merged.MetaData.Author = "Your Application";
    merged.MetaData.Title = "Merged Document";
    merged.MetaData.CreationDate = DateTime.Now;

    byte[] result = merged.BinaryData;
}
Imports System.IO

Using stream1 As New MemoryStream(pdfBytes1)
    Using stream2 As New MemoryStream(pdfBytes2)
        Dim pdf1 = New PdfDocument(stream1)
        Dim pdf2 = New PdfDocument(stream2)

        Dim merged = PdfDocument.Merge(pdf1, pdf2)

        ' Add metadata to the merged document
        merged.MetaData.Author = "Your Application"
        merged.MetaData.Title = "Merged Document"
        merged.MetaData.CreationDate = DateTime.Now

        Dim result As Byte() = merged.BinaryData
    End Using
End Using
$vbLabelText   $csharpLabel

Można wzbogacic scalony dokument poprzez ustawienie metadanych, dodanie znakow wodnych lub zastosowanie podpisow cyfrowych przed wyciagnieciem koncowych bajtow. Dla scenariuszy zgodnosci, rozwaz konwersje PDF/A dla dlugoterminowego archiwizowania lub zgodnosc PDF/UA dla wymogow dostepnosci.

Obrobka oparte na strumieniach umożliwia lepsze zarzadzanie pamiecia dla wiekszych plikow PDF i integruje sie plynnie z SDK przechowywania w chmurze. To podejscie jest szczegolnie praktyczne dla asynchronicznych wzorcow w uslugach o wysokiej przepustowosci.

Jak polaczyc pobrane PDFy z bazy danych?

Powszechny wzorzec obejmuje pobieranie tablic bajtowych PDF z bazy danych SQL i laczenie ich na zadanie. Oto przyklad gotowy do produkcji z obsluga bledow:

public string MergePdfDocumentsFromDatabase(List<int> documentIds)
{
    List<PdfDocument> documents = new List<PdfDocument>();

    try
    {
        foreach (int id in documentIds)
        {
            // Fetch PDF byte array from database
            byte[] pdfData = GetPdfFromDatabase(id); // Replace with your data access logic

            if (pdfData == null || pdfData.Length == 0)
            {
                Console.WriteLine($"Warning: Document {id} is empty or not found");
                continue;
            }

            documents.Add(new PdfDocument(pdfData));
        }

        if (documents.Count == 0)
        {
            return "Error: No valid documents found to merge";
        }

        // Merge all documents
        PdfDocument mergedDocument = PdfDocument.Merge(documents);

        // Add page numbers to the footer
        mergedDocument.AddHtmlFooters(new HtmlHeaderFooter()
        {
            HtmlFragment = "<center>Page {page} of {total-pages}</center>",
            DrawDividerLine = true
        });

        // Save back to the database
        byte[] resultBytes = mergedDocument.BinaryData;
        SaveMergedPdfToDatabase(resultBytes);

        return "Document successfully combined and saved.";
    }
    catch (Exception ex)
    {
        Console.WriteLine($"Error merging PDFs: {ex.Message}");
        return $"Merge failed: {ex.Message}";
    }
}
public string MergePdfDocumentsFromDatabase(List<int> documentIds)
{
    List<PdfDocument> documents = new List<PdfDocument>();

    try
    {
        foreach (int id in documentIds)
        {
            // Fetch PDF byte array from database
            byte[] pdfData = GetPdfFromDatabase(id); // Replace with your data access logic

            if (pdfData == null || pdfData.Length == 0)
            {
                Console.WriteLine($"Warning: Document {id} is empty or not found");
                continue;
            }

            documents.Add(new PdfDocument(pdfData));
        }

        if (documents.Count == 0)
        {
            return "Error: No valid documents found to merge";
        }

        // Merge all documents
        PdfDocument mergedDocument = PdfDocument.Merge(documents);

        // Add page numbers to the footer
        mergedDocument.AddHtmlFooters(new HtmlHeaderFooter()
        {
            HtmlFragment = "<center>Page {page} of {total-pages}</center>",
            DrawDividerLine = true
        });

        // Save back to the database
        byte[] resultBytes = mergedDocument.BinaryData;
        SaveMergedPdfToDatabase(resultBytes);

        return "Document successfully combined and saved.";
    }
    catch (Exception ex)
    {
        Console.WriteLine($"Error merging PDFs: {ex.Message}");
        return $"Merge failed: {ex.Message}";
    }
}
Imports System

Public Function MergePdfDocumentsFromDatabase(documentIds As List(Of Integer)) As String
    Dim documents As New List(Of PdfDocument)()

    Try
        For Each id As Integer In documentIds
            ' Fetch PDF byte array from database
            Dim pdfData As Byte() = GetPdfFromDatabase(id) ' Replace with your data access logic

            If pdfData Is Nothing OrElse pdfData.Length = 0 Then
                Console.WriteLine($"Warning: Document {id} is empty or not found")
                Continue For
            End If

            documents.Add(New PdfDocument(pdfData))
        Next

        If documents.Count = 0 Then
            Return "Error: No valid documents found to merge"
        End If

        ' Merge all documents
        Dim mergedDocument As PdfDocument = PdfDocument.Merge(documents)

        ' Add page numbers to the footer
        mergedDocument.AddHtmlFooters(New HtmlHeaderFooter() With {
            .HtmlFragment = "<center>Page {page} of {total-pages}</center>",
            .DrawDividerLine = True
        })

        ' Save back to the database
        Dim resultBytes As Byte() = mergedDocument.BinaryData
        SaveMergedPdfToDatabase(resultBytes)

        Return "Document successfully combined and saved."
    Catch ex As Exception
        Console.WriteLine($"Error merging PDFs: {ex.Message}")
        Return $"Merge failed: {ex.Message}"
    End Try
End Function
$vbLabelText   $csharpLabel

Wzorzec ten obsluguje brakujace lub nullowe rekordy w elegancki sposob, pomijajac je i kontynuujac z waznymi dokumentami. Scalony wynik otrzymuje numery stron dodane przez naglowki/stopki HTML przed zapisaniem jej z powrotem do bazy danych. Dla bardziej zaawansowanej nawigacji mozna dodac zakladki pomagajace czytelnikom w nawigacji po dlugim scalonym dokumencie.

Co sprawia, ze wzorzec bazodanowy jest skuteczny?

Powyższy wzorzec dziala dla faktur, raportow, umow lub dowolnych dokumentow przechowywanych jako kolumny binarne. Kluczowe zalety:

  • Brak tymczasowych plikow: Caly przeplyw pracy odbywa sie w pamieci, co unika dostepu do systemu plikow i zmniejsza powierzchnie ataku.
  • Eleganckie pomijanie: Nieprawidlowe lub brakujace rekordy nie powoduja przerwania calego scalania -- sa logowane i pomijane.
  • Wzbogacenie przed zapisaniem: Dodanie stopki czy metadanych do scalonego dokumentu odbywa sie przed wyciagnieciem koncowej tablicy bajtowej, wiec wynik jest kompletny i gotowy do uzycia.
  • Pojedynczy zapis do bazy danych: Scalony wynik jest zapisywany raz, co ulatwia transakcje baz danych.

Jak obslugiwac bledy i skrajne przypadki?

Jakie sa najczestsze scenariusze bledu?

Budujac przeplywy pracy laczenia PDF, warto zabezpieczyc sie przed kilkoma trybami awarii:

  1. Pusty lub nullowy tablic bajtowa: Najczestszy problem. Zawsze sprawdzaj pdfData != null && pdfData.Length > 0 przed skonstruowaniem PdfDocument.
  2. Uszkodzone lub nieprawidlowe dane PDF: Jesli tablic bajtowa zostala obcieta podczas przechowywania w bazie danych lub przesylania API, konstruktor rzuci wyjatkiem. Zawijanie w try-catch i zapisywanie ID dokumentu.
  3. Zaszyfrowane PDFy bez hasel: Proba laczenia zaszyfrowanego PDF bez podania hasla rzuci wyjatkiem. Uzyj IronPDF do obslugi zaszyfrowanych PDFow, aby podac dane uwierzytelniajace.
  4. Obciazenie pamieci przy wielu duzych plikach: Ladowanie dziesiątek dużych PDF jednocześnie może obciążyć dostępną pamięć. Przetwarzanie ich w partiach i usuwanie obiektów PdfDocument po scaleniu.

Oto niezawodny wzorzec z walidacja wejściową:

public bool TryMergePdfByteArrays(byte[] pdfBytes1, byte[] pdfBytes2, out byte[] mergedBytes)
{
    mergedBytes = null;

    try
    {
        if (pdfBytes1 == null || pdfBytes1.Length == 0)
            throw new ArgumentException("First PDF byte array is null or empty");

        if (pdfBytes2 == null || pdfBytes2.Length == 0)
            throw new ArgumentException("Second PDF byte array is null or empty");

        using var pdf1 = new PdfDocument(pdfBytes1);
        using var pdf2 = new PdfDocument(pdfBytes2);

        if (pdf1.PageCount == 0)
            throw new InvalidOperationException("First PDF has no pages");

        if (pdf2.PageCount == 0)
            throw new InvalidOperationException("Second PDF has no pages");

        var mergedPdf = PdfDocument.Merge(pdf1, pdf2);
        mergedBytes = mergedPdf.BinaryData;

        return true;
    }
    catch (Exception ex)
    {
        Console.WriteLine($"PDF merge failed: {ex.Message}");
        return false;
    }
}
public bool TryMergePdfByteArrays(byte[] pdfBytes1, byte[] pdfBytes2, out byte[] mergedBytes)
{
    mergedBytes = null;

    try
    {
        if (pdfBytes1 == null || pdfBytes1.Length == 0)
            throw new ArgumentException("First PDF byte array is null or empty");

        if (pdfBytes2 == null || pdfBytes2.Length == 0)
            throw new ArgumentException("Second PDF byte array is null or empty");

        using var pdf1 = new PdfDocument(pdfBytes1);
        using var pdf2 = new PdfDocument(pdfBytes2);

        if (pdf1.PageCount == 0)
            throw new InvalidOperationException("First PDF has no pages");

        if (pdf2.PageCount == 0)
            throw new InvalidOperationException("Second PDF has no pages");

        var mergedPdf = PdfDocument.Merge(pdf1, pdf2);
        mergedBytes = mergedPdf.BinaryData;

        return true;
    }
    catch (Exception ex)
    {
        Console.WriteLine($"PDF merge failed: {ex.Message}");
        return false;
    }
}
Imports System

Public Function TryMergePdfByteArrays(pdfBytes1 As Byte(), pdfBytes2 As Byte(), ByRef mergedBytes As Byte()) As Boolean
    mergedBytes = Nothing

    Try
        If pdfBytes1 Is Nothing OrElse pdfBytes1.Length = 0 Then
            Throw New ArgumentException("First PDF byte array is null or empty")
        End If

        If pdfBytes2 Is Nothing OrElse pdfBytes2.Length = 0 Then
            Throw New ArgumentException("Second PDF byte array is null or empty")
        End If

        Using pdf1 As New PdfDocument(pdfBytes1)
            Using pdf2 As New PdfDocument(pdfBytes2)
                If pdf1.PageCount = 0 Then
                    Throw New InvalidOperationException("First PDF has no pages")
                End If

                If pdf2.PageCount = 0 Then
                    Throw New InvalidOperationException("Second PDF has no pages")
                End If

                Dim mergedPdf = PdfDocument.Merge(pdf1, pdf2)
                mergedBytes = mergedPdf.BinaryData

                Return True
            End Using
        End Using
    Catch ex As Exception
        Console.WriteLine($"PDF merge failed: {ex.Message}")
        Return False
    End Try
End Function
$vbLabelText   $csharpLabel

Instrukcje using zapewniają, że obiekty PdfDocument są prawidłowo usuwane, uwalniając niezarządzane zasoby nawet, jeśli wystąpi wyjątek. Wzorzec TryXxx zwraca wskaźnik powodzenia boolowski zamiast rzucać wyjątek, co ułatwia wywoływanie go z kodu wyższego poziomu obsługującego wiele dokumentow.

Jak można zapobiegać typowym błędom?

Kilka zwyczajów pomaga zminimalizować ryzyko błędów produkcyjnych:

  • Walidacja przed załadowaniem: Upewnij się, że tablice bajtowe nie są nullowe i mają minimalną prawdopodobną długość (nagłówki PDF mają co najmniej kilkaset bajtów).
  • Użycie using do usuwania: Dokumenty IronPDF zawierają natywne zasoby. Zawsze je usuwaj, czy to za pomocą instrukcji using, czy wyraźnych wywołań Dispose().
  • Włączanie własnego logowania: Loguj ID dokumentu, długość tablic bajtowych i liczba stron przy każdorazowym łączeniu dokumentów z bazy danych. To znacznie ułatwia debugowanie problemów produkcyjnych.
  • Obsługa szyfrowanych PDF-ów explicite: Sprawdź, czy dokument wymaga hasła przed scaleniem. Proba odczytu zaszyfrowanego dokumentu bez uwierzytelnienia rzuca wyjatkiem zamiast zwracac puste strony.
  • Ustawianie limitow czasu dla skomplikowanych dokumentow: Bardzo duze lub skomplikowane PDFy mogą wymagać czasu na przetworzenie. Rozważ operacjpdfData != null && pdfData.Length > 0 asynchroniczne i odpowiednie limity czasowe dla scenariuszy o dużym wolumenie.
Porównanie podejść do łączenia PDF
Podejście Najlepsze dla Użycie pamięci Elastyczność
Bezpośrednia tablica bajtowa (dwa pliki) Proste połączenie dwóch dokumentów Low Podstawowe
List overload Przetwarzanie wielu plików w partii Medium High
Konstruktor MemoryStream Integracje oparte na strumieniach Low High
Wzorzec pobierania z bazy danych Produkcyjny przepływ pracy z dokumentami Medium Bardzo wysoka

Jak zaczac z mergowaniem PDF w produkcji?

IronPDF zapewnia pelnofunkcyjna wersje probna, aby mozna bylo przetestowac laczenie PDF w rzeczywistej aplikacji przed podjeciem decyzji o zakupie licencji. Proba obejmuje pelne API -- laczenie, dzielenie, konwersja, adnotacje, podpisywanie i inne -- bez ograniczen funkcji w czasie oceny.

Do celów produkcyjnych opcje licencjonowania wahają się od licencji dla jednego dewelopera po licencje na strony Enterprise obejmujace nieograniczone wdrozenia. Organizacje realizujące przepływy pracy o dużym wolumenie moga rozważyć licencjonowanie OEM dla scenariuszy redystrybucji.

Poza laczeniem, IronPDF obejmuje pelny cykl zycia przetwarzania PDF: konwersja HTML do PDF, edycja PDF, tworzenie i wypelnianie formularzy, ekstrakcja tekstu, podpisy cyfrowe i zarzadzanie bezpieczenstwem. Po uruchomieniu przeplywu pracy laczenia, te funkcje mozna dodac bez zadnych dodatkowych zaleznosci.

Odwiedź stronę z samouczkami IronPDF, aby odkryć pełne przewodniki dla każdej głównej funkcji, albo sprawdź dokumentację API dla szczegółowych informacji o każdej klasie i metodzie.

NuGet Zainstaluj za pomocą NuGet

PM >  Install-Package IronPdf

Sprawdź IronPDF na NuGet dla szybkiej instalacji. Z ponad 10 milionami pobrań, przekształca rozwój PDF z C#. Możesz również pobrać DLL lub instalator Windows.

Często Zadawane Pytania

Jak mogę połączyć dwie tablice bajtów PDF za pomocą języka C#?

W języku C# można połączyć dwie tablice bajtów PDF, korzystając z biblioteki IronPDF. Biblioteka ta pozwala w prosty sposób łączyć wiele plików PDF przechowywanych jako tablice bajtów, strumienie pamięci, a nawet bazy danych, korzystając z prostych przykładów kodu.

Jaka jest zaleta korzystania z IronPDF do łączenia tablic bajtów PDF?

IronPDF upraszcza proces łączenia tablic bajtów PDF, oferując intuicyjne funkcje, które radzą sobie ze złożonością operacji na plikach PDF, zapewniając wydajne i niezawodne wyniki.

Czy IronPDF obsługuje scalanie plików PDF z różnych źródeł danych?

Tak, IronPDF może łączyć pliki PDF z różnych źródeł danych, w tym tablic bajtów, strumieni pamięci i baz danych, co czyni go wszechstronnym narzędziem do manipulacji plikami PDF.

Czy można łączyć pliki PDF przechowywane w strumieniach pamięci z IronPDF?

Oczywiście, IronPDF obsługuje łączenie plików PDF przechowywanych w strumieniach pamięci, umożliwiając płynną integrację i funkcje scalania bezpośrednio w aplikacjach C#.

Czy IronPDF wymaga dodatkowego oprogramowania do łączenia tablic bajtów PDF?

Nie, IronPDF to samodzielna biblioteka, która nie wymaga dodatkowego oprogramowania do łączenia tablic bajtów PDF. Została zaprojektowana tak, aby łatwo zintegrować się z projektem C#.

W jaki sposób IronPDF zapewnia jakość połączonych plików PDF?

IronPDF zachowuje oryginalną jakość i formatowanie plików PDF podczas procesu łączenia, zapewniając wysoką jakość dokumentu końcowego i zachowanie całej oryginalnej treści.

Jakie formaty plików może generować IronPDF po połączeniu tablic bajtów PDF?

Po scaleniu IronPDF może wygenerować ostateczny dokument w standardowym formacie PDF, zapewniając kompatybilność z dowolną przeglądarką lub edytorem plików PDF.

Czy IronPDF może łączyć zaszyfrowane tablice bajtów PDF?

Tak, IronPDF może obsługiwać zaszyfrowane tablice bajtów PDF, pod warunkiem, że posiadasz niezbędne uprawnienia i podasz prawidłowe dane uwierzytelniające do odszyfrowania podczas procesu scalania.

Jaka wiedza programistyczna jest wymagana do korzystania z IronPDF w celu łączenia tablic bajtów PDF?

Do korzystania z IronPDF w celu łączenia tablic bajtów PDF wystarczy podstawowa znajomość języka C#, ponieważ biblioteka oferuje proste metody i obszerną dokumentację, która poprowadzi użytkownika przez cały proces.

Czy dostępne jest wsparcie techniczne w przypadku problemów z IronPDF?

Tak, IronPDF oferuje obszerną dokumentację i wsparcie techniczne, które pomogą rozwiązać wszelkie problemy, jakie mogą pojawić się podczas korzystania z biblioteki do zadań związanych z obróbką plików PDF.

Curtis Chau
Autor tekstów technicznych

Curtis Chau posiada tytuł licencjata z informatyki (Uniwersytet Carleton) i specjalizuje się w front-endowym rozwoju, z ekspertką w Node.js, TypeScript, JavaScript i React. Pasjonuje się tworzeniem intuicyjnych i estetycznie przyjemnych interfejsów użytkownika, Curtis cieszy się pracą z nowoczesnymi frameworkami i tworzeniem dobrze zorganizowanych, atrakcyjnych wizualnie podrę...

Czytaj więcej

Zespol wsparcia Iron

Jestesmy online 24 godziny, 5 dni w tygodniu.
Czat
Email
Zadzwon do mnie