Jak pobrać pliki PDF z bazy danych w ASP.NET z użyciem C#
Pobieranie pliku PDF z bazy danych w ASP.NET przy użyciu języka C# wymaga trzech kroków: wysłania zapytania do tabeli bazy danych o kolumnę binarną BLOB, załadowania bajtów do obiektu PdfDocument przy użyciu IronPDF oraz zwrócenia bajtów do przeglądarki poprzez odpowiedź Zawartość plikuResult lub File(). IronPDF zajmuje się renderowaniem, znakowaniem wodnym i funkcjami bezpieczeństwa, dzięki czemu możesz skupić się na logice dostępu do danych.
Jak zainstalować IronPDF dla ASP.NET?
Przed napisaniem jakiegokolwiek kodu do pobierania plików PDF dodaj IronPDF do swojego projektu za pomocą menedżera pakietów NuGet:
Install-Package IronPdf
dotnet add package IronPdf
Install-Package IronPdf
dotnet add package IronPdf
Po instalacji należy ustawić klucz licencyjny w Program.cs lub appsettings.json przed wywołaniem jakiejkolwiek metody IronPDF:
IronPdf.License.LicenseKey = "YOUR-LICENSE-KEY";
IronPdf.License.LicenseKey = "YOUR-LICENSE-KEY";
IronPdf.License.LicenseKey = "YOUR-LICENSE-KEY"
IronPDF obsługuje .NET 10, .NET 8, .NET 6 oraz .NET Framework 4.6.2+. Działa na systemach Windows, Linux i macOS bez konieczności instalowania dodatkowych zależności lub przeglądarek bezinterfejsowych. Dostępna jest bezpłatna licencja próbna do oceny.
Jak skonfigurować tabelę bazy danych SQL Server?
Najczęściej stosowanym podejściem jest przechowywanie plików PDF jako danych binarnych w kolumnie VARBINARY(MAX) serwera SQL. Dzięki temu dokument i jego metadane są przechowywane razem w jednej tabeli, co upraszcza tworzenie kopii zapasowych i pozwala uniknąć zarządzania ścieżkami w systemie plików.
Użyj poniższego skryptu SQL, aby utworzyć tabelę przechowywania:
// SQL Server table definition (run this in SSMS or via EF migrations)
// CREATE TABLE PdfDocuments (
// Id TOŻSAMOŚĆ(1,1) PRIMARY KEY,
// Nazwa pliku NVARCHAR(255) NOT NULL,
// Zawartość pliku VARBINARY(MAX) NOT NULL,
// Wysłano DATETIME2 DEFAULT GETUTCDATE()
// );
// SQL Server table definition (run this in SSMS or via EF migrations)
// CREATE TABLE PdfDocuments (
// Id TOŻSAMOŚĆ(1,1) PRIMARY KEY,
// Nazwa pliku NVARCHAR(255) NOT NULL,
// Zawartość pliku VARBINARY(MAX) NOT NULL,
// Wysłano DATETIME2 DEFAULT GETUTCDATE()
// );
' SQL Server table definition (run this in SSMS or via EF migrations)
' CREATE TABLE PdfDocuments (
' Id INT IDENTITY(1,1) PRIMARY KEY,
' NazwaPliku NVARCHAR(255) NOT NULL,
' ZawartoscPliku VARBINARY(MAX) NOT NULL,
' Wyslano DATETIME2 DEFAULT GETUTCDATE()
' );
Po utworzeniu tabeli skonfiguruj ciąg połączenia w appsettings.json:
// appsettings.json snippet (not C# -- shown as reference)
// "ConnectionStrings": {
// "DefaultConnection": "Server=localhost;Database=PdfStorage;Integrated Security=True;"
// }
// 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;"
' }
Zarejestruj ciąg połączenia poprzez wstrzykiwanie zależności w 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();
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()
Jak pobrać plik PDF z serwera SQL w ASP.NET Core?
Wzorzec pobierania danych składa się z trzech kroków: otwarcie połączenia, wykonanie sparametryzowanego zapytania SELECT oraz wczytanie kolumny binarnej do byte[]. Następnie IronPDF ładuje tę tablicę do obiektu PdfDocument w celu opcjonalnego przetworzenia przed przesłaniem strumieniowym do klienta.
Tworzenie kontrolera API
Utwórz kontroler, który udostępnia punkty końcowe GET zarówno do wyświetlania wbudowanego, jak i pobierania plików:
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 documentId)
{
await using var connection = new SqlConnection(_connectionString);
await connection.OpenAsync();
const string query = "SELECT Zawartość pliku FROM PdfDocuments WHERE Id = @Id";
await using var command = new SqlCommand(query, connection);
command.Parameters.AddWithValue("@Id", documentId);
var result = await command.ExecuteScalarAsync();
return result as byte[] ?? Array.Empty<byte>();
}
}
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 documentId)
{
await using var connection = new SqlConnection(_connectionString);
await connection.OpenAsync();
const string query = "SELECT Zawartość pliku FROM PdfDocuments WHERE Id = @Id";
await using var command = new SqlCommand(query, connection);
command.Parameters.AddWithValue("@Id", documentId);
var result = await command.ExecuteScalarAsync();
return result as byte[] ?? Array.Empty<byte>();
}
}
Imports IronPdf
Imports Microsoft.AspNetCore.Mvc
Imports Microsoft.Data.SqlClient
<ApiController>
<Route("api/[controller]")>
Public Class PdfController
Inherits ControllerBase
Private ReadOnly _connectionString As String
Public Sub New(configuration As IConfiguration)
_connectionString = configuration.GetConnectionString("DefaultConnection")
If _connectionString Is Nothing Then
Throw New InvalidOperationException("Connection string not found.")
End If
End Sub
<HttpGet("{id}")>
Public Async Function GetPdf(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
' Load into IronPDF for validation or optional modification
Using pdfDocument As New PdfDocument(pdfBytes)
' Inline display -- browser opens PDF viewer
Response.Headers.Append("Content-Disposition", "inline; filename=""document.pdf""")
Return File(pdfDocument.BinaryData, "application/pdf")
End Using
End Function
Private Async Function RetrievePdfBytesAsync(documentId As Integer) As Task(Of Byte())
Await Using connection As New SqlConnection(_connectionString)
Await connection.OpenAsync()
Const query As String = "SELECT Zawartość pliku FROM PdfDocuments WHERE Id = @Id"
Await Using command As New SqlCommand(query, connection)
command.Parameters.AddWithValue("@Id", documentId)
Dim result As Object = Await command.ExecuteScalarAsync()
Return If(TryCast(result, Byte()), Array.Empty(Of Byte)())
End Using
End Using
End Function
End Class
Ten kontroler wykorzystuje zapytania parametryczne, aby zapobiec wstrzyknięciu kodu SQL, oraz await using do prawidłowego usuwania SqlConnection i SqlCommand. Klasa PdfDocument weryfikuje tablicę bajtów i udostępnia właściwość BinaryData do strumieniowania.
Zwracanie pliku o określonej nazwie do pobrania
Gdy użytkownicy chcą zapisać dokument zamiast wyświetlać go w trybie inline, należy ustawić nagłówek Content-Disposition na attachment i przekazać oryginalną nazwę pliku:
[HttpGet("download/{id}")]
public async Task<IActionResult> DownloadPdf(int id)
{
await using var connection = new SqlConnection(_connectionString);
await connection.OpenAsync();
const string query = "SELECT Nazwa pliku, Zawartość pliku FROM PdfDocuments WHERE Id = @Id";
await using var command = new SqlCommand(query, connection);
command.Parameters.AddWithValue("@Id", documentId);
await using var reader = await command.ExecuteReaderAsync();
if (!await reader.ReadAsync())
return NotFound("Document not found.");
var fileName = reader.GetString(reader.GetOrdinal("Nazwa pliku"));
var pdfBytes = (byte[])reader["Zawartość pliku"];
using var pdfDocument = new PdfDocument(pdfBytes);
return File(pdfDocument.BinaryData, "application/pdf", fileName);
}
[HttpGet("download/{id}")]
public async Task<IActionResult> DownloadPdf(int id)
{
await using var connection = new SqlConnection(_connectionString);
await connection.OpenAsync();
const string query = "SELECT Nazwa pliku, Zawartość pliku FROM PdfDocuments WHERE Id = @Id";
await using var command = new SqlCommand(query, connection);
command.Parameters.AddWithValue("@Id", documentId);
await using var reader = await command.ExecuteReaderAsync();
if (!await reader.ReadAsync())
return NotFound("Document not found.");
var fileName = reader.GetString(reader.GetOrdinal("Nazwa pliku"));
var pdfBytes = (byte[])reader["Zawartość pliku"];
using var pdfDocument = new PdfDocument(pdfBytes);
return File(pdfDocument.BinaryData, "application/pdf", fileName);
}
Imports System.Data.SqlClient
Imports Microsoft.AspNetCore.Mvc
<HttpGet("download/{id}")>
Public Async Function DownloadPdf(id As Integer) As Task(Of IActionResult)
Await Using connection As New SqlConnection(_connectionString)
Await connection.OpenAsync()
Const query As String = "SELECT Nazwa pliku, Zawartość pliku FROM PdfDocuments WHERE Id = @Id"
Await Using command As New SqlCommand(query, connection)
command.Parameters.AddWithValue("@Id", id)
Await Using reader As SqlDataReader = Await command.ExecuteReaderAsync()
If Not Await reader.ReadAsync() Then
Return NotFound("Document not found.")
End If
Dim fileName As String = reader.GetString(reader.GetOrdinal("Nazwa pliku"))
Dim pdfBytes As Byte() = CType(reader("Zawartość pliku"), Byte())
Using pdfDocument As New PdfDocument(pdfBytes)
Return File(pdfDocument.BinaryData, "application/pdf", fileName)
End Using
End Using
End Using
End Using
End Function
Przekazanie fileName jako trzeciego argumentu do File() automatycznie ustawia nagłówek Content-Disposition na attachment. ASP.NET Core obsługuje poprawne cytowanie nazw plików zawierających spacje.
Jak dodać znak wodny do pobranego pliku PDF?
Jedną z najbardziej praktycznych operacji wykonywanych po pobraniu danych jest umieszczenie znaku wodnego na każdej stronie przed udostępnieniem dokumentu. Jest to przydatne w przypadku poufnych raportów, projektów dokumentów lub wszelkich plików, które wymagają widocznego oznaczenia bezpieczeństwa.
Stosowanie znaku wodnego HTML za pomocą IronPDF
API znaków wodnych IronPDF akceptuje dowolny ciąg znaków HTML, co oznacza, że można stylizować tekst znaku wodnego za pomocą wbudowanego CSS. Ustaw przezroczystość na poziomie wystarczająco niskim, aby treść znajdująca się pod spodem pozostała czytelna:
[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");
}
[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 Function
Metoda ApplyWatermark akceptuje standardowy kod HTML i CSS, dzięki czemu masz pełną kontrolę nad czcionką, kolorem, kryciem i położeniem. Znak wodny jest automatycznie nakładany na wszystkie strony dokumentu. Aby uzyskać informacje na temat dodatkowych funkcji edycji plików PDF, w tym stemplowania obrazów, dodawania nagłówków i stopek lub scalania wielu dokumentów, zapoznaj się z dokumentacją IronPDF.
Jak zapisać przesłane pliki PDF z powrotem w SQL Serverze?
Ukończenie cyklu wymaga punktu końcowego do przesyłania danych, który odczytuje przychodzące pliki formularzy i zapisuje je w bazie danych. W połączeniu z powyższymi punktami końcowymi pobierania tworzy to kompletny system zarządzania dokumentami:
[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 (Nazwa pliku, Zawartość pliku)
VALUES (@Nazwa pliku, @Zawartość pliku);
SELECT SCOPE_IDENTITY();";
await using var command = new SqlCommand(insertQuery, connection);
command.Parameters.AddWithValue("@Nazwa pliku", file.Nazwa pliku);
command.Parameters.AddWithValue("@Zawartość pliku", pdfDocument.BinaryData);
var newId = Convert.ToInt32(await command.ExecuteScalarAsync());
return Ok(new { id = newId, fileName = file.Nazwa pliku });
}
[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 (Nazwa pliku, Zawartość pliku)
VALUES (@Nazwa pliku, @Zawartość pliku);
SELECT SCOPE_IDENTITY();";
await using var command = new SqlCommand(insertQuery, connection);
command.Parameters.AddWithValue("@Nazwa pliku", file.Nazwa pliku);
command.Parameters.AddWithValue("@Zawartość pliku", pdfDocument.BinaryData);
var newId = Convert.ToInt32(await command.ExecuteScalarAsync());
return Ok(new { id = newId, fileName = file.Nazwa pliku });
}
Imports System
Imports System.IO
Imports System.Threading.Tasks
Imports Microsoft.AspNetCore.Mvc
Imports Microsoft.Data.SqlClient
<HttpPost("upload")>
Public Async Function UploadPdf(file As IFormFile) As Task(Of IActionResult)
If file Is Nothing OrElse file.Length = 0 Then
Return BadRequest("No file uploaded.")
End If
If Not file.ContentType.Equals("application/pdf", StringComparison.OrdinalIgnoreCase) Then
Return BadRequest("Only PDF files are accepted.")
End If
Using memoryStream As New MemoryStream()
Await file.CopyToAsync(memoryStream)
Dim pdfBytes As Byte() = memoryStream.ToArray()
' Validate using IronPDF before storage
Using pdfDocument As New PdfDocument(pdfBytes)
Await Using connection As New SqlConnection(_connectionString)
Await connection.OpenAsync()
Const insertQuery As String = "
INSERT INTO PdfDocuments (Nazwa pliku, Zawartość pliku)
VALUES (@Nazwa pliku, @Zawartość pliku);
SELECT SCOPE_IDENTITY();"
Await Using command As New SqlCommand(insertQuery, connection)
command.Parameters.AddWithValue("@Nazwa pliku", file.FileName)
command.Parameters.AddWithValue("@Zawartość pliku", pdfDocument.BinaryData)
Dim newId As Integer = Convert.ToInt32(Await command.ExecuteScalarAsync())
Return Ok(New With {.id = newId, .fileName = file.FileName})
End Using
End Using
End Using
End Using
End Function
Użycie PdfDocument do walidacji przed zapisaniem gwarantuje, że do bazy danych trafią wyłącznie pliki PDF, które można przetworzyć i które mają poprawny format. Jeśli tablica bajtów jest uszkodzona lub skrócona, IronPDF zgłasza wyjątek, który można przechwycić i zwrócić jako odpowiedź 400 Bad Request.
Jakie są kluczowe typy tabel i kolumn do przechowywania plików PDF?
Schemat, którego używasz, wpływa na wydajność zapytań i efektywność przechowywania danych. Poniższa tabela przedstawia zalecaną konfigurację kolumn dla SQL Server:
| Kolumna | Typ danych | Cel |
|---|---|---|
| Id | TOŻSAMOŚĆ | Klucz główny, auto-increment |
| Nazwa pliku | NVARCHAR(255) | Oryginalna nazwa pliku dla nagłówków pobierania |
| Zawartość pliku | VARBINARY(MAX) | Surowe dane binarne PDF (BLOB) |
| ContentType | NVARCHAR(100) | Typ MIME, np. application/pdf |
| Rozmiar pliku w bajtach | BIGINT | Rozmiar przechowywanych danych do zarządzania limitami |
| Wysłano | DATETIME2 | Sygnatura czasowa UTC do celów audytowych |
| Wysłane przez | NVARCHAR(100) | Tożsamość użytkownika do kontroli dostępu |
W przypadku systemów o dużej skali, w których wymagane jest strumieniowanie plików w SQL Server, firma Microsoft dokumentuje funkcję FILESTREAM jako alternatywę, która przechowuje duże obiekty BLOB w systemie plików, zachowując jednocześnie możliwość wyszukiwania za pomocą języka T-SQL. Jednak w przypadku większości aplikacji ASP.NET obsługujących dokumenty o rozmiarze do kilkuset megabajtów, VARBINARY(MAX) przechowywanie w wierszu działa dobrze i upraszcza wdrażanie.
Jak radzisz sobie z błędami i optymalizujesz wydajność?
Niezawodne pobieranie plików PDF w środowisku produkcyjnym wymaga obsługi błędów na każdym poziomie — bazy danych, IronPDF i odpowiedzi HTTP. Poniższa tabela zawiera podsumowanie kluczowych praktyk:
| Zastrzeżenie | Zalecenie | Powód |
|---|---|---|
| Utylizacja połączeń | await using statements |
Zapobiega wyczerpaniu puli połączeń |
| Utylizacja plików PDF | instrukcje using |
Szybko zwalnia pamięć niezarządzaną |
| Wstrzyknięcie kodu SQL | Tylko zapytania parametryzowane | Zapobiega zmianie zapytań przez złośliwe dane wejściowe |
| Weryfikacja typu pliku | Sprawdź typ MIME i bajty magiczne | Blokuje przesyłanie plików innych niż PDF przed zapisaniem |
| Obsługa dużych plików | Strumieniowa odpowiedź z FileStreamResult |
Unika ładowania całego pliku do pamięci serwera |
| Buforowanie | Użyj IMemoryCache lub IDistributedCache |
Ogranicza powtarzające się operacje z bazą danych |
| Operacje asynchroniczne | async/await w całym tekście |
Utrzymuje wątki wolne podczas oczekiwania na dysk i sieć |
W przypadku zarządzania ciągami połączeń należy zapisać wartość w appsettings.json i nigdy nie umieszczać jej na stałe w plikach źródłowych. Podczas lokalnego programowania korzystaj z wbudowanego systemu zarządzania sekretami w .NET Core, a w środowisku produkcyjnym z Azure Key Vault lub AWS Secrets Manager. Nigdy nie umieszczaj ciągów połączeń ani kluczy licencyjnych w systemie kontroli wersji.
Podczas obsługi dużych plików PDF warto rozważyć zwracanie FileStreamResult popartego MemoryStream zamiast ładowania całej tablicy bajtów do pamięci. W przypadku bardzo dużych dokumentów — powyżej 100 MB — interfejs API SQL Server FILESTREAM umożliwia strumieniowe przesyłanie fragmentów bezpośrednio z systemu plików.
Buforowanie często używanych dokumentów
Jeśli niektóre pliki PDF są pobierane wielokrotnie — na przykład dokument z warunkami użytkowania lub katalog produktów — buforowanie tablicy bajtów w IMemoryCache pozwala uniknąć wielokrotnych operacji odczytu z bazy danych. Zarejestruj IMemoryCache w Program.cs za pomocą builder.Services.AddMemoryCache(), a następnie wstaw go do kontrolera i sprawdź pamięć podręczną przed wysłaniem zapytania do bazy danych. Ustal absolutny termin ważności, który odpowiada przewidywanej częstotliwości aktualizacji dokumentów. Po aktualizacji dokumentu usuń wpis z pamięci podręcznej według klucza, aby następne żądanie pobrało nową wersję.
W przypadku scenariuszy rozproszonych — takich jak wdrożenie z równoważeniem obciążenia z wieloma instancjami serwerów — należy zastąpić IMemoryCache na IDistributedCache wspierane przez Redis lub SQL Server. Abstrakcje pamięci podręcznej rozproszonej w .NET Core sprawiają, że kod kontrolera pozostaje niemal identyczny; zmienia się tylko rejestracja w Program.cs.
Jak wdrożyć pobieranie plików PDF na wielu platformach za pomocą IronPDF?
IronPDF działa na systemach Linux, Windows i macOS bez konieczności oddzielnej instalacji Chromium lub jakichkolwiek zmian w konfiguracji. Ten sam pakiet NuGet jest przeznaczony dla wszystkich platform, więc kontroler PDF działa identycznie niezależnie od tego, czy wdrażasz go na:
- Windows Server z IIS
- Kontenery Ubuntu na Dockerze lub Kubernetesie
- Azure App Service (Linux lub Windows)
- AWS Elastic Beanstalk
Wdrażanie w Dockerze i systemie Linux
W przypadku wdrożeń Docker dodaj zależności IronPDF do pliku Dockerfile. Dokumentacja IronPDF dla systemu Linux zawiera dokładne pakiety apt wymagane dla obrazów bazowych Debian i Alpine. Typowy wieloetapowy plik Dockerfile instaluje zależności systemu operacyjnego na etapie obrazu środowiska uruchomieniowego, a następnie kopiuje na niego opublikowaną aplikację ASP.NET. W przypadku korzystania z platformy Azure przewodnik wdrażania Azure obejmuje konfigurację usługi App Service, w tym ustawienia pamięci i procesora, które obsługują renderowanie plików PDF na dużą skalę.
Ponieważ IronPDF zawiera własny silnik renderujący oparty na Chromium, nie ma potrzeby instalowania oddzielnej przeglądarki na serwerze. Znacznie upraszcza to konfigurację kontenerów w systemie Linux w porównaniu z rozwiązaniami wymagającymi przeglądarki na poziomie systemu. Zespół IronPDF testuje każde wydanie na najpopularniejszych obrazach bazowych systemu Linux, więc możesz mieć pewność, że kontener Alpine lub Debian będzie działał od razu po uruchomieniu.
Korzystanie z Entity Framework Core zamiast ADO.NET
IronPDF integruje się również z Entity Framework Core jako alternatywa dla surowego ADO.NET. Jeśli w projekcie jest już używany EF Core, można zmapować kolumnę Zawartość pliku do właściwości byte[] w klasie modelu i pozwolić EF zająć się generowaniem zapytania. Takie podejście znacznie ogranicza powtarzalność kodu i ułatwia dodawanie funkcji filtrowania, paginacji i audytu za pośrednictwem dostawcy LINQ w EF.
Kompromisem jest to, że EF Core ładuje cały obiekt BLOB do pamięci jako część grafu encji. W przypadku bardzo dużych plików PDF warto rozważyć użycie surowego ADO.NET lub metody FromSql w EF Core z projekcją, która wybiera tylko kolumnę tablicy bajtów zamiast pełnej encji.
Jakie są Twoje kolejne kroki?
Pobieranie plików PDF z bazy danych SQL Server w ASP.NET Core przy użyciu języka C# i biblioteki IronPDF przebiega według jasnego schematu: wysyłanie zapytania do kolumny BLOB za pomocą sparametryzowanego polecenia SELECT, ładowanie bajtów do zmiennej PdfDocument oraz zwracanie danych binarnych z prawidłowym nagłówkiem Content-Disposition. IronPDF umożliwia sprawdzanie poprawności, dodawanie znaków wodnych, scalanie lub zabezpieczanie dokumentów, zanim opuszczą one serwer.
Aby dowiedzieć się więcej o możliwościach zarządzania dokumentami w IronPDF, zapoznaj się z poniższymi zasobami:
- IronPDF Generowanie plików PDF z HTML — dynamiczne generowanie plików PDF i zapisywanie ich bezpośrednio w bazie danych
- IronPDF Merge and Split PDFs — łączenie pobranych dokumentów w jedną odpowiedź
- Bezpieczeństwo i uprawnienia IronPDF — dodaj ochronę hasłem przed udostępnieniem poufnych dokumentów
- Samouczek IronPDF HTML do PDF — konwersja treści stron internetowych do formatu PDF w celu archiwizacji
- IronPDF PDF Stamping — dodawanie stempli tekstowych i graficznych do pobranych plików
- Licencjonowanie IronPDF — zapoznaj się z poziomami licencji do użytku w fazie rozwoju, testów i produkcji
Zacznij od bezpłatnej licencji próbnej IronPDF, aby przetestować wszystkie funkcje bez ograniczeń. Wersja próbna generuje pliki z znakiem wodnym; usuń znak wodny, stosując płatny klucz licencyjny. Pełna dokumentacja API oraz przykłady kodu dla każdej metody użytej w tym artykule są dostępne na stronie internetowej IronPDF.
Jeśli w Twoim projekcie jest już używany Entity Framework Core, przewodnik integracji IronPDF EF Core pokazuje, jak zastąpić surowe ADO.NET modelami encji, zachowując ten sam potok przetwarzania IronPDF. Dla zespołów pracujących z .NET 10 i najnowszymi funkcjami ASP.NET Core te same wzorce opisane tutaj działają bez modyfikacji — IronPDF obsługuje każdą aktywną wersję .NET LTS i STS.
Zapoznaj się ze stroną z cennikiem IronPDF, aby znaleźć odpowiedni poziom licencji dla swojego wdrożenia. Pojedyncza licencja programisty obejmuje lokalne prace programistyczne i testowanie; Licencje na redystrybucję są dostępne dla produktów SaaS oraz wdrożeń lokalnych z wieloma serwerami.
Często Zadawane Pytania
Czym jest IronPDF?
IronPDF to biblioteka .NET, która pozwala programistom tworzyć, edytować i wyodrębniać zawartość z plików PDF w aplikacjach napisanych w języku C#.
Jak mogę pobrać plik PDF z bazy danych przy użyciu ASP.NET?
Aby pobrać plik PDF z bazy danych w ASP.NET, można użyć kodu C# do wysłania zapytania do bazy danych i wczytania danych PDF do tablicy bajtów. Ta tablica bajtów może być następnie wykorzystana w IronPDF do renderowania lub manipulowania plikiem PDF zgodnie z potrzebami.
Dlaczego warto używać IronPDF do obsługi plików PDF w aplikacji ASP.NET?
IronPDF oferuje szeroki zestaw funkcji do obsługi plików PDF, w tym generowanie plików PDF, konwersję z HTML oraz edycję. Integruje się z ASP.NET i zapewnia łatwy w użyciu interfejs API do pracy z plikami PDF.
Jakie są wymagania wstępne dotyczące korzystania z IronPDF w ASP.NET?
Aby korzystać z IronPDF w ASP.NET, należy skonfigurować środowisko programistyczne .NET, takie jak Visual Studio, oraz dołączyć bibliotekę IronPDF do projektu za pomocą menedżera pakietów NuGet.
Czy IronPDF może służyć do edycji istniejących plików PDF?
Tak, IronPDF może służyć do edycji istniejących plików PDF. Umożliwia wprowadzanie zmian, takich jak dodawanie tekstu lub obrazów, scalanie dokumentów i wiele innych.
Czy można konwertować HTML na PDF za pomocą IronPDF?
Tak, IronPDF może konwertować treści HTML bezpośrednio do formatu PDF, co ułatwia generowanie plików PDF ze stron internetowych lub innych treści HTML.
Jak obsługiwać funkcje zabezpieczeń plików PDF za pomocą IronPDF?
IronPDF obsługuje różne funkcje zabezpieczeń plików PDF, w tym ochronę hasłem oraz ustawianie uprawnień w celu kontrolowania dostępu do dokumentów i ich edycji.
Jakie typy baz danych są kompatybilne z IronPDF w zakresie pobierania plików PDF?
IronPDF może współpracować z dowolną bazą danych, która może przechowywać dane binarne, taką jak SQL Server, MySQL lub PostgreSQL, w celu pobierania i przetwarzania plików PDF.




