
Wie man zwei PDF-Byte-Arrays in C# mit IronPDF zusammenführt
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:
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.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()
// );
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;"
// }' appsettings.json snippet (not VB.NET -- 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();Imports Microsoft.Extensions.DependencyInjection
Dim builder = WebApplication.CreateBuilder(args)
builder.Services.AddControllers()
builder.Services.AddSingleton(Of IConfiguration)(builder.Configuration)
IronPdf.License.LicenseKey = builder.Configuration("IronPdf:LicenseKey")
Dim 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>();
}
}
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);
}
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");
}Imports Microsoft.AspNetCore.Mvc
<HttpGet("watermarked/{id}")>
Public Async Function GetWatermarkedPdf(id As Integer) As Task(Of IActionResult)
Dim pdfBytes As Byte() = Await RetrievePdfBytesAsync(id)
If pdfBytes Is Nothing OrElse pdfBytes.Length = 0 Then
Return NotFound("PDF document not found.")
End If
Using pdfDocument As New PdfDocument(pdfBytes)
' HTML watermark applied to every page
Dim watermarkHtml As String = "<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")
End Using
End FunctionDie 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 });
}
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:
| Spalte | Datentyp | Zweck |
|---|---|---|
| Ausweis | INT IDENTITÄT | Primärschlüssel, automatische Inkrementierung |
| Dateiname | NVARCHAR(255) | Originaler Dateiname für Download-Header |
| Dateiinhalt | VARBINÄR(MAX) | Rohdaten im PDF-Format (BLOB) |
| ContentType | NVARCHAR(100) | MIME-Typ, z. B. application/pdf |
| Dateigröße in Bytes | BIGINT | Gespeicherte Größe für die Quotenverwaltung |
| Hochgeladen am | DATETIME2 | UTC-Zeitstempel für die Prüfung |
| Hochgeladen von | NVARCHAR(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:
| Sorge | Empfehlung | Grund |
|---|---|---|
| Anschlussentsorgung | await using -Anweisungen | Verhindert die Erschöpfung des Verbindungspools |
| PDF-Dokumentenentsorgung | using -Anweisungen | Gibt nicht verwalteten Speicher umgehend frei |
| SQL-Injection | Nur parametrisierte Abfragen | Verhindert, dass böswillige Eingaben Abfragen verändern. |
| Dateitypvalidierung | MIME-Typ und Magic Bytes prüfen | Blockiert Uploads von Nicht-PDF-Dateien vor der Speicherung |
| Verarbeitung großer Dateien | Stream-Antwort mit FileStreamResult | Vermeidet das Laden der gesamten Datei in den Serverspeicher. |
| Caching | Verwenden Sie IMemoryCache oder IDistributedCache | Reduziert wiederholte Datenbankabfragen |
| Asynchrone Operationen | async / await durchgehend | Hä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:
- IronPDF PDF-Generierung aus HTML – PDFs dynamisch generieren und direkt in Ihrer Datenbank speichern
- IronPDF Zusammenführen und Aufteilen von PDFs – Abgerufene Dokumente zu einer einzigen Antwort kombinieren
- IronPDF Sicherheit und Berechtigungen – Passwortschutz vor der Bereitstellung sensibler Dokumente hinzufügen IronPDF HTML zu PDF-Anleitung – Webseiteninhalte zur Archivierung in PDFs konvertieren
- IronPDF PDF-Stempelung – Text- und Bildstempel auf abgerufene Dateien anwenden
- IronPDF Lizenzierung – Lizenzstufen für Entwicklung, Testumgebung und Produktion prüfen
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 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.
Verwandte Artikel


