Przejdź do treści stopki
KORZYSTANIE Z IRONPDF

Renderuj strony PDF w PictureBox Windows Forms | Przewodnik C#

Twórz obiekty PdfDocument z tablic bajtów i używaj PdfDocument.Merge() do ich łączenia w jeden PDF bez zapisywania na dysku. Ta metoda automatycznie obsługuje złożoną strukturę PDF, pozwalając scalić dokumenty przechowywane w bazach danych lub otrzymywane od API bez konieczności tworzenia plików tymczasowych.

Praca z plikami PDF przechowywanymi jako tablice bajtowe jest powszechna we wspolczesnych aplikacjach C#. Czy to pobieranie dokumentów PDF z bazy danych, otrzymywanie ich z uslug internetowych, czy przetwarzanie w pamięci, możliwość łączenia wielu plików PDF w jeden bez zapisywania na dysku jest niezbędna dla przepływów pracy w Enterprise. IronPDF ułatwia to dzięki intuicyjnemu API. W tym artykule prześledzisz, jak scalać tablice bajtów PDF w C#, analizując różne podejścia, w tym obsługę MemoryStream i rzeczywiste wzorce bazodanowe.

Czym sa tablice bajtowe PDF i dlaczego warto je łączyć?

Tablica bajtowa to surowe dane binarne reprezentujace plik PDF w pamięci. Podczas pracy z dokumentami PDF w C#, często napotkasz sytuacje, gdy pliki istnieja jako tablice bajtowe, a nie na dysku. Jest to szczegółnie powszechne podczas pobierania dokumentów z baz danych, gdzie PDF-y sa przechowywane jako kolumny binarne, czy podczas otrzymywania dokumentów z REST API.

Funkcjonalnosc MemoryStream w .NET -- opisana w dokumentacji Microsoft MemoryStream -- sprawia, ze obsługa tych tablic bajtowych jest wydajna, zwlaszcza w połączeniu z odpowiednim zarządzaniem pamięcią dla duzych dokumentów. Zamiast zapisywac tymczasowe pliki, można ładować, przetwarzać i zapisywac PDF-y całkowicie w pamięci -- co jest szybsze, czystsze i unika problemow z uprawnieniami do systemu plików.

Dlaczego nie można poprostu połączyć tablic bajtowych PDF?

Proste połączenie dwoch tablic bajtowych PDF nie zadziała. W przeciwienstwie do zwyklych plików tekstowych, pliki PDF maja zlozone wewnetrzne struktury z nagłówkami, tabelami odniesienia i specyficznymi konwencjami formatowania. Specyfikacja ISO 32000 PDF definiuje skomplikowane zasady dotyczące struktury dokumentu, w tym metadanych, osadzania czcionek i warstw szyfrowania. Bezpośrednie dołączenie bajtow powoduje uszkodzenie pliku. Potrzebujesz odpowiedniej biblioteki PDF do parsowania tych tablic bajtowych i łączenia ich wlasciwie, zachowujac cała integralnosc strukturalna.

IronPDF zajmuje sie wszystkimi tymi zlozonosciami wewnetrznie. Można łączyć dokumenty PDF za pomoca kilku linii kodu, zachowujac czcionki, obrazy i formatowanie dokladnie takie, jakie byly w plikach zrodlowych.

Kiedy warto łączyć tablice bajtowe?

To podejście działa 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 plików w ASP.NET bez zapisywania ich na dysku
  • Dzialasz w środowisku chmurowym, takim jak Azure Functions lub AWS Lambda, gdzie tymczasowe przechowywanie plików jest ograniczone

Podczas pracy z Azure Blob Storage lub podobnymi usługami chmurowymi, operacje na tablicach bajtowych sa niezbędne, poniewaz pobierasz surowe bajty, przetwarzasz je i wysylasz wynik -- wszystko bez dotykania systemu plików.

Jak dodać bibliotekę PDF do swojego projektu?

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

Install-Package IronPdf
dotnet add package IronPdf

Aby uzyskać szczegółowe opcje instalacji, w tym wdrożenie Docker lub konfiguracje Linux, zobacz przewodnik zaawansowanej instalacji. Jeśli wdrazasz w minimalnym środowisku, IronPDF Slim znacznie zmniejsza miejsce zajmowane przy wdrożeniu.

Po zainstalowaniu dodaj następujące przestrzenie nazw w gornym części 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 środowiskami chmurowymi bez dodatkowej konfiguracji.

Interfejs Menedżera Pakietów NuGet w Visual Studio wyświetlający wyniki wyszukiwania biblioteki IronPDF, z wybraną wersją 2025.9.4 do instalacji w projekcie IronTesting - z wyraźnie pokazanym przyciskiem zainstaluj i rozwijalną listą wersji

Zacznij z IronPDF teraz.
green arrow pointer

Jak scalac dwie tablice bajtow PDF w C#?

Oto pełny przykład pokazujacy, jak połączyć 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 przyjmuje surowe tablice bajtów bezpośrednio w swoim konstruktorze. Gdy masz już dwa wystąpienia PdfDocument, PdfDocument.Merge() łączy je w jeden dokument. Właściwość BinaryData następnie zwraca wynik jako tablicę bajtów, gotową do ponownego zapisania w bazie danych lub przesłania przez API.

API PdfDocument zapewnia szeroka funkcjonalność wykraczajaca poza proste łączenie, w tym manipulacje stronami, ekstrakcje tekstu i obsługę formularzy. Po uzyskaniu scalonego dokumentu, można zastosować dowolne z tych operacji przed wyciagnieciem koncowej tablicy bajtowej.

Jak wygląda wynik scalony?

Przeglądarka PDF wyświetlająca pomyślnie scalone dokumenty PDF z 'PDF One' na stronie 1 i 'PDF Two' na stronie 2, demonstrująca wyraźne granice dokumentów i zachowane formatowanie przy 100% powiększeniu

Wynik to pojedynczy PDF zawierający wszystkie strony z obu dokumentów źródłowych w kolejności, w jakiej zostały przekazane do Merge(). Numeracja stron, czcionki, obrazy i osadzone treści sa zachowane. Scalony dokument zachowuje sie identycznie jak kazdy inny PDF -- można go paginowac, komentowac, podpisywac lub kompresowac za pomoca tych samych metod IronPDF, ktore stosujesz do kazdego dokumentu.

Jak działa proces scałania wewnetrznie?

Gdy przekażesz tablicę bajtów do konstruktora PdfDocument, IronPDF analizuje dane binarne i buduje reprezentację struktury PDF w pamięci. Metoda PdfDocument.Merge() następnie łączy wiele dokumentów, dołączając strony z każdego źródła w kolejności, odbudowując tabelę odwołań krzyżowych i rozwiązując wszelkie konflikty nazw czcionek lub zasobów między dokumentami.

Dlatego nie można po prostu połączyć tablic bajtowych -- tabela indeksow krzyzowych w pierwszym PDF wskazuje na przesuniecia w tym pliku. Po złączeniu, te przesuniecia sa nieprawidlowe, poniewaz drugi plik je przesunal. IronPDF przebudowuje cała strukture poprawnie, co skutkuje ważnym, dobrze sformatowanym PDF.

Jak połączyć więcej niz dwa pliki PDF jednoczesnie?

IronPDF oferuje przeciążenie List pozwalające na scalanie dowolnej liczby dokumentów w jednej operacji. Jest to bardziej efektywne niz łączenie wielu dokumentów 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 podejście skaluje sie do dowolnej liczby dokumentów. Każdy PDF jest wczytywany do obiektu PdfDocument, dodawany do listy, a następnie scalany za pomocą jednego wywołania. Dla duzych wynikowych plików kompresja PDF redukuje ostateczny rozmiar bez utraty znaczacej jakosci.

Kiedy należy używać MemoryStream do łączenia PDF?

Podejście MemoryStream daje większą kontrolę, gdy integrujesz się z innymi bibliotekami .NET, które działają z strumieniami zamiast tablic bajtów. Jest to przydatne, gdy masz juz dostępny strumien (na przykład 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 wzbogacić scalony dokument poprzez ustawienie metadanych, dodanie znakow wodnych lub zastosowanie podpisow cyfrowych przed wyciagnieciem koncowych bajtow. Dla scenariuszy zgodności, rozwaz konwersje PDF/A dla dlugoterminowego archiwizowania lub zgodność PDF/UA dla wymogów dostępności.

Obrobka oparte na strumieniach umożliwia lepsze zarządzanie pamięcią dla wiekszych plików PDF i integruje sie plynnie z SDK przechowywania w chmurze. To podejście jest szczegółnie praktyczne dla asynchronicznych wzorcow w usługach o wysokiej przepustowosci.

Jak połączyć pobrane PDFy z bazy danych?

Powszechny wzorzec obejmuje pobieranie tablic bajtowych PDF z bazy danych SQL i łączenie ich na zadanie. Oto przykład gotowy do produkcji z obsługa błędów:

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 obsługuje brakujace lub nullowe rekordy w elegancki sposob, pomijajac je i kontynuujac z ważnymi dokumentami. Scalony wynik otrzymuje numery stron dodane przez nagłówki/stopki HTML przed zapisaniem jej z powrotem do bazy danych. Dla bardziej zaawansowanej nawigacji można dodac zakladki pomagajace czytelnikom w nawigacji po dlugim scalonym dokumencie.

Co sprawia, ze wzorzec bazodanowy jest skuteczny?

Powyższy wzorzec działa dla faktur, raportow, umow lub dowolnych dokumentów przechowywanych jako kolumny binarne. Kluczowe zalety:

  • Brak tymczasowych plików: Caly przepływ pracy odbywa sie w pamięci, co unika dostepu do systemu plików i zmniejsza powierzchnie ataku.
  • Eleganckie pomijanie: Nieprawidlowe lub brakujace rekordy nie powoduja przerwania całego scałania -- 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 użycia.
  • Pojedynczy zapis do bazy danych: Scalony wynik jest zapisywany raz, co ułatwia transakcje baz danych.

Jak obsługiwac błędy i skrajne przypadki?

Jakie sa najczestsze scenariusze błędu?

Budujac przepływy pracy łączenia 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: Jeśli tablic bajtowa zostala obcieta podczas przechowywania w bazie danych lub przesylania API, konstruktor rzuci wyjątkiem. Zawijanie w try-catch i zapisywanie ID dokumentu.
  3. Zaszyfrowane PDFy bez hasel: Proba łączenia zaszyfrowanego PDF bez podania hasla rzuci wyjątkiem. Uzyj IronPDF do obsługi zaszyfrowanych PDFow, aby podac dane uwierzytelniajace.
  4. Obciazenie pamięci przy wielu duzych plikach: Ladowanie dziesiątek dużych PDF jednocześnie może obciążyć dostępną pamięć. Przetwarzaj je w partiach i usuwaj obiekty 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ą poprawnie usunięte, zwalniając zasoby niezależnie zarządzane, nawet jeśli wystąpi wyjątek. Wzorzec TryXxx zwraca wskaźnik sukcesu w postaci boolean zamiast rzucać wyjątek, co ułatwia wywoływanie z kodu wyższego poziomu, który obsługuje wiele dokumentów.

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żywaj using do usuwania: Dokumenty IronPDF zawierają zasoby natywne. Zawsze je usuwaj, używając instrukcji using lub wyraźnego wywołania 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 scałeniem. Proba odczytu zaszyfrowanego dokumentu bez uwierzytelnienia rzuca wyjątkiem zamiast zwracac puste strony.
  • Ustawianie limitów czasu dla skomplikowanych dokumentów: Bardzo duze lub skomplikowane PDFy mogą wymagać czasu na przetworzenie. Rozważ operacj@@--CODE-1537--@@ 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 Niski Podstawowe
List<PdfDocument> overload Przetwarzanie wielu plików w partii Srednie Duze
Konstruktor MemoryStream Integracje oparte na strumieniach Niski Duze
Wzorzec pobierania z bazy danych Produkcyjny przepływ pracy z dokumentami Srednie Bardzo wysoka

Jak zaczac z mergowaniem PDF w produkcji?

IronPDF zapewnia pełnofunkcyjna wersje próbna, aby można bylo przetestowac łączenie PDF w rzeczywistej aplikacji przed podjeciem decyzji o zakupie licencji. Proba obejmuje pełne API -- łączenie, dzielenie, konwersja, adnotacje, podpisywanie i inne -- bez ograniczeń funkcji w czasie oceny.

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

Poza łączeniem, IronPDF obejmuje pełny cykl zycia przetwarzania PDF: konwersja HTML do PDF, edycja PDF, tworzenie i wypelnianie formularzy, ekstrakcja tekstu, podpisy cyfrowe i zarządzanie bezpieczenstwem. Po uruchomieniu przepływu pracy łączenia, te funkcje można dodac bez zadnych dodatkowych zależności.

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 scałanie 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 scałania 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 scałeniu 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 scałania.

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

Zespół wsparcia Iron

Jesteśmy online 24 godziny, 5 dni w tygodniu.
Czat
E-mail
Zadzwoń do mnie