IRONSOFTWAREHOME
IRONPDF NUTZEN

Wie man zwei PDF-Byte-Arrays in C# mit IronPDF zusammenführt

Curtis Chau
Curtis Chau
Updated: 9. März 2026

Das Abrufen einer PDF-Datei aus einer Datenbank in ASP.NET mit C# erfordert drei Schritte: Die Abfrage der Datenbanktabelle für die Binär-BLOB-Spalte, das Laden der Bytes in ein PdfDocument-Objekt mit IronPDF und das Zurückgeben der Bytes an den Browser über eine DateiinhaltResult oder File() Antwort. IronPDF kümmert sich um das Rendern, das Wasserzeichen und die Sicherheitsfunktionen, sodass Sie sich auf die Datenzugriffslogik konzentrieren können.

Wie installiert man IronPDF für ASP.NET?

Bevor Sie Code zum Abrufen von PDFs schreiben, fügen Sie IronPDF über den NuGet -Paketmanager zu Ihrem Projekt hinzu:

PM > Install-Package IronPdf

Nach der Installation setzen Sie Ihren Lizenzschlüssel in Program.cs oder appsettings.json, bevor Sie eine Methode von IronPDF aufrufen:

IronPdf.License.LicenseKey = "YOUR-LICENSE-KEY";

IronPDF unterstützt .NET 10 , .NET 8, .NET 6 und .NET Framework 4.6.2+. Es funktioniert unter Windows, Linux und macOS, ohne dass zusätzliche Abhängigkeiten oder die Installation eines Headless-Browsers erforderlich sind. Eine kostenlose Testlizenz steht zur Verfügung.

Wie richtet man die SQL Server-Datenbanktabelle ein?

Der gebräuchlichste Ansatz ist das Speichern von PDF-Dateien als Binärdaten in einer SQL Server VARBINÄR(MAX)-Spalte. Dadurch bleiben das Dokument und seine Metadaten in einer einzigen Tabelle zusammen, die Datensicherung wird vereinfacht und die Verwaltung von Dateisystempfaden vermieden.

Verwenden Sie das folgende SQL-Skript, um die Speichertabelle zu erstellen:

// SQL Server table definition (run this in SSMS or via EF migrations)
// CREATE TABLE PdfDocuments (
//     Ausweis INT IDENTITÄT(1,1) PRIMARY KEY,
//     Dateiname NVARCHAR(255) NOT NULL,
//     Dateiinhalt VARBINÄR(MAX) NOT NULL,
//     Hochgeladen am DATETIME2 DEFAULT GETUTCDATE()
// );
C#

Sobald die Tabelle existiert, konfigurieren Sie die Verbindungszeichenfolge in appsettings.json:

// appsettings.json snippet (not C# -- shown as reference)
// "ConnectionStrings": {
//   "DefaultConnection": "Server=localhost;Database=PdfStorage;Integrated Security=True;"
// }

Registrieren Sie die Verbindungszeichenfolge über Dependency Injection in Program.cs:

using Microsoft.Extensions.DependencyInjection;

var builder = WebApplication.CreateBuilder(args);
builder.Services.AddControllers();
builder.Services.AddSingleton<IConfiguration>(builder.Configuration);

IronPdf.License.LicenseKey = builder.Configuration["IronPdf:LicenseKey"];

var app = builder.Build();
app.MapControllers();
app.Run();

Wie ruft man in ASP.NET Core eine PDF-Datei von einem SQL Server ab?

Das Abrufmuster folgt drei Schritten: Öffnen einer Verbindung, Ausführen einer parametrisierten SELECT-Abfrage und Lesen der Binärspalte in eine byte[]. IronPDF lädt dann dieses Array in ein PdfDocument-Objekt für optionale Verarbeitung, bevor es an den Client gestreamt wird.

Erstellung des API-Controllers

Erstellen Sie einen Controller, der GET-Endpunkte sowohl für die Inline-Anzeige als auch für den Dateidownload bereitstellt:

using IronPdf;
using Microsoft.AspNetCore.Mvc;
using Microsoft.Data.SqlClient;

[ApiController]
[Route("api/[controller]")]
public class PdfController : ControllerBase
{
    private readonly string _connectionString;

    public PdfController(IConfiguration configuration)
    {
        _connectionString = configuration.GetConnectionString("DefaultConnection")
            ?? throw new InvalidOperationException("Connection string not found.");
    }

    [HttpGet("{id}")]
    public async Task<IActionResult> GetPdf(int id)
    {
        byte[] pdfBytes = await RetrievePdfBytesAsync(id);
        if (pdfBytes is null || pdfBytes.Length == 0)
            return NotFound("PDF document not found.");

        // Load into IronPDF for validation or optional modification
        using var pdfDocument = new PdfDocument(pdfBytes);

        // Inline display -- browser opens PDF viewer
        Response.Headers.Append("Content-Disposition", "inline; filename=\"document.pdf\"");
        return File(pdfDocument.BinaryData, "application/pdf");
    }

    private async Task<byte[]> RetrievePdfBytesAsync(int documentAusweis)
    {
        await using var connection = new SqlConnection(_connectionString);
        await connection.OpenAsync();

        const string query = "SELECT Dateiinhalt FROM PdfDocuments WHERE Ausweis = @Ausweis";
        await using var command = new SqlCommand(query, connection);
        command.Parameters.AddWithValue("@Ausweis", documentAusweis);

        var result = await command.ExecuteScalarAsync();
        return result as byte[] ?? Array.Empty<byte>();
    }
}
C#

Dieser Controller verwendet parametrisierte Abfragen, um SQL-Injection zu verhindern, und await using, um SqlConnection und SqlCommand korrekt zu entsorgen. Die PdfDocument-Klasse validiert das Byte-Array und bietet die BinaryData-Eigenschaft zum Streaming an.

Eine benannte Datei zum Herunterladen zurückgeben

Wenn Benutzer das Dokument speichern müssen, anstatt es inline anzuzeigen, setzen Sie den Content-Disposition Header auf attachment und geben den ursprünglichen Dateinamen an:

[HttpGet("download/{id}")]
public async Task<IActionResult> DownloadPdf(int id)
{
    await using var connection = new SqlConnection(_connectionString);
    await connection.OpenAsync();

    const string query = "SELECT Dateiname, Dateiinhalt FROM PdfDocuments WHERE Ausweis = @Ausweis";
    await using var command = new SqlCommand(query, connection);
    command.Parameters.AddWithValue("@Ausweis", documentAusweis);

    await using var reader = await command.ExecuteReaderAsync();
    if (!await reader.ReadAsync())
        return NotFound("Document not found.");

    var fileName = reader.GetString(reader.GetOrdinal("Dateiname"));
    var pdfBytes = (byte[])reader["Dateiinhalt"];

    using var pdfDocument = new PdfDocument(pdfBytes);
    return File(pdfDocument.BinaryData, "application/pdf", fileName);
}
C#

Das Übergeben von fileName als drittes Argument an File() setzt den Content-Disposition Header automatisch auf attachment. ASP.NET Core sorgt für die korrekte Maskierung von Dateinamen, die Leerzeichen enthalten.

Wie fügt man einem abgerufenen PDF ein Wasserzeichen hinzu?

Eine der praktischsten Nachbearbeitungsmaßnahmen ist das Aufbringen eines Wasserzeichens auf jede Seite, bevor das Dokument zugestellt wird. Dies ist nützlich für vertrauliche Berichte, Dokumententwürfe oder jede Datei, die eine sichtbare Sicherheitskennzeichnung benötigt.

Anwenden eines HTML-Wasserzeichens mit IronPDF

Die Watermark-API von IronPDF akzeptiert beliebige HTML-Zeichenketten, was bedeutet, dass Sie den Wasserzeichentext mithilfe von Inline-CSS gestalten können. Stellen Sie die Deckkraft so niedrig ein, dass der darunterliegende Inhalt lesbar bleibt:

[HttpGet("watermarked/{id}")]
public async Task<IActionResult> GetWatermarkedPdf(int id)
{
    byte[] pdfBytes = await RetrievePdfBytesAsync(id);
    if (pdfBytes is null || pdfBytes.Length == 0)
        return NotFound("PDF document not found.");

    using var pdfDocument = new PdfDocument(pdfBytes);

    // HTML watermark applied to every page
    string watermarkHtml = "<h2 style='color:red; opacity:0.4; font-family:Arial;'>CONFIDENTIAL</h2>";
    pdfDocument.ApplyWatermark(
        watermarkHtml,
        rotation: 30,
        verticalAlignment: VerticalAlignment.Middle,
        horizontalAlignment: HorizontalAlignment.Center
    );

    return File(pdfDocument.BinaryData, "application/pdf");
}

Die ApplyWatermark-Methode akzeptiert standardmäßiges HTML und CSS, sodass Sie volle Kontrolle über Schriftart, Farbe, Deckkraft und Position haben. Das Wasserzeichen wird automatisch auf alle Seiten des Dokuments angewendet. Weitere Funktionen zur PDF-Bearbeitung , wie das Einfügen von Stempeln in Bilder, das Hinzufügen von Kopf- und Fußzeilen oder das Zusammenführen mehrerer Dokumente, finden Sie in der IronPDF -Dokumentation.

Wie speichert man hochgeladene PDFs wieder in SQL Server?

Für den vollständigen Roundtrip wird ein Upload-Endpunkt benötigt, der eingehende Formulardateien liest und in die Datenbank schreibt. Dies bildet zusammen mit den oben genannten Abruf-Endpunkten ein vollständiges Dokumentenmanagementsystem:

[HttpPost("upload")]
public async Task<IActionResult> UploadPdf(IFormFile file)
{
    if (file is null || file.Length == 0)
        return BadRequest("No file uploaded.");

    if (!file.ContentType.Equals("application/pdf", StringComparison.OrdinalIgnoreCase))
        return BadRequest("Only PDF files are accepted.");

    using var memoryStream = new MemoryStream();
    await file.CopyToAsync(memoryStream);
    byte[] pdfBytes = memoryStream.ToArray();

    // Validate using IronPDF before storage
    using var pdfDocument = new PdfDocument(pdfBytes);

    await using var connection = new SqlConnection(_connectionString);
    await connection.OpenAsync();

    const string insertQuery = @"
        INSERT INTO PdfDocuments (Dateiname, Dateiinhalt)
        VALUES (@Dateiname, @Dateiinhalt);
        SELECT SCOPE_IDENTITY();";

    await using var command = new SqlCommand(insertQuery, connection);
    command.Parameters.AddWithValue("@Dateiname", file.Dateiname);
    command.Parameters.AddWithValue("@Dateiinhalt", pdfDocument.BinaryData);

    var newAusweis = Convert.ToInt32(await command.ExecuteScalarAsync());
    return Ok(new { id = newAusweis, fileName = file.Dateiname });
}
C#

Die Verwendung von PdfDocument zur Validierung vor der Speicherung gewährleistet, dass nur parsfähige, gut geformte PDF-Dateien in die Datenbank gelangen. Wenn das Byte-Array beschädigt oder abgeschnitten ist, wirft IronPDF eine Ausnahme, die Sie abfangen und als 400 Bad Request Antwort zurückgeben können.

Welche Tabellen und Spaltentypen sind für die PDF-Speicherung am wichtigsten?

Das verwendete Schema beeinflusst die Abfrageleistung und die Speichereffizienz. Die folgende Tabelle zeigt die empfohlene Spaltenkonfiguration für SQL Server:

Empfohlenes SQL-Server-Schema für die Speicherung von PDF-BLOBs
SpalteDatentypZweck
AusweisINT IDENTITÄTPrimärschlüssel, automatische Inkrementierung
DateinameNVARCHAR(255)Originaler Dateiname für Download-Header
DateiinhaltVARBINÄR(MAX)Rohdaten im PDF-Format (BLOB)
ContentTypeNVARCHAR(100)MIME-Typ, z. B. application/pdf
Dateigröße in BytesBIGINTGespeicherte Größe für die Quotenverwaltung
Hochgeladen amDATETIME2UTC-Zeitstempel für die Prüfung
Hochgeladen vonNVARCHAR(100)Benutzeridentität für die Zugriffskontrolle

Für große Systeme, in denen SQL Server File Streaming benötigt wird, dokumentiert Microsoft die FILESTREAM-Funktion als Alternative, die große BLOBs im Dateisystem speichert und gleichzeitig über T-SQL abfragbar bleibt. Für die meisten ASP.NET-Anwendungen, die Dokumente bis zu einigen hundert Megabyte bereitstellen, funktioniert VARBINÄR(MAX) In-Row-Speicherung gut und vereinfacht die Bereitstellung.

Wie gehen Sie mit Fehlern um und optimieren die Leistung?

Für einen zuverlässigen PDF-Abruf im Produktivbetrieb ist eine Fehlerbehandlung auf jeder Ebene erforderlich – Datenbank, IronPDF und HTTP-Antwort. Die folgende Tabelle fasst die wichtigsten Vorgehensweisen zusammen:

Fehlerbehandlung und Leistungsmuster beim PDF-Abruf
SorgeEmpfehlungGrund
Anschlussentsorgungawait using -AnweisungenVerhindert die Erschöpfung des Verbindungspools
PDF-Dokumentenentsorgungusing -AnweisungenGibt nicht verwalteten Speicher umgehend frei
SQL-InjectionNur parametrisierte AbfragenVerhindert, dass böswillige Eingaben Abfragen verändern.
DateitypvalidierungMIME-Typ und Magic Bytes prüfenBlockiert Uploads von Nicht-PDF-Dateien vor der Speicherung
Verarbeitung großer DateienStream-Antwort mit FileStreamResultVermeidet das Laden der gesamten Datei in den Serverspeicher.
CachingVerwenden Sie IMemoryCache oder IDistributedCacheReduziert wiederholte Datenbankabfragen
Asynchrone Operationenasync / await durchgehendHält Threads während Festplatten- und Netzwerkzugriffen frei

Für das Management der Verbindungszeichenfolge speichern Sie den Wert in appsettings.json und niemals als Hardcode in Quelldateien. Verwenden Sie während der lokalen Entwicklung die in ASP.NET Core integrierte Geheimnisverwaltung und im Produktionsbetrieb Azure Key Vault oder AWS Secrets Manager. Speichern Sie niemals Verbindungszeichenfolgen oder Lizenzschlüssel in der Quellcodeverwaltung.

Beim Bereitstellen großer PDF-Dateien sollten Sie erwägen, eine FileStreamResult zu verwenden, die von einer MemoryStream unterstützt wird anstelle des Ladens des gesamten Byte-Arrays in den Speicher. Für sehr große Dokumente – über 100 MB – ermöglicht die SQL Server FILESTREAM API das Streaming in Blöcken direkt aus dem Dateisystem.

Zwischenspeicherung häufig aufgerufener Dokumente

Wenn bestimmte PDF-Dateien wiederholt angefordert werden – beispielsweise ein Dokument mit Bedingungen und Konditionen oder ein Produktkatalog – vermeidet das Cachen des Byte-Arrays in IMemoryCache wiederholte Datenbankabfragen. Registrieren Sie IMemoryCache in Program.cs mit builder.Services.AddMemoryCache(), dann injizieren Sie es in den Controller und überprüfen Sie den Cache, bevor Sie die Datenbank abfragen. Legen Sie ein absolutes Ablaufdatum fest, das der erwarteten Aktualisierungshäufigkeit der Dokumente entspricht. Wenn ein Dokument aktualisiert wird, wird der zwischengespeicherte Eintrag anhand des Schlüssels entfernt, damit die nächste Anfrage die neue Version abruft.

Für verteilte Szenarien – wie eine Lastverteilung mit mehreren Serverinstanzen – ersetzen Sie IMemoryCache durch IDistributedCache, unterstützt von Redis oder SQL Server. Die Abstraktionen des verteilten Caches von ASP.NET Core sorgen dafür, dass der Controller-Code nahezu identisch bleibt; Nur die Registrierung in Program.cs ändert sich.

Wie implementiert man die PDF-Abfrage plattformübergreifend mit IronPDF?

IronPDF läuft unter Linux, Windows und macOS, ohne dass eine separate Chromium-Installation oder Konfigurationsänderungen erforderlich sind. Das gleiche NuGet Paket ist für alle Plattformen geeignet, sodass Ihr PDF-Controller unabhängig von der verwendeten Plattform identisch funktioniert:

  • Windows Server mit IIS
  • Ubuntu-Container auf Docker oder Kubernetes
  • Azure App Service (Linux oder Windows)
  • AWS Elastic Beanstalk

Bereitstellung auf Docker und Linux

Für Docker-Bereitstellungen fügen Sie die IronPDF Abhängigkeiten zu Ihrer Dockerfile hinzu. Die IronPDF Linux-Dokumentation enthält die exakten apt-Pakete, die für Debian- und Alpine-Basisimages benötigt werden. Ein typisches mehrstufiges Dockerfile installiert die Betriebssystemabhängigkeiten in der Laufzeit-Image-Phase und kopiert anschließend die veröffentlichte ASP.NET Anwendung darüber. Bei Verwendung von Azure beschreibt der Azure-Bereitstellungsleitfaden die App Service-Konfiguration, einschließlich der Speicher- und CPU-Einstellungen, die das PDF-Rendering in großem Umfang unterstützen.

Da IronPDF eine eigene, auf Chromium basierende Rendering-Engine mitbringt, ist die Installation eines separaten Browsers auf dem Server nicht erforderlich. Dies vereinfacht die Einrichtung von Linux-Containern erheblich im Vergleich zu Lösungen, die einen systemweiten Browser erfordern. Das IronPDF Team testet jede neue Version anhand der gängigsten Linux-Basis-Images, sodass Sie darauf vertrauen können, dass ein Alpine- oder Debian-Container sofort funktioniert.

Verwendung von Entity Framework Core anstelle von ADO .NET

IronPDF integriert sich auch mit Entity Framework Core als Alternative zu reinem ADO .NET. Wenn Ihr Projekt bereits EF Core verwendet, können Sie die Dateiinhalt-Spalte auf eine byte[]-Eigenschaft in einer Modellklasse abbilden und EF die Generierung der Abfrage überlassen. Dieser Ansatz reduziert den Boilerplate-Code erheblich und erleichtert das Hinzufügen von Filter-, Paginierungs- und Prüffunktionen über den LINQ-Provider von EF.

Der Kompromiss besteht darin, dass EF Core den gesamten BLOB als Teil des Entitätsgraphen in den Speicher lädt. Bei sehr großen PDF-Dateien sollten Sie erwägen, rohes ADO.NET oder die FromSql-Methode von EF Core mit einer Projektion zu verwenden, die nur die Byte-Array-Spalte anstelle der gesamten Entität auswählt.

Was sind Ihre nächsten Schritte?

Das Abrufen von PDF-Dateien aus einer SQL Server-Datenbank in ASP.NET Core mit C# und IronPDF folgt einem klaren Muster: Abfrage der BLOB-Spalte mit einem parametrierten SELECT, Laden der Bytes in eine PdfDocument und Rückgabe der Binärdaten mit dem richtigen Content-Disposition-Header. IronPDF bietet die Möglichkeit, Dokumente zu validieren, mit einem Wasserzeichen zu versehen, zusammenzuführen oder zu sichern, bevor sie Ihren Server verlassen.

Um die Dokumentenverwaltungsfunktionen von IronPDF noch besser kennenzulernen, sollten Sie folgende Ressourcen nutzen:

Starten Sie mit einer kostenlosen IronPDF -Testlizenz, um alle Funktionen uneingeschränkt zu testen. Die Testversion erzeugt Ausgaben mit Wasserzeichen; Das Wasserzeichen lässt sich durch Anwenden eines kostenpflichtigen Lizenzschlüssels entfernen. Die vollständige API-Referenzdokumentation und Codebeispiele für jede in diesem Artikel verwendete Methode sind auf der IronPDF -Website verfügbar.

Wenn Ihr Projekt bereits Entity Framework Core verwendet, zeigt Ihnen der IronPDF Leitfaden zur EF-Core-Integration, wie Sie rohes .NET durch Entitätsmodelle ersetzen und dabei die bestehende IronPDF -Verarbeitungspipeline beibehalten. Für Teams, die mit .NET 10 und den neuesten ASP.NET Core -Funktionen arbeiten, funktionieren die hier beschriebenen Muster ohne Änderungen – IronPDF unterstützt alle aktiven .NET LTS- und STS-Versionen.

Auf der IronPDF -Preisseite finden Sie die passende Lizenzstufe für Ihre Anwendung. Eine einzelne Entwicklerlizenz deckt die lokale Entwicklung und das Testen ab; Weiterverteilungslizenzen sind für SaaS-Produkte und lokale Installationen mit mehreren Servern erhältlich.

Curtis Chau
Technischer Autor

Curtis Chau hat einen Bachelor-Abschluss in Informatik von der Carleton University und ist spezialisiert auf Frontend-Entwicklung mit Expertise in Node.js, TypeScript, JavaScript und React. Leidenschaftlich widmet er sich der Erstellung intuitiver und ästhetisch ansprechender Benutzerschnittstellen und arbeitet gerne mit modernen Frameworks sowie der Erstellung gut strukturierter, optisch ansprechender Handbücher.

...
Weiterlesen

Verwandte Artikel

Key in blue circle

Holen Sie sich sofort Ihren kostenlosen 30-Tage-Testschlüssel.

Keine Einschränkungen. 100 % freigeschaltet. Keine Kreditkarte.

bullet_checkedIhr Testlizenzschlüssel wurde Ihnen per E-Mail gesendet.Keine Einschränkungen. 100 % freigeschaltet. Keine Kreditkarte.
  • Logo Aetna
  • Logo NASA
  • Logo GE
  • Logo Porsche
  • Logo USDA
  • Logo Qatar
Join Millions of Engineers who’ve tried IronPDF
Buchen Sie Ihre kostenlose Live-Demo
Booking Badge

Von Millionen von Ingenieur*innen weltweit vertraut

Kundenlogos von Iron Software
Erhalten Sie Ihre unverbindliche Beratung
Füllen Sie das Formular unten aus oder senden Sie eine E-Mail an sales@ironsoftware.com
Ihre Daten werden immer vertraulich behandelt.
Von Millionen von Ingenieur*innen weltweit vertraut
Kundenlogos von Iron Software
Erhalten Sie sofort Ihren kostenlosen 30-Tage-Testschlüssel.
Ihr Testlizenzschlüssel wurde Ihnen per E-Mail gesendet.