Jak stworzyć .NET PDF API z użyciem IronPDF
Pracując z nowoczesnymi aplikacjami, programiści .NET, tacy jak Ty, mogą potrzebować zbudować scentralizowaną usługę generowania PDF. Niezależnie od tego, czy generujesz faktury, raporty, certyfikaty czy umowy, posiadanie dedykowanego API PDF .NET może być korzystne dla efektywnego zarządzania plikami PDF. Więc jak to może poprawić Twoje zadania związane z generowaniem PDF? Osiąga to poprzez zapewnienie spójności, łatwości utrzymania i skalowalności we wszystkich Twoich aplikacjach desktopowych i webowych. Nigdy wcześniej zarządzanie treścią dokumentu, stronami PDF i polami formularza PDF nie było łatwiejsze.
W tym samouczku nauczysz się, jak zbudować gotowe do produkcji API PDF korzystając z ASP.NET Core i IronPDF, potężnej biblioteki PDF .NET. Stworzymy RESTful punkty końcowe, które mogą generować PDF z HTML, scalać dokumenty, dodawać znaki wodne i obsługiwać różne scenariusze generowania PDF w rzeczywistych sytuacjach w Twoim Web API.
Dlaczego warto zbudować dedykowane API PDF?
Zanim zagłębimy się w kod, zastanówmy się, dlaczego tworzenie dedykowanego API PDF ma sens:
- Scentralizowana logika: Cała logika generowania PDF znajduje się w jednym miejscu, co ułatwia utrzymanie i aktualizacje
- Architektura mikroserwisów: Idealne dla architektur zorientowanych na usługi, gdzie różne aplikacje potrzebują możliwości tworzenia PDF
- Optymalizacja wydajności: Łatwiej skalować i optymalizować dedykowaną usługę dla dużych plików PDF, wielu stron i dynamicznych danych.
- Język obojętny: Każda aplikacja kliencka może korzystać z API niezależnie od języka programowania
- Spójne wyjście: Zapewnia, że wszystkie dokumenty PDF w Twojej organizacji będą miały spójny układ dokumentu, formatowanie akapitów i zawartość PDF.
Czy jesteś gotowy do rozpoczęcia budowy? Pobierz bezpłatną wersję próbną IronPDF i postępuj zgodnie z tym samouczkiem, aby programowo tworzyć pliki PDF w swoich projektach .NET Framework.
IronPDF: Kompletny zestaw narzędzi do PDF .NET
IronPDF wyróżnia się jako najlepsza biblioteka PDF dla programistów .NET, oferując kompleksowy zestaw funkcji, które czynią generowanie PDF w projektach Web API prostym i niezawodnym. Jest zbudowana na silniku renderującym Chrome, co zapewnia pixel-perfect konwersje HTML do PDF, często w kilku linijkach kodu. Robi to wszystko, zachowując stylizacje, wykonywanie JavaScript i responsywne układy.
Kluczowe możliwości, które czynią IronPDF idealnym wyborem dla rozwoju PDF API .NET:
- Renderowanie oparte na Chrome: Wykorzystuje silnik renderujący Google Chrome do precyzyjnej konwersji dokumentów PDF z treści HTML, z pełnym wsparciem dla osadzonych obrazów i innych zasobów internetowych
- Bogaty zestaw funkcji: Obsługuje edycję nowych i istniejących dokumentów z podpisami cyfrowymi, formularzami PDF, adnotacjami, szyfrowaniem, kompresją i innymi
- Tworzenie bezpiecznych dokumentów PDF: Zarządzaj wrażliwymi treściami PDF za pomocą szyfrowania, podpisów cyfrowych i ochrony dokumentów.
- Wielokrotne formaty wejściowe: Używaj HTML, URL, obrazów i dokumentów Office do tworzenia dokumentów PDF
- Zaawansowana manipulacja: Scalaj strony PDF, dziel dokumenty, dodawaj znaki wodne, twórz interaktywne formularze PDF i manipuluj plikami PDF programowo.
- Obsługa platform cross-platform: Działa na Windows, Linux, macOS, Docker i platformach chmurowych
- Optymalizacja wydajności: Operacje asynchroniczne, efektywne zarządzanie pamięcią i szybkie renderowanie
Jak skonfigurować projekt API dokumentów PDF?
Zacznijmy od stworzenia nowego projektu ASP.NET Core Web API i zainstalowania niezbędnych pakietów.
Wymagania wstępne
- .NET 6.0 SDK lub nowszy
- Visual Studio 2022 lub Visual Studio Code
- Postman lub podobne narzędzie do testowania API dla testowania Twojego PDF REST API
Tworzenie projektu
Najpierw utwórzmy projekt, w którym będziemy budować nasze narzędzie do generowania PDF.
dotnet new webapi -n PdfApiService
cd PdfApiService
Instalacja IronPDF
Kolejnym krokiem jest dodanie IronPDF do projektu za pomocą NuGet:
dotnet add package IronPdf
Lub, używając Konsoli Menedżera Pakietów NuGet w Visual Studio:
Install-Package IronPdf
Struktura projektu
Istotną częścią rozwoju w języku C# jest utrzymanie czystej i dobrze zorganizowanej struktury folderu projektu. Na przykład:
Jak stworzyć swoje pierwsze odniesienie PDF?
Zbudujmy prosty punkt końcowy, który konwertuje HTML na format PDF. Najpierw stwórzmy interfejs usługi i implementację:
Tworzenie Usługi PDF
Najpierw dodamy następujące rzeczy do naszego pliku IPdfService.cs:
public interface IPdfService
{
byte[] GeneratePdfFromHtml(string htmlContent);
byte[] GeneratePdfFromUrl(string url);
}
public interface IPdfService
{
byte[] GeneratePdfFromHtml(string htmlContent);
byte[] GeneratePdfFromUrl(string url);
}
Public Interface IPdfService
Function GeneratePdfFromHtml(htmlContent As String) As Byte()
Function GeneratePdfFromUrl(url As String) As Byte()
End Interface
W pliku PdfService.cs dodamy to:
using IronPdf;
public class PdfService : IPdfService
{
private readonly ChromePdfRenderer _renderer;
public PdfService()
{
_renderer = new ChromePdfRenderer();
// Configure rendering options for optimal PDF generation in .NET
_renderer.RenderingOptions.MarginTop = 20;
_renderer.RenderingOptions.MarginBottom = 20;
_renderer.RenderingOptions.PrintHtmlBackgrounds = true;
}
public byte[] GeneratePdfFromHtml(string htmlContent)
{
// Generate PDF from HTML using the .NET PDF API
var pdf = _renderer.RenderHtmlAsPdf(htmlContent);
return pdf.BinaryData;
}
public byte[] GeneratePdfFromUrl(string url)
{
// Convert URL to PDF in the REST API
var pdf = _renderer.RenderUrlAsPdf(url);
return pdf.BinaryData;
}
}
using IronPdf;
public class PdfService : IPdfService
{
private readonly ChromePdfRenderer _renderer;
public PdfService()
{
_renderer = new ChromePdfRenderer();
// Configure rendering options for optimal PDF generation in .NET
_renderer.RenderingOptions.MarginTop = 20;
_renderer.RenderingOptions.MarginBottom = 20;
_renderer.RenderingOptions.PrintHtmlBackgrounds = true;
}
public byte[] GeneratePdfFromHtml(string htmlContent)
{
// Generate PDF from HTML using the .NET PDF API
var pdf = _renderer.RenderHtmlAsPdf(htmlContent);
return pdf.BinaryData;
}
public byte[] GeneratePdfFromUrl(string url)
{
// Convert URL to PDF in the REST API
var pdf = _renderer.RenderUrlAsPdf(url);
return pdf.BinaryData;
}
}
Imports IronPdf
Public Class PdfService
Implements IPdfService
Private ReadOnly _renderer As ChromePdfRenderer
Public Sub New()
_renderer = New ChromePdfRenderer()
' Configure rendering options for optimal PDF generation in .NET
_renderer.RenderingOptions.MarginTop = 20
_renderer.RenderingOptions.MarginBottom = 20
_renderer.RenderingOptions.PrintHtmlBackgrounds = True
End Sub
Public Function GeneratePdfFromHtml(htmlContent As String) As Byte()
' Generate PDF from HTML using the .NET PDF API
Dim pdf = _renderer.RenderHtmlAsPdf(htmlContent)
Return pdf.BinaryData
End Function
Public Function GeneratePdfFromUrl(url As String) As Byte()
' Convert URL to PDF in the REST API
Dim pdf = _renderer.RenderUrlAsPdf(url)
Return pdf.BinaryData
End Function
End Class
PdfService obsługuje podstawowy proces konwersji HTML na PDF. Korzystając z ChromePdfRenderer IronPDF, ta klasa jest ustawiona z rozsądnymi domyślnymi ustawieniami, takimi jak marginesy stron i renderowanie tła, aby stworzyć dopracowany końcowy dokument.
Kiedy kontroler przekazuje surowy HTML, usługa wykorzystuje IronPDF do przetworzenia go na profesjonalnej jakości PDF i zwraca wynik jako dane bajtowe, gotowe do pobrania. Dodatkowo może obsługiwać całe strony internetowe, konwertując URL bezpośrednio na PDF.
Tworzenie kontrolera
Teraz czas stworzyć kontroler dla naszego API. To zapewni punkt końcowy API zdolny do generowania plików PDF z HTML. Następnie będzie możliwe pobranie i zapisanie dokumentów PDF na Twoim systemie do dalszego użytku lub udostępnienia.
// Controllers/PdfController.cs
using Microsoft.AspNetCore.Mvc;
[ApiController]
[Route("api/[controller]")]
public class PdfController : ControllerBase
{
private readonly IPdfService _pdfService;
public PdfController(IPdfService pdfService)
{
_pdfService = pdfService;
}
[HttpPost("html-to-pdf")]
public IActionResult ConvertHtmlToPdf([FromBody] HtmlRequest request)
{
try
{
var pdfBytes = _pdfService.GeneratePdfFromHtml(request.HtmlContent);
// Return as downloadable file
return File(pdfBytes, "application/pdf", "document.pdf");
}
catch (Exception ex)
{
return BadRequest($"Error generating PDF: {ex.Message}");
}
}
}
// Controllers/PdfController.cs
using Microsoft.AspNetCore.Mvc;
[ApiController]
[Route("api/[controller]")]
public class PdfController : ControllerBase
{
private readonly IPdfService _pdfService;
public PdfController(IPdfService pdfService)
{
_pdfService = pdfService;
}
[HttpPost("html-to-pdf")]
public IActionResult ConvertHtmlToPdf([FromBody] HtmlRequest request)
{
try
{
var pdfBytes = _pdfService.GeneratePdfFromHtml(request.HtmlContent);
// Return as downloadable file
return File(pdfBytes, "application/pdf", "document.pdf");
}
catch (Exception ex)
{
return BadRequest($"Error generating PDF: {ex.Message}");
}
}
}
Imports Microsoft.AspNetCore.Mvc
<ApiController>
<Route("api/[controller]")>
Public Class PdfController
Inherits ControllerBase
Private ReadOnly _pdfService As IPdfService
Public Sub New(pdfService As IPdfService)
_pdfService = pdfService
End Sub
<HttpPost("html-to-pdf")>
Public Function ConvertHtmlToPdf(<FromBody> request As HtmlRequest) As IActionResult
Try
Dim pdfBytes = _pdfService.GeneratePdfFromHtml(request.HtmlContent)
' Return as downloadable file
Return File(pdfBytes, "application/pdf", "document.pdf")
Catch ex As Exception
Return BadRequest($"Error generating PDF: {ex.Message}")
End Try
End Function
End Class
Następnie w pliku HtmlRequest.cs dodamy to:
// Models/HtmlRequest.cs
public class HtmlRequest
{
public string HtmlContent { get; set; }
public string FileName { get; set; } = "document.pdf";
}
// Models/HtmlRequest.cs
public class HtmlRequest
{
public string HtmlContent { get; set; }
public string FileName { get; set; } = "document.pdf";
}
' Models/HtmlRequest.vb
Public Class HtmlRequest
Public Property HtmlContent As String
Public Property FileName As String = "document.pdf"
End Class
W pierwszym pliku utworzyliśmy prosty punkt końcowy API, który zamienia HTML na plik PDF do pobrania. Gdy ktoś wyśle treść HTML na trasę api/pdf/html-to-pdf za pomocą prostego żądania POST, PdfController przekazuje zadanie konwersji na PDF do dedykowanej usługi.
Po stworzeniu PDF, kontroler przekazuje go z powrotem użytkownikowi jako gotowy plik do pobrania. Samo żądanie jest zorganizowane przy użyciu modelu HtmlRequest, który zawiera zarówno surowy HTML, jak i opcjonalną nazwę pliku dla końcowego dokumentu. Krótko mówiąc, to ustawienie ułatwia klientom wysłanie HTML i natychmiastowe otrzymanie wyrafinowanego PDF.
Rejestrowanie usług
Zaktualizuj swój Program.cs, aby zarejestrować usługę PDF:
var builder = WebApplication.CreateBuilder(args);
builder.Services.AddControllers();
builder.Services.AddEndpointsApiExplorer();
builder.Services.AddSwaggerGen();
// Register PDF service
builder.Services.AddSingleton<IPdfService, PdfService>();
var app = builder.Build();
if (app.Environment.IsDevelopment())
{
app.UseSwagger();
app.UseSwaggerUI();
}
app.UseHttpsRedirection();
app.MapControllers();
app.Run();
var builder = WebApplication.CreateBuilder(args);
builder.Services.AddControllers();
builder.Services.AddEndpointsApiExplorer();
builder.Services.AddSwaggerGen();
// Register PDF service
builder.Services.AddSingleton<IPdfService, PdfService>();
var app = builder.Build();
if (app.Environment.IsDevelopment())
{
app.UseSwagger();
app.UseSwaggerUI();
}
app.UseHttpsRedirection();
app.MapControllers();
app.Run();
Imports Microsoft.AspNetCore.Builder
Imports Microsoft.Extensions.DependencyInjection
Dim builder = WebApplication.CreateBuilder(args)
builder.Services.AddControllers()
builder.Services.AddEndpointsApiExplorer()
builder.Services.AddSwaggerGen()
' Register PDF service
builder.Services.AddSingleton(Of IPdfService, PdfService)()
Dim app = builder.Build()
If app.Environment.IsDevelopment() Then
app.UseSwagger()
app.UseSwaggerUI()
End If
app.UseHttpsRedirection()
app.MapControllers()
app.Run()
Jak obsłużyć różne typy odpowiedzi?
Twoje API powinno obsługiwać różne sposoby zwracania PDF w zależności od potrzeb klienta:
[HttpPost("generate")]
public IActionResult GeneratePdf([FromBody] PdfRequest request)
{
var pdfBytes = _pdfService.GeneratePdfFromHtml(request.HtmlContent);
switch (request.ResponseType?.ToLower())
{
case "base64":
return Ok(new
{
data = Convert.ToBase64String(pdfBytes),
filename = request.FileName
});
case "inline":
return File(pdfBytes, "application/pdf");
default: // download
return File(pdfBytes, "application/pdf", request.FileName);
}
}
[HttpPost("generate")]
public IActionResult GeneratePdf([FromBody] PdfRequest request)
{
var pdfBytes = _pdfService.GeneratePdfFromHtml(request.HtmlContent);
switch (request.ResponseType?.ToLower())
{
case "base64":
return Ok(new
{
data = Convert.ToBase64String(pdfBytes),
filename = request.FileName
});
case "inline":
return File(pdfBytes, "application/pdf");
default: // download
return File(pdfBytes, "application/pdf", request.FileName);
}
}
Imports Microsoft.AspNetCore.Mvc
<HttpPost("generate")>
Public Function GeneratePdf(<FromBody> request As PdfRequest) As IActionResult
Dim pdfBytes = _pdfService.GeneratePdfFromHtml(request.HtmlContent)
Select Case request.ResponseType?.ToLower()
Case "base64"
Return Ok(New With {
.data = Convert.ToBase64String(pdfBytes),
.filename = request.FileName
})
Case "inline"
Return File(pdfBytes, "application/pdf")
Case Else ' download
Return File(pdfBytes, "application/pdf", request.FileName)
End Select
End Function
Tutaj dodaliśmy bardziej elastyczny punkt końcowy generowania PDF do kontrolera. Zamiast zawsze zmuszać do pobrania pliku, metoda GeneratePdf pozwala klientowi wybrać, w jaki sposób chce, aby wynik był zwrócony. Ta opcja oferuje elastyczność, pozwalając na wyświetlanie PDF-ów w różnych formatach: jako plik do pobrania, bezpośrednio w przeglądarce lub zakodowany jako ciąg Base64 do łatwego użycia w API.
Żądanie jest zdefiniowane przez model PdfRequest, który buduje się na wcześniejszym HtmlRequest i dodaje opcję ResponseType. Krótko mówiąc, to daje użytkownikom większą kontrolę nad tym, jak odbierają swoje PDF-y, czyniąc API bardziej wszechstronnym i przyjaznym dla użytkownika.
Teraz, gdy uruchomimy nasz program, zobaczymy ten wynik na Swagger.

Jak zaimplementować powszechne operacje PDF?
Rozszerzmy naszą usługę o obsługę różnych scenariuszy generowania PDF:
Konwersja adresów URL do formatu PDF
[HttpPost("url-to-pdf")]
public async Task<IActionResult> ConvertUrlToPdf([FromBody] UrlRequest request)
{
try
{
var pdfBytes = await Task.Run(() =>
_pdfService.GeneratePdfFromUrl(request.Url));
return File(pdfBytes, "application/pdf",
$"{request.FileName ?? "website"}.pdf");
}
catch (Exception ex)
{
return BadRequest($"Failed to convert URL: {ex.Message}");
}
}
public class UrlRequest
{
public string Url { get; set; }
public string FileName { get; set; }
}
[HttpPost("url-to-pdf")]
public async Task<IActionResult> ConvertUrlToPdf([FromBody] UrlRequest request)
{
try
{
var pdfBytes = await Task.Run(() =>
_pdfService.GeneratePdfFromUrl(request.Url));
return File(pdfBytes, "application/pdf",
$"{request.FileName ?? "website"}.pdf");
}
catch (Exception ex)
{
return BadRequest($"Failed to convert URL: {ex.Message}");
}
}
public class UrlRequest
{
public string Url { get; set; }
public string FileName { get; set; }
}
Imports System.Threading.Tasks
Imports Microsoft.AspNetCore.Mvc
<HttpPost("url-to-pdf")>
Public Async Function ConvertUrlToPdf(<FromBody> request As UrlRequest) As Task(Of IActionResult)
Try
Dim pdfBytes = Await Task.Run(Function() _pdfService.GeneratePdfFromUrl(request.Url))
Return File(pdfBytes, "application/pdf", $"{If(request.FileName, "website")}.pdf")
Catch ex As Exception
Return BadRequest($"Failed to convert URL: {ex.Message}")
End Try
End Function
Public Class UrlRequest
Public Property Url As String
Public Property FileName As String
End Class
Ten punkt końcowy pozwala klientom wysłać URL i otrzymać gotowy do pobrania PDF z tej strony internetowej. Gdy przyjdzie żądanie POST /api/pdf/url-to-pdf, kontroler używa _pdfService do konwersji podanego URL do bajtów PDF w tle, a następnie zwraca je jako plik do pobrania. Jeśli coś pójdzie nie tak podczas konwersji, reaguje w sposób zrozumiały, z wyraźną wiadomością o błędzie.
Spróbujmy użyć URL "https://www.apple.com/nz" i przetestować żądanie POST. Poniżej znajduje się uzyskany wynik.
Wynik

Dodawanie niestandardowych znaków wodnych
public byte[] AddWatermarkFromFile(string filePath, string watermarkText)
{
// Load PDF directly from file
var pdf = PdfDocument.FromFile(filePath);
pdf.ApplyWatermark(
$"<h1 style='color:red;font-size:72px;'>{watermarkText}</h1>",
75,
IronPdf.Editing.VerticalAlignment.Middle,
IronPdf.Editing.HorizontalAlignment.Center
);
return pdf.BinaryData;
}
public byte[] AddWatermarkFromFile(string filePath, string watermarkText)
{
// Load PDF directly from file
var pdf = PdfDocument.FromFile(filePath);
pdf.ApplyWatermark(
$"<h1 style='color:red;font-size:72px;'>{watermarkText}</h1>",
75,
IronPdf.Editing.VerticalAlignment.Middle,
IronPdf.Editing.HorizontalAlignment.Center
);
return pdf.BinaryData;
}
Imports IronPdf
Public Function AddWatermarkFromFile(filePath As String, watermarkText As String) As Byte()
' Load PDF directly from file
Dim pdf = PdfDocument.FromFile(filePath)
pdf.ApplyWatermark(
$"<h1 style='color:red;font-size:72px;'>{watermarkText}</h1>",
75,
IronPdf.Editing.VerticalAlignment.Middle,
IronPdf.Editing.HorizontalAlignment.Center
)
Return pdf.BinaryData
End Function
Tutaj po prostu ręcznie ładujemy lokalny plik do celów testowych. Jednak możesz dostosować to tak, aby Twoje API PDF generowało dokument PDF, a następnie z łatwością zastosować do niego niestandardowy znak wodny.
Wyjście znaku wodnego

Jak dodać dynamiczne dane za pomocą szablonów
W przypadku aplikacji rzeczywistego świata, często będziesz musiał generować PDF-y ze szablonów z dynamicznymi danymi:
[HttpPost("from-template")]
public IActionResult GenerateFromTemplate([FromBody] TemplateRequest request)
{
// Simple template replacement
var html = request.Template;
foreach (var item in request.Data)
{
html = html.Replace($"{{{{{item.Key}}}}}", item.Value);
}
var pdfBytes = _pdfService.GeneratePdfFromHtml(html);
return File(pdfBytes, "application/pdf", request.FileName);
}
public class TemplateRequest
{
public string Template { get; set; }
public Dictionary<string, string> Data { get; set; }
public string FileName { get; set; } = "document.pdf";
}
[HttpPost("from-template")]
public IActionResult GenerateFromTemplate([FromBody] TemplateRequest request)
{
// Simple template replacement
var html = request.Template;
foreach (var item in request.Data)
{
html = html.Replace($"{{{{{item.Key}}}}}", item.Value);
}
var pdfBytes = _pdfService.GeneratePdfFromHtml(html);
return File(pdfBytes, "application/pdf", request.FileName);
}
public class TemplateRequest
{
public string Template { get; set; }
public Dictionary<string, string> Data { get; set; }
public string FileName { get; set; } = "document.pdf";
}
Imports Microsoft.AspNetCore.Mvc
<HttpPost("from-template")>
Public Function GenerateFromTemplate(<FromBody> request As TemplateRequest) As IActionResult
' Simple template replacement
Dim html As String = request.Template
For Each item In request.Data
html = html.Replace($"{{{{{item.Key}}}}}", item.Value)
Next
Dim pdfBytes As Byte() = _pdfService.GeneratePdfFromHtml(html)
Return File(pdfBytes, "application/pdf", request.FileName)
End Function
Public Class TemplateRequest
Public Property Template As String
Public Property Data As Dictionary(Of String, String)
Public Property FileName As String = "document.pdf"
End Class
Więcej zaawansowanych scenariuszy szablonów z Razor, Handlebars lub innymi silnikami znajdziesz w dokumentacji IronPDF HTML do PDF. Możesz również zbadać konwersję CSHTML do PDF dla aplikacji MVC i Razor do PDF dla aplikacji Blazor.
Jak zoptymalizować wydajność?
Podczas tworzenia API PDF do produkcji, wydajność jest kluczowa. Oto kluczowe strategie optymalizacji:
Operacje asynchroniczne
Podczas tworzenia projektów wykorzystujących operacje I/O, warto używać kodowania asynchronicznego. Jest to wyjątkowo pomocne, jeśli Twoje treści PDF pochodzą z zewnętrznych źródeł, takich jak:
Pobieranie stron HTML (RenderUrlAsPdf)⟩
Pobieranie obrazów, CSS lub fontów przez HTTP⟩
Odczyt/zapis plików na dysk lub do chmurowej przechowalni⟩
Te operacje mogą wtedy blokować wątek, jednak użycie async zapobiega czekaniu Twojego wątku API w bezczynności.
Przykład:
public async Task<byte[]> GeneratePdfFromHtmlAsync(string htmlContent)
{
return await Task.Run(() =>
{
var pdf = _renderer.RenderHtmlAsPdf(htmlContent);
return pdf.BinaryData;
});
}
public async Task<byte[]> GeneratePdfFromHtmlAsync(string htmlContent)
{
return await Task.Run(() =>
{
var pdf = _renderer.RenderHtmlAsPdf(htmlContent);
return pdf.BinaryData;
});
}
Imports System.Threading.Tasks
Public Async Function GeneratePdfFromHtmlAsync(htmlContent As String) As Task(Of Byte())
Return Await Task.Run(Function()
Dim pdf = _renderer.RenderHtmlAsPdf(htmlContent)
Return pdf.BinaryData
End Function)
End Function
Opcje renderowania
Skonfiguruj IronPDF dla optymalnej wydajności:
_renderer.RenderingOptions.EnableJavaScript = false; // If JS not needed
_renderer.RenderingOptions.CssMediaType = PdfCssMediaType.Print;
_renderer.RenderingOptions.RenderDelay = 0; // Remove if no JS
_renderer.RenderingOptions.Timeout = 30; // Set reasonable timeout
_renderer.RenderingOptions.EnableJavaScript = false; // If JS not needed
_renderer.RenderingOptions.CssMediaType = PdfCssMediaType.Print;
_renderer.RenderingOptions.RenderDelay = 0; // Remove if no JS
_renderer.RenderingOptions.Timeout = 30; // Set reasonable timeout
Jak zabezpieczyć swoje API PDF?
Bezpieczeństwo jest kluczowe dla każdego API produkcyjnego. Oto proste podejście do uwierzytelniania za pomocą klucza API:
// Middleware/ApiKeyMiddleware.cs
public class ApiKeyMiddleware
{
private readonly RequestDelegate _next;
private const string ApiKeyHeader = "X-API-Key";
public ApiKeyMiddleware(RequestDelegate next)
{
_next = next;
}
public async Task InvokeAsync(HttpContext context)
{
if (!context.Request.Headers.TryGetValue(ApiKeyHeader, out var apiKey))
{
context.Response.StatusCode = 401;
await context.Response.WriteAsync("API Key required");
return;
}
// Validate API key (in production, check against database)
var validApiKey = context.RequestServices
.GetRequiredService<IConfiguration>()["ApiKey"];
if (apiKey != validApiKey)
{
context.Response.StatusCode = 403;
await context.Response.WriteAsync("Invalid API Key");
return;
}
await _next(context);
}
}
// In Program.cs
app.UseMiddleware<ApiKeyMiddleware>();
// Middleware/ApiKeyMiddleware.cs
public class ApiKeyMiddleware
{
private readonly RequestDelegate _next;
private const string ApiKeyHeader = "X-API-Key";
public ApiKeyMiddleware(RequestDelegate next)
{
_next = next;
}
public async Task InvokeAsync(HttpContext context)
{
if (!context.Request.Headers.TryGetValue(ApiKeyHeader, out var apiKey))
{
context.Response.StatusCode = 401;
await context.Response.WriteAsync("API Key required");
return;
}
// Validate API key (in production, check against database)
var validApiKey = context.RequestServices
.GetRequiredService<IConfiguration>()["ApiKey"];
if (apiKey != validApiKey)
{
context.Response.StatusCode = 403;
await context.Response.WriteAsync("Invalid API Key");
return;
}
await _next(context);
}
}
// In Program.cs
app.UseMiddleware<ApiKeyMiddleware>();
Imports Microsoft.AspNetCore.Http
Imports Microsoft.Extensions.Configuration
Imports System.Threading.Tasks
' Middleware/ApiKeyMiddleware.vb
Public Class ApiKeyMiddleware
Private ReadOnly _next As RequestDelegate
Private Const ApiKeyHeader As String = "X-API-Key"
Public Sub New(next As RequestDelegate)
_next = next
End Sub
Public Async Function InvokeAsync(context As HttpContext) As Task
Dim apiKey As String = Nothing
If Not context.Request.Headers.TryGetValue(ApiKeyHeader, apiKey) Then
context.Response.StatusCode = 401
Await context.Response.WriteAsync("API Key required")
Return
End If
' Validate API key (in production, check against database)
Dim validApiKey As String = context.RequestServices.GetRequiredService(Of IConfiguration)()("ApiKey")
If apiKey <> validApiKey Then
context.Response.StatusCode = 403
Await context.Response.WriteAsync("Invalid API Key")
Return
End If
Await _next(context)
End Function
End Class
' In Program.vb
app.UseMiddleware(Of ApiKeyMiddleware)()
Dla bardziej zaawansowanych scenariuszy uwierzytelniania, rozważ:
- Uwierzytelnianie JWT - Standard branżowy dla uwierzytelniania API
- OAuth 2.0 - Dla integracji zewnętrznych
- Integracja z Azure AD - Uwierzytelnianie korporacyjne
- Ograniczenie szybkości API - Zapobiegaj nadużyciom i zapewniaj uczciwe użycie
Przykład rzeczywistego zastosowania: API generowania faktur
Zbudujmy praktyczne odniesienie generowania faktur, które pokazuje pełną implementację. Przykład ten pokazuje, jak produkcyjne API PDF .NET może generować profesjonalne faktury z dynamicznymi danymi.
!{--01001100010010010100001001010010010000010101001001011001010111110100011101000101010101000101111101010011010101000100000101010010010101000100010101000100010111110101011101001001010100010010000101111101010000010100100100111101000100010101010100001101010100010111110101010001010010010010010100000101001100010111110100001001001100010011110100001101001011--}
Najpierw stworzymy nowy plik w folderze Models. W moim przypadku nazwałem go Invoice.cs. Następnie dodaj następujący kod do nowego pliku.
public class Invoice
{
public string InvoiceNumber { get; set; }
public DateTime Date { get; set; }
public string CustomerName { get; set; }
public string CustomerAddress { get; set; }
public List<InvoiceItem> Items { get; set; }
public decimal Tax { get; set; }
}
public class InvoiceItem
{
public string Description { get; set; }
public int Quantity { get; set; }
public decimal UnitPrice { get; set; }
public decimal Total => Quantity * UnitPrice;
}
public class Invoice
{
public string InvoiceNumber { get; set; }
public DateTime Date { get; set; }
public string CustomerName { get; set; }
public string CustomerAddress { get; set; }
public List<InvoiceItem> Items { get; set; }
public decimal Tax { get; set; }
}
public class InvoiceItem
{
public string Description { get; set; }
public int Quantity { get; set; }
public decimal UnitPrice { get; set; }
public decimal Total => Quantity * UnitPrice;
}
Public Class Invoice
Public Property InvoiceNumber As String
Public Property [Date] As DateTime
Public Property CustomerName As String
Public Property CustomerAddress As String
Public Property Items As List(Of InvoiceItem)
Public Property Tax As Decimal
End Class
Public Class InvoiceItem
Public Property Description As String
Public Property Quantity As Integer
Public Property UnitPrice As Decimal
Public ReadOnly Property Total As Decimal
Get
Return Quantity * UnitPrice
End Get
End Property
End Class
Potem, będziemy musieli stworzyć nowy plik usługi dla naszego generatora faktur. W folderze Services dodaj poniższy kod. Dla mnie stworzyłem nowy plik o nazwie InvoiceService.cs. Ten kod obsłuży stylizację i układ naszego pliku PDF faktury.
public class InvoiceService
{
private readonly ChromePdfRenderer _renderer;
public InvoiceService()
{
_renderer = new ChromePdfRenderer();
_renderer.RenderingOptions.MarginTop = 10;
_renderer.RenderingOptions.MarginBottom = 10;
_renderer.RenderingOptions.PrintHtmlBackgrounds = true;
}
public byte[] GenerateInvoice(Invoice invoice)
{
var html = BuildInvoiceHtml(invoice);
// Add footer with page numbers
_renderer.RenderingOptions.HtmlFooter = new HtmlHeaderFooter
{
MaxHeight = 15,
HtmlFragment = "<center><i>{page} of {total-pages}</i></center>",
DrawDividerLine = true
};
var pdf = _renderer.RenderHtmlAsPdf(html);
return pdf.BinaryData;
}
private string BuildInvoiceHtml(Invoice invoice)
{
var subtotal = invoice.Items.Sum(i => i.Total);
var taxAmount = subtotal * (invoice.Tax / 100);
var total = subtotal + taxAmount;
var itemsHtml = string.Join("", invoice.Items.Select(item =>
$@"<tr>
<td>{item.Description}</td>
<td class='text-center'>{item.Quantity}</td>
<td class='text-right'>${item.UnitPrice:F2}</td>
<td class='text-right'>${item.Total:F2}</td>
</tr>"));
return $@"
<!DOCTYPE html>
<html>
<head>
<style>
body {{ font-family: Arial, sans-serif; }}
.invoice-header {{
background-color: #f8f9fa;
padding: 20px;
margin-bottom: 20px;
}}
table {{
width: 100%;
border-collapse: collapse;
}}
th, td {{
padding: 10px;
border-bottom: 1px solid #ddd;
}}
th {{
background-color: #007bff;
color: white;
}}
.text-right {{ text-align: right; }}
.text-center {{ text-align: center; }}
.total-section {{
margin-top: 20px;
text-align: right;
}}
</style>
</head>
<body>
<div class='invoice-header'>
<h1>Invoice #{invoice.InvoiceNumber}</h1>
<p>Date: {invoice.Date:yyyy-MM-dd}</p>
</div>
<div>
<h3>Bill To:</h3>
<p>{invoice.CustomerName}<br/>{invoice.CustomerAddress}</p>
</div>
<table>
<thead>
<tr>
<th>Description</th>
<th>Quantity</th>
<th>Unit Price</th>
<th>Total</th>
</tr>
</thead>
<tbody>
{itemsHtml}
</tbody>
</table>
<div class='total-section'>
<p>Subtotal: ${subtotal:F2}</p>
<p>Tax ({invoice.Tax}%): ${taxAmount:F2}</p>
<h3>Total: ${total:F2}</h3>
</div>
</body>
</html>";
}
}
public class InvoiceService
{
private readonly ChromePdfRenderer _renderer;
public InvoiceService()
{
_renderer = new ChromePdfRenderer();
_renderer.RenderingOptions.MarginTop = 10;
_renderer.RenderingOptions.MarginBottom = 10;
_renderer.RenderingOptions.PrintHtmlBackgrounds = true;
}
public byte[] GenerateInvoice(Invoice invoice)
{
var html = BuildInvoiceHtml(invoice);
// Add footer with page numbers
_renderer.RenderingOptions.HtmlFooter = new HtmlHeaderFooter
{
MaxHeight = 15,
HtmlFragment = "<center><i>{page} of {total-pages}</i></center>",
DrawDividerLine = true
};
var pdf = _renderer.RenderHtmlAsPdf(html);
return pdf.BinaryData;
}
private string BuildInvoiceHtml(Invoice invoice)
{
var subtotal = invoice.Items.Sum(i => i.Total);
var taxAmount = subtotal * (invoice.Tax / 100);
var total = subtotal + taxAmount;
var itemsHtml = string.Join("", invoice.Items.Select(item =>
$@"<tr>
<td>{item.Description}</td>
<td class='text-center'>{item.Quantity}</td>
<td class='text-right'>${item.UnitPrice:F2}</td>
<td class='text-right'>${item.Total:F2}</td>
</tr>"));
return $@"
<!DOCTYPE html>
<html>
<head>
<style>
body {{ font-family: Arial, sans-serif; }}
.invoice-header {{
background-color: #f8f9fa;
padding: 20px;
margin-bottom: 20px;
}}
table {{
width: 100%;
border-collapse: collapse;
}}
th, td {{
padding: 10px;
border-bottom: 1px solid #ddd;
}}
th {{
background-color: #007bff;
color: white;
}}
.text-right {{ text-align: right; }}
.text-center {{ text-align: center; }}
.total-section {{
margin-top: 20px;
text-align: right;
}}
</style>
</head>
<body>
<div class='invoice-header'>
<h1>Invoice #{invoice.InvoiceNumber}</h1>
<p>Date: {invoice.Date:yyyy-MM-dd}</p>
</div>
<div>
<h3>Bill To:</h3>
<p>{invoice.CustomerName}<br/>{invoice.CustomerAddress}</p>
</div>
<table>
<thead>
<tr>
<th>Description</th>
<th>Quantity</th>
<th>Unit Price</th>
<th>Total</th>
</tr>
</thead>
<tbody>
{itemsHtml}
</tbody>
</table>
<div class='total-section'>
<p>Subtotal: ${subtotal:F2}</p>
<p>Tax ({invoice.Tax}%): ${taxAmount:F2}</p>
<h3>Total: ${total:F2}</h3>
</div>
</body>
</html>";
}
}
Imports System
Imports System.Linq
Public Class InvoiceService
Private ReadOnly _renderer As ChromePdfRenderer
Public Sub New()
_renderer = New ChromePdfRenderer()
_renderer.RenderingOptions.MarginTop = 10
_renderer.RenderingOptions.MarginBottom = 10
_renderer.RenderingOptions.PrintHtmlBackgrounds = True
End Sub
Public Function GenerateInvoice(invoice As Invoice) As Byte()
Dim html = BuildInvoiceHtml(invoice)
' Add footer with page numbers
_renderer.RenderingOptions.HtmlFooter = New HtmlHeaderFooter With {
.MaxHeight = 15,
.HtmlFragment = "<center><i>{page} of {total-pages}</i></center>",
.DrawDividerLine = True
}
Dim pdf = _renderer.RenderHtmlAsPdf(html)
Return pdf.BinaryData
End Function
Private Function BuildInvoiceHtml(invoice As Invoice) As String
Dim subtotal = invoice.Items.Sum(Function(i) i.Total)
Dim taxAmount = subtotal * (invoice.Tax / 100)
Dim total = subtotal + taxAmount
Dim itemsHtml = String.Join("", invoice.Items.Select(Function(item)
$"<tr>
<td>{item.Description}</td>
<td class='text-center'>{item.Quantity}</td>
<td class='text-right'>${item.UnitPrice:F2}</td>
<td class='text-right'>${item.Total:F2}</td>
</tr>"))
Return $"
<!DOCTYPE html>
<html>
<head>
<style>
body {{ font-family: Arial, sans-serif; }}
.invoice-header {{
background-color: #f8f9fa;
padding: 20px;
margin-bottom: 20px;
}}
table {{
width: 100%;
border-collapse: collapse;
}}
th, td {{
padding: 10px;
border-bottom: 1px solid #ddd;
}}
th {{
background-color: #007bff;
color: white;
}}
.text-right {{ text-align: right; }}
.text-center {{ text-align: center; }}
.total-section {{
margin-top: 20px;
text-align: right;
}}
</style>
</head>
<body>
<div class='invoice-header'>
<h1>Invoice #{invoice.InvoiceNumber}</h1>
<p>Date: {invoice.Date:yyyy-MM-dd}</p>
</div>
<div>
<h3>Bill To:</h3>
<p>{invoice.CustomerName}<br/>{invoice.CustomerAddress}</p>
</div>
<table>
<thead>
<tr>
<th>Description</th>
<th>Quantity</th>
<th>Unit Price</th>
<th>Total</th>
</tr>
</thead>
<tbody>
{itemsHtml}
</tbody>
</table>
<div class='total-section'>
<p>Subtotal: ${subtotal:F2}</p>
<p>Tax ({invoice.Tax}%): ${taxAmount:F2}</p>
<h3>Total: ${total:F2}</h3>
</div>
</body>
</html>"
End Function
End Class
Ostatecznie, będziesz musiał stworzyć nowy kontroler, aby uzyskać dostęp i stworzyć nową fakturę za pomocą API.
[ApiController]
[Route("api/[controller]")]
public class InvoiceController : ControllerBase
{
private readonly InvoiceService _invoiceService;
public InvoiceController(InvoiceService invoiceService)
{
_invoiceService = invoiceService;
}
[HttpPost("generate")]
public IActionResult GenerateInvoice([FromBody] Invoice invoice)
{
try
{
var pdfBytes = _invoiceService.GenerateInvoice(invoice);
var fileName = $"Invoice_{invoice.InvoiceNumber}.pdf";
return File(pdfBytes, "application/pdf", fileName);
}
catch (Exception ex)
{
return StatusCode(500, $"Error generating invoice: {ex.Message}");
}
}
}
[ApiController]
[Route("api/[controller]")]
public class InvoiceController : ControllerBase
{
private readonly InvoiceService _invoiceService;
public InvoiceController(InvoiceService invoiceService)
{
_invoiceService = invoiceService;
}
[HttpPost("generate")]
public IActionResult GenerateInvoice([FromBody] Invoice invoice)
{
try
{
var pdfBytes = _invoiceService.GenerateInvoice(invoice);
var fileName = $"Invoice_{invoice.InvoiceNumber}.pdf";
return File(pdfBytes, "application/pdf", fileName);
}
catch (Exception ex)
{
return StatusCode(500, $"Error generating invoice: {ex.Message}");
}
}
}
Imports Microsoft.AspNetCore.Mvc
<ApiController>
<Route("api/[controller]")>
Public Class InvoiceController
Inherits ControllerBase
Private ReadOnly _invoiceService As InvoiceService
Public Sub New(invoiceService As InvoiceService)
_invoiceService = invoiceService
End Sub
<HttpPost("generate")>
Public Function GenerateInvoice(<FromBody> invoice As Invoice) As IActionResult
Try
Dim pdfBytes = _invoiceService.GenerateInvoice(invoice)
Dim fileName = $"Invoice_{invoice.InvoiceNumber}.pdf"
Return File(pdfBytes, "application/pdf", fileName)
Catch ex As Exception
Return StatusCode(500, $"Error generating invoice: {ex.Message}")
End Try
End Function
End Class
Wynik faktury

Uwagi dotyczące wdrożenia w kontenerze
Chociaż ten samouczek koncentruje się na lokalnym rozwoju, oto krótki przegląd konteneryzacji Twojego API PDF:
Podstawowy plik Docker
FROM mcr.microsoft.com/dotnet/aspnet:6.0 AS base
WORKDIR /app
EXPOSE 80
FROM mcr.microsoft.com/dotnet/sdk:6.0 AS build
WORKDIR /src
COPY ["PdfApiService.csproj", "."]
RUN dotnet restore
COPY . .
RUN dotnet build -c Release -o /app/build
FROM build AS publish
RUN dotnet publish -c Release -o /app/publish
FROM base AS final
WORKDIR /app
COPY --from=publish /app/publish .
# IronPDF requires additional dependencies on Linux
RUN apt-get update && apt-get install -y \
libgdiplus \
libc6-dev \
libx11-dev \
&& rm -rf /var/lib/apt/lists/*
ENTRYPOINT ["dotnet", "PdfApiService.dll"]
FROM mcr.microsoft.com/dotnet/aspnet:6.0 AS base
WORKDIR /app
EXPOSE 80
FROM mcr.microsoft.com/dotnet/sdk:6.0 AS build
WORKDIR /src
COPY ["PdfApiService.csproj", "."]
RUN dotnet restore
COPY . .
RUN dotnet build -c Release -o /app/build
FROM build AS publish
RUN dotnet publish -c Release -o /app/publish
FROM base AS final
WORKDIR /app
COPY --from=publish /app/publish .
# IronPDF requires additional dependencies on Linux
RUN apt-get update && apt-get install -y \
libgdiplus \
libc6-dev \
libx11-dev \
&& rm -rf /var/lib/apt/lists/*
ENTRYPOINT ["dotnet", "PdfApiService.dll"]
The provided code is a Dockerfile written for building and running a .NET application, not C# code. Dockerfiles are not converted to VB.NET as they are not programming language code but configuration scripts for Docker. If you have C# code that needs conversion to VB.NET, please provide that code instead.
Dla szczegółowych przewodników wdrożeniowych Twojego API PDF .NET, zobacz:
- Dokumentacja Docker IronPDF - Kompletny przewodnik po konteneryzacji
- Wdrożenie IronPDF na Azure - Azure Functions i App Service
- Wdrożenie IronPDF na AWS - Wdrożenie Lambda i EC2
- Konfiguracja IronPDF na Linux - Konfiguracja specyficzna dla Linux
Najlepsze praktyki obsługi błędów
Aby uzyskać bardziej odporny program, najlepszą praktyką jest implementacja globalnego obsługi błędów dla spójnych odpowiedzi błędów, jak poniżej:
// Middleware/ErrorHandlingMiddleware.cs
public class ErrorHandlingMiddleware
{
private readonly RequestDelegate _next;
public ErrorHandlingMiddleware(RequestDelegate next)
{
_next = next;
}
public async Task InvokeAsync(HttpContext context)
{
try
{
await _next(context);
}
catch (Exception ex)
{
await HandleExceptionAsync(context, ex);
}
}
private static async Task HandleExceptionAsync(HttpContext context, Exception ex)
{
context.Response.ContentType = "application/json";
context.Response.StatusCode = 500;
var response = new
{
error = "An error occurred processing your request",
message = ex.Message
};
await context.Response.WriteAsync(JsonSerializer.Serialize(response));
}
}
// Middleware/ErrorHandlingMiddleware.cs
public class ErrorHandlingMiddleware
{
private readonly RequestDelegate _next;
public ErrorHandlingMiddleware(RequestDelegate next)
{
_next = next;
}
public async Task InvokeAsync(HttpContext context)
{
try
{
await _next(context);
}
catch (Exception ex)
{
await HandleExceptionAsync(context, ex);
}
}
private static async Task HandleExceptionAsync(HttpContext context, Exception ex)
{
context.Response.ContentType = "application/json";
context.Response.StatusCode = 500;
var response = new
{
error = "An error occurred processing your request",
message = ex.Message
};
await context.Response.WriteAsync(JsonSerializer.Serialize(response));
}
}
Imports System.Text.Json
Imports Microsoft.AspNetCore.Http
Imports System.Threading.Tasks
Public Class ErrorHandlingMiddleware
Private ReadOnly _next As RequestDelegate
Public Sub New(next As RequestDelegate)
_next = next
End Sub
Public Async Function InvokeAsync(context As HttpContext) As Task
Try
Await _next(context)
Catch ex As Exception
Await HandleExceptionAsync(context, ex)
End Try
End Function
Private Shared Async Function HandleExceptionAsync(context As HttpContext, ex As Exception) As Task
context.Response.ContentType = "application/json"
context.Response.StatusCode = 500
Dim response = New With {
.error = "An error occurred processing your request",
.message = ex.Message
}
Await context.Response.WriteAsync(JsonSerializer.Serialize(response))
End Function
End Class
Dla konkretnych scenariuszy rozwiązywania problemów z IronPDF, zapoznaj się z przewodnikiem rozwiązywania problemów z IronPDF.
Wnioski
Teraz zbudowałeś solidne .NET PDF API przy użyciu ASP.NET Core i IronPDF, które może obsługiwać różne scenariusze generowania dokumentów. To REST API zapewnia solidną podstawę do scentralizowanych operacji PDF w Twoich aplikacjach.
Najważniejsze wnioski:
- IronPDF sprawia, że generowanie PDF jest proste w projektach Web API dzięki renderowaniu opartemu na Chrome
- Możesz łatwo dostosować swoje Web API, aby edytować istniejące dokumenty PDF za pomocą zaawansowanych narzędzi edycyjnych IronPDF
- Zasady projektowania RESTful zapewniają, że Twoje API PDF jest intuicyjne i łatwe do utrzymania
- Prawidłowe podejście do obsługi błędów i zabezpieczeń jest niezbędne do produkcji
- Optymalizacja wydajności poprzez operacje asynchroniczne i buforowanie poprawia skalowalność
- Będziesz miał wsparcie dla aplikacji desktopowych i webowych z skalowalnymi rozwiązaniami dokumentowymi
IronPDF pozwala programistom tworzyć dokumenty PDF, zapisywać pliki PDF i efektywnie konwertować HTML, czyniąc to niezbędne API do dokumentów PDF dla nowoczesnych aplikacji .NET Framework.
Kolejne kroki
Gotowy do wdrożenia IronPDF w swoim produkcyjnym .NET PDF API? Oto Twoje następne kroki:
- Rozpocznij swoją bezpłatną wersję próbną - Przetestuj IronPDF z pełną funkcjonalnością w swoim środowisku deweloperskim
- Odkryj zaawansowane funkcje - Sprawdź podpisy cyfrowe, formy PDF i inne zaawansowane funkcje PDF
- Skaluj z pewnością - Przegląd opcji licencjonowania dla potrzeb Twojego API produkcyjnego
Zbuduj swoje .NET PDF API już dziś i usprawnij generowanie dokumentów w całym ekosystemie aplikacji dzięki IronPDF!
Często Zadawane Pytania
Czym jest .NET PDF API?
API .NET PDF to biblioteka, która pozwala programistom tworzyć, edytować i wyodrębniać zawartość plików PDF w aplikacjach .NET. Upraszcza ona złożone zadania związane z plikami PDF i zapewnia wydajne zarządzanie plikami PDF.
W jaki sposób interfejs API .NET PDF może przynieść korzyści mojej aplikacji?
Interfejs API .NET do obsługi plików PDF może ulepszyć Twoją aplikację, zapewniając spójność, łatwość konserwacji i skalowalność w zarządzaniu plikami PDF, takimi jak generowanie faktur, raportów, certyfikatów lub umów.
Jakie są typowe zastosowania interfejsu API .NET do obsługi plików PDF?
Typowe zastosowania interfejsu API .NET PDF obejmują generowanie faktur, tworzenie raportów, generowanie certyfikatów oraz zarządzanie umowami w aplikacjach desktopowych i internetowych.
W jaki sposób IronPDF upraszcza zadania związane z generowaniem plików PDF?
IronPDF upraszcza zadania związane z generowaniem plików PDF, oferując solidną bibliotekę, która pozwala na łatwe zarządzanie treścią dokumentów, stronami PDF i polami formularzy, ułatwiając utrzymanie i skalowanie aplikacji.
Czy IronPDF obsługuje pola formularzy PDF?
Tak, IronPDF umożliwia efektywne zarządzanie polami formularzy PDF, pozwalając programistom na tworzenie, wypełnianie i wyodrębnianie danych z formularzy w dokumentach PDF.
Czy IronPDF nadaje się zarówno do aplikacji desktopowych, jak i internetowych?
Oczywiście, IronPDF został zaprojektowany tak, aby płynnie współpracować zarówno z aplikacjami desktopowymi, jak i internetowymi, zapewniając spójne i skalowalne rozwiązanie do zarządzania plikami PDF.
Co sprawia, że IronPDF jest niezawodnym wyborem dla programistów .NET?
IronPDF to niezawodny wybór dla programistów .NET ze względu na łatwość obsługi, wszechstronne funkcje oraz możliwość usprawnienia zadań związanych z plikami PDF, co zwiększa produktywność i wydajność aplikacji.
Czy IronPDF obsługuje funkcje wyodrębniania treści z plików PDF?
Tak, IronPDF obsługuje funkcje ekstrakcji z plików PDF, umożliwiając wydajne wyodrębnianie tekstu, obrazów i innych danych z dokumentów PDF.
W jaki sposób IronPDF poprawia skalowalność zarządzania plikami PDF?
IronPDF poprawia skalowalność, zapewniając scentralizowaną usługę generowania plików PDF, która może sprostać rosnącym wymaganiom bez utraty wydajności, co czyni ją idealnym rozwiązaniem dla rozwijających się aplikacji.
Jakiego rodzaju wsparcie oferuje IronPDF for .NET?
IronPDF oferuje szerokie wsparcie dla aplikacji .NET, w tym szczegółową dokumentację, przykładowy kod oraz responsywny zespół wsparcia, który pomaga programistom w integracji funkcji PDF.
Czy IronPDF jest w pełni kompatybilny z .NET 10?
Tak — IronPDF jest w pełni kompatybilny z .NET 10. Obsługuje wszystkie ulepszenia wydajności, języka i środowiska uruchomieniowego wprowadzone w .NET 10 i działa od razu w projektach .NET 10, tak samo jak w poprzednich wersjach, takich jak .NET 6, 7, 8 i 9.




