Przejdź do treści stopki
KORZYSTANIE Z IRONPDF

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
$vbLabelText   $csharpLabel

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
$vbLabelText   $csharpLabel

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
$vbLabelText   $csharpLabel

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
$vbLabelText   $csharpLabel

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()
$vbLabelText   $csharpLabel

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
$vbLabelText   $csharpLabel

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 stworzyć .NET PDF API za pomocą IronPDF: Rysunek 4 - Swagger UI

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
$vbLabelText   $csharpLabel

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

Jak stworzyć .NET PDF API za pomocą IronPDF: Rysunek 5 - Wyjście PDF URL

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
$vbLabelText   $csharpLabel

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 stworzyć .NET PDF API za pomocą IronPDF: Rysunek 6 - Wyjście znaku wodnego z powyższego przykładu kodu

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
$vbLabelText   $csharpLabel

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
$vbLabelText   $csharpLabel

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
$vbLabelText   $csharpLabel

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)()
$vbLabelText   $csharpLabel

Dla bardziej zaawansowanych scenariuszy uwierzytelniania, rozważ:

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
$vbLabelText   $csharpLabel

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
$vbLabelText   $csharpLabel

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
$vbLabelText   $csharpLabel

Wynik faktury

Jak stworzyć .NET PDF API za pomocą IronPDF: Rysunek 7 - Wynik faktury w PDF

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.
$vbLabelText   $csharpLabel

Dla szczegółowych przewodników wdrożeniowych Twojego API PDF .NET, zobacz:

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
$vbLabelText   $csharpLabel

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:

  1. Rozpocznij swoją bezpłatną wersję próbną - Przetestuj IronPDF z pełną funkcjonalnością w swoim środowisku deweloperskim
  2. Odkryj zaawansowane funkcje - Sprawdź podpisy cyfrowe, formy PDF i inne zaawansowane funkcje PDF
  3. 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.

Curtis Chau
Autor tekstów technicznych

Curtis Chau posiada tytuł licencjata z informatyki (Uniwersytet Carleton) i specjalizuje się w front-endowym rozwoju, z ekspertką w Node.js, TypeScript, JavaScript i React. Pasjonuje się tworzeniem intuicyjnych i estetycznie przyjemnych interfejsów użytkownika, Curtis cieszy się pracą z nowoczesnymi frameworkami i tworzeniem dobrze zorganizowanych, atrakcyjnych wizualnie podrę...

Czytaj więcej

Zespol wsparcia Iron

Jestesmy online 24 godziny, 5 dni w tygodniu.
Czat
Email
Zadzwon do mnie