Jak programowo drukować pliki PDF w ASP.NET
Pobieranie pliku PDF z bazy danych w ASP.NET przy uzyciu C# wymaga trzech krokow: zapytania tabeli bazy danych o binarny kolumne BLOB, zaladowania bajtow do obiektu PdfDocument za pomoca IronPDF oraz zwrocenia bajtow do przegladarki poprzez odpowiedz 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
Po instalacji nalezy ustawic klucz licencyjny w Program.cs lub appsettings.json przed wywolaniem 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 bezplatna licencja próbna do oceny.
Jak skonfigurować tabelę bazy danych SQL Server?
Najczestsza metoda jest przechowywanie plikow 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 lancuch polaczenia 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 lancuch polaczenia poprzez wstrzykiwanie zaleznosci 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?
Schemat pobierania obejmuje trzy kroki: otworzenie polaczenia, wykonanie zparametryzowanego zapytania SELECT i odczyt binarnej kolumny do byte[]. IronPDF nastepnie zaladowuje te tablice do obiektu PdfDocument w celu opcjonalnego przetworzenia przed przeslaniem 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 uzywa zparametryzowanych zapytan aby zapobiec wstrzykiwaniu SQL oraz await using aby prawidlowo usuwac SqlConnection i SqlCommand. Klasa PdfDocument weryfikuje tablice bajtow i udostepnia wlasciwosc BinaryData do przesylania strumieniowego.
Zwracanie pliku o określonej nazwie do pobrania
Kiedy uzytkownicy chca zapisac dokument, a nie przegladac go w linii, ustaw naglowek Content-Disposition na attachment i przkazan oryginalna nazwe 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() ustawia naglowek Content-Disposition na attachment automatycznie. 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 HTML i CSS, dzieki czemu masz pelna kontrole nad czcionka, kolorem, przezroczystoscia i polozeniem. 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 scałania 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
Uzycie PdfDocument do walidacji przed przechowywaniem zapewnia, ze tylko parsowalne, poprawnie uksztaltowane pliki PDF trafiaja do bazy danych. Jesli tablica bajtow jest uszkodzona lub obcieta, IronPDF wyrzuca wyjatek, ktory mozesz zlapac i zwrocic jako odpowiedz 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 wiekszosci aplikacji ASP.NET, ktore obsluguja dokumenty o wielkosci do kilkuset megabajtow, VARBINARY(MAX) skrotowa metoda przechowywania w wierszu dziala dobrze i upraszcza wdrozenie.
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 instrukcje |
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ć |
Do zarzadzania lancuchem polaczenia nalezy przechowywac jego wartosc w appsettings.json i nigdy jej nie twardo kodowac w plikach zrodlowych. 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.
Przy obsludze duzych plikow PDF warto rozwazyc zwrocenie FileStreamResult z przyznanym MemoryStream zamiast ladowania calej tablicy bajtow do pamieci. 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
Jesli pewne pliki PDF sa czesto wymagane - na przyklad dokument z warunkami umowy lub katalog produktow - keszowanie tablicy bajtow w IMemoryCache unika powtarzanych zapytan do bazy danych. Zarejestruj IMemoryCache w Program.cs z builder.Services.AddMemoryCache(), nastepnie wstrzyknij go do kontrolera i sprawdz kesz przed zapytaniem 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 scenariuszach rozproszonych - takich jak wywazone obciazeniowo wdrazanie z kilkoma instancjami serwera - zastap IMemoryCache z IDistributedCache wspieranym przez Redis lub serwer SQL. Abstrakcje pamięci podręcznej rozproszonej w .NET Core sprawiają, że kod kontrolera pozostaje niemal identyczny; zmienia sie 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. Jesli projekt juz korzysta z EF Core, to kolumne Zawartość pliku mozna odwzorowac na wlasciwosc byte[] w klasie modelu i pozwolic EF zajmowac sie generowaniem zapytan. 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 duzych plikow PDF warto rozwazyc uzycie surowego ADO.NET lub metody FromSql EF Core z projekcja wybierajaca tylko kolumne tablicy bajtow zamiast calej jednostki.
Jakie są Twoje kolejne kroki?
Pobieranie plikow PDF z bazy danych SQL Server w ASP.NET Core za pomoca C# i IronPDF opiera sie na jasnym schemacie: zapytaj kolumne BLOB za pomoca zparametryzowanego SELECT, zaladuj bajty do PdfDocument i zwroc dane binarne z poprawnym naglowkiem Content-Disposition. IronPDF umożliwia sprawdzanie poprawności, dodawanie znaków wodnych, scałanie 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 artykułe 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, scałanie 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.

