Przejdź do treści stopki
PORóWNANIA PRODUKTóW

Generowanie PDF w ASP.NET MVC: Przewodnik iTextSharp vs. IronPDF

Full Comparison

Looking for a detailed feature-by-feature breakdown? See how IronPDF stacks up against Itext on pricing, HTML support, and licensing.

View Full Comparison

IronPDF zapewnia doskonałą konwersję HTML do PDF z pełną obsługą CSS3 i JavaScript przy użyciu renderowania Chrome. Natomiast iTextSharp oferuje programowe tworzenie plików PDF, ale ma trudności z konwersją nowoczesnego kodu HTML, co sprawia, że IronPDF jest lepszym wyborem dla aplikacji ASP.NET MVC, które wymagają plików PDF zgodnych ze standardami internetowymi.

Tworzenie dokumentów PDF w aplikacjach ASP.NET MVC jest powszechnym wymogiem przy generowaniu raportów, faktur i treści do pobrania. Chociaż iTextSharp od lat cieszy się popularnością, IronPDF stanowi nowoczesną alternatywę z doskonałymi możliwościami renderowania HTML. W tym artykule omówiono oba podejścia, aby pomóc Ci podjąć świadomą decyzję dotyczącą Twoich potrzeb w zakresie generowania plików PDF w środowisku .NET.

Obie biblioteki rozwiązują ten sam podstawowy problem — generowanie plików PDF w kontekście sieciowym .NET — ale stosują zasadniczo różne podejścia. iTextSharp tworzy pliki PDF programowo za pomocą modelu obiektowego, podczas gdy IronPDF konwertuje HTML na PDF przy użyciu pełnego silnika renderującego Chrome. Zrozumienie tej różnicy architektonicznej jest kluczem do wyboru odpowiedniego narzędzia. Framework ASP.NET MVC firmy Microsoft obsługuje oba wzorce integracji, a każdą z bibliotek można podłączyć do standardowego potoku kontroler-akcja.

Jak zainstalować każdą z bibliotek?

Przed napisaniem jakiegokolwiek kodu należy dodać każdą bibliotekę do swojego projektu. NuGet jest standardowym menedżerem pakietów dla platformy .NET i sprawnie obsługuje oba rodzaje instalacji. W przypadku iTextSharp zainstaluj starszą wersję pakietu za pośrednictwem NuGet:

dotnet add package iTextSharp
dotnet add package iTextSharp
SHELL

W przypadku IronPDF należy również zainstalować go za pośrednictwem NuGet:

dotnet add package IronPdf
dotnet add package IronPdf
SHELL

IronPDF zawiera silnik renderujący Chrome w pakiecie, więc nie jest wymagana dodatkowa instalacja przeglądarki na serwerze. Biblioteka od razu po instalacji obsługuje systemy Windows, Linux, macOS oraz środowiska kontenerowe. Po instalacji dodaj klucz licencyjny IronPDF podczas uruchamiania aplikacji.

Jak wygenerować plik PDF za pomocą iTextSharp w MVC?

Aby generować pliki PDF przy użyciu iTextSharp w aplikacji ASP.NET MVC, najpierw zainstaluj bibliotekę za pośrednictwem NuGet. Biblioteka iTextSharp zapewnia niskopoziomową kontrolę nad tworzeniem plików PDF poprzez klasę Document i model obiektowy.

Poniższy kod przedstawia gotową do wdrożenia implementację tworzenia plików PDF za pomocą iTextSharp w kontrolerze MVC:

// Production-ready iTextSharp implementation with proper resource disposal
public class ReportController : Controller
{
    private readonly ILogger<ReportController> _logger;

    public ReportController(ILogger<ReportController> logger)
    {
        _logger = logger;
    }

    public ActionResult GeneratePDF()
    {
        try
        {
            using var memoryStream = new MemoryStream();
            using var document = new Document(PageSize.A4, 50, 50, 25, 25);
            using var writer = PdfWriter.GetInstance(document, memoryStream);

            document.Open();
            document.AddTitle("Generated Report");
            document.AddCreationDate();

            var titleFont = FontFactory.GetFont(FontFactory.HELVETICA_BOLD, 16);
            document.Add(new Paragraph("Hello World", titleFont));
            document.Add(new Paragraph("This is a PDF document created with iTextSharp"));

            var table = new PdfPTable(3);
            table.AddCell("Header 1");
            table.AddCell("Header 2");
            table.AddCell("Header 3");
            document.Add(table);

            document.Close();

            var pdfBytes = memoryStream.ToArray();
            Response.Headers.Add("Content-Disposition", "inline; filename=report.pdf");
            _logger.LogInformation("PDF generated: {Size} bytes", pdfBytes.Length);
            return File(pdfBytes, "application/pdf");
        }
        catch (Exception ex)
        {
            _logger.LogError(ex, "Error generating PDF");
            return StatusCode(500, "Error generating PDF document");
        }
    }
}
// Production-ready iTextSharp implementation with proper resource disposal
public class ReportController : Controller
{
    private readonly ILogger<ReportController> _logger;

    public ReportController(ILogger<ReportController> logger)
    {
        _logger = logger;
    }

    public ActionResult GeneratePDF()
    {
        try
        {
            using var memoryStream = new MemoryStream();
            using var document = new Document(PageSize.A4, 50, 50, 25, 25);
            using var writer = PdfWriter.GetInstance(document, memoryStream);

            document.Open();
            document.AddTitle("Generated Report");
            document.AddCreationDate();

            var titleFont = FontFactory.GetFont(FontFactory.HELVETICA_BOLD, 16);
            document.Add(new Paragraph("Hello World", titleFont));
            document.Add(new Paragraph("This is a PDF document created with iTextSharp"));

            var table = new PdfPTable(3);
            table.AddCell("Header 1");
            table.AddCell("Header 2");
            table.AddCell("Header 3");
            document.Add(table);

            document.Close();

            var pdfBytes = memoryStream.ToArray();
            Response.Headers.Add("Content-Disposition", "inline; filename=report.pdf");
            _logger.LogInformation("PDF generated: {Size} bytes", pdfBytes.Length);
            return File(pdfBytes, "application/pdf");
        }
        catch (Exception ex)
        {
            _logger.LogError(ex, "Error generating PDF");
            return StatusCode(500, "Error generating PDF document");
        }
    }
}
Imports System
Imports System.IO
Imports Microsoft.AspNetCore.Mvc
Imports Microsoft.Extensions.Logging
Imports iTextSharp.text
Imports iTextSharp.text.pdf

Public Class ReportController
    Inherits Controller

    Private ReadOnly _logger As ILogger(Of ReportController)

    Public Sub New(logger As ILogger(Of ReportController))
        _logger = logger
    End Sub

    Public Function GeneratePDF() As ActionResult
        Try
            Using memoryStream As New MemoryStream()
                Using document As New Document(PageSize.A4, 50, 50, 25, 25)
                    Using writer As PdfWriter = PdfWriter.GetInstance(document, memoryStream)
                        document.Open()
                        document.AddTitle("Generated Report")
                        document.AddCreationDate()

                        Dim titleFont As Font = FontFactory.GetFont(FontFactory.HELVETICA_BOLD, 16)
                        document.Add(New Paragraph("Hello World", titleFont))
                        document.Add(New Paragraph("This is a PDF document created with iTextSharp"))

                        Dim table As New PdfPTable(3)
                        table.AddCell("Header 1")
                        table.AddCell("Header 2")
                        table.AddCell("Header 3")
                        document.Add(table)

                        document.Close()

                        Dim pdfBytes As Byte() = memoryStream.ToArray()
                        Response.Headers.Add("Content-Disposition", "inline; filename=report.pdf")
                        _logger.LogInformation("PDF generated: {Size} bytes", pdfBytes.Length)
                        Return File(pdfBytes, "application/pdf")
                    End Using
                End Using
            End Using
        Catch ex As Exception
            _logger.LogError(ex, "Error generating PDF")
            Return StatusCode(500, "Error generating PDF document")
        End Try
    End Function
End Class
$vbLabelText   $csharpLabel

Jak wygląda wynik działania iTextSharp?

Przeglądarka PDF wyświetlająca prosty dokument z nagłówkiem

Ten kod ilustruje podstawowe podejście: utwórz instancję Document, dołącz PdfWriter do strumienia, dodaj zawartość za pomocą obiektów elementów i zwróć plik poprzez wynik akcji. Implementacja obsługuje wzorce usuwania zasobów niezbędne w systemach produkcyjnych. W bardziej zaawansowanych scenariuszach można skonfigurować niestandardowe rozmiary papieru, zarządzać orientacją stron lub dodawać numery stron.

Podejście programowe zapewnia precyzyjną kontrolę nad każdym elementem na stronie. Ta precyzja jest przydatna podczas generowania dokumentów o stałym układzie, takich jak faktury, certyfikaty lub formularze, których struktura jest zawsze taka sama. Staje się to jednak utrudnieniem, gdy treść jest dynamiczna lub oparta na szablonie HTML.

Jakie wyzwania wiążą się z konwersją HTML do PDF przy użyciu biblioteki iTextSharp?

Chociaż iTextSharp doskonale sprawdza się w programowym tworzeniu plików PDF, konwersja HTML do PDF stanowi poważne wyzwanie. Wycofana klasa HTMLWorker i jej zamiennik XMLWorker mają ograniczoną obsługę CSS i nie radzą sobie z nowoczesnymi treściami internetowymi, szczególnie w przypadku responsywnego CSS i treści renderowanych przez JavaScript.

// HTML conversion with iTextSharp -- note the CSS limitations
public class HtmlToPdfController : Controller
{
    private readonly ILogger<HtmlToPdfController> _logger;

    public HtmlToPdfController(ILogger<HtmlToPdfController> logger)
    {
        _logger = logger;
    }

    public async Task<ActionResult> ConvertHtmlAsync(string htmlContent)
    {
        if (string.IsNullOrWhiteSpace(htmlContent))
            return BadRequest("HTML content is required");

        return await Task.Run(() =>
        {
            using var stream = new MemoryStream();
            using var document = new Document(PageSize.A4);
            using var writer = PdfWriter.GetInstance(document, stream);

            document.Open();

            var cssResolver = XMLWorkerHelper.GetInstance().GetDefaultCssResolver(true);
            var fontProvider = new XMLWorkerFontProvider();
            var cssAppliers = new CssAppliersImpl(fontProvider);
            var htmlContext = new HtmlPipelineContext(cssAppliers);
            htmlContext.SetTagFactory(Tags.GetHtmlTagProcessorFactory());

            // Pipeline with limited CSS3 support
            var pdf = new PdfWriterPipeline(document, writer);
            var html = new HtmlPipeline(htmlContext, pdf);
            var css = new CssResolverPipeline(cssResolver, html);

            var worker = new XMLWorker(css, true);
            var parser = new XMLParser(worker);

            using var stringReader = new StringReader(htmlContent);
            parser.Parse(stringReader);
            document.Close();

            return File(stream.ToArray(), "application/pdf", "converted.pdf");
        });
    }
}
// HTML conversion with iTextSharp -- note the CSS limitations
public class HtmlToPdfController : Controller
{
    private readonly ILogger<HtmlToPdfController> _logger;

    public HtmlToPdfController(ILogger<HtmlToPdfController> logger)
    {
        _logger = logger;
    }

    public async Task<ActionResult> ConvertHtmlAsync(string htmlContent)
    {
        if (string.IsNullOrWhiteSpace(htmlContent))
            return BadRequest("HTML content is required");

        return await Task.Run(() =>
        {
            using var stream = new MemoryStream();
            using var document = new Document(PageSize.A4);
            using var writer = PdfWriter.GetInstance(document, stream);

            document.Open();

            var cssResolver = XMLWorkerHelper.GetInstance().GetDefaultCssResolver(true);
            var fontProvider = new XMLWorkerFontProvider();
            var cssAppliers = new CssAppliersImpl(fontProvider);
            var htmlContext = new HtmlPipelineContext(cssAppliers);
            htmlContext.SetTagFactory(Tags.GetHtmlTagProcessorFactory());

            // Pipeline with limited CSS3 support
            var pdf = new PdfWriterPipeline(document, writer);
            var html = new HtmlPipeline(htmlContext, pdf);
            var css = new CssResolverPipeline(cssResolver, html);

            var worker = new XMLWorker(css, true);
            var parser = new XMLParser(worker);

            using var stringReader = new StringReader(htmlContent);
            parser.Parse(stringReader);
            document.Close();

            return File(stream.ToArray(), "application/pdf", "converted.pdf");
        });
    }
}
Imports System
Imports System.IO
Imports System.Threading.Tasks
Imports System.Web.Mvc
Imports iTextSharp.text
Imports iTextSharp.text.pdf
Imports iTextSharp.tool.xml
Imports iTextSharp.tool.xml.pipeline.css
Imports iTextSharp.tool.xml.pipeline.html
Imports iTextSharp.tool.xml.pipeline.end
Imports Microsoft.Extensions.Logging

' HTML conversion with iTextSharp -- note the CSS limitations
Public Class HtmlToPdfController
    Inherits Controller

    Private ReadOnly _logger As ILogger(Of HtmlToPdfController)

    Public Sub New(logger As ILogger(Of HtmlToPdfController))
        _logger = logger
    End Sub

    Public Async Function ConvertHtmlAsync(htmlContent As String) As Task(Of ActionResult)
        If String.IsNullOrWhiteSpace(htmlContent) Then
            Return BadRequest("HTML content is required")
        End If

        Return Await Task.Run(Function()
                                  Using stream As New MemoryStream()
                                      Using document As New Document(PageSize.A4)
                                          Using writer = PdfWriter.GetInstance(document, stream)
                                              document.Open()

                                              Dim cssResolver = XMLWorkerHelper.GetInstance().GetDefaultCssResolver(True)
                                              Dim fontProvider = New XMLWorkerFontProvider()
                                              Dim cssAppliers = New CssAppliersImpl(fontProvider)
                                              Dim htmlContext = New HtmlPipelineContext(cssAppliers)
                                              htmlContext.SetTagFactory(Tags.GetHtmlTagProcessorFactory())

                                              ' Pipeline with limited CSS3 support
                                              Dim pdf = New PdfWriterPipeline(document, writer)
                                              Dim html = New HtmlPipeline(htmlContext, pdf)
                                              Dim css = New CssResolverPipeline(cssResolver, html)

                                              Dim worker = New XMLWorker(css, True)
                                              Dim parser = New XMLParser(worker)

                                              Using stringReader As New StringReader(htmlContent)
                                                  parser.Parse(stringReader)
                                              End Using

                                              document.Close()
                                          End Using
                                      End Using
                                  End Using

                                  Return File(stream.ToArray(), "application/pdf", "converted.pdf")
                              End Function)
    End Function
End Class
$vbLabelText   $csharpLabel

Jak dobrze iTextSharp radzi sobie z renderowaniem HTML?

Przeglądarka PDF wyświetlająca dokument testowy przekonwertowany z HTML, pokazująca zachowane formatowanie tekstu (pogrubienie, kursywa, czerwony tekst w tekście) oraz listę punktowaną, ale bez żółtego tła wspomnianego w treści, co ilustruje ograniczenia renderowania CSS przez XMLWorkerHelper

Ograniczenia stają się widoczne podczas pracy z układami Bootstrap, treściami renderowanymi przez JavaScript lub złożonymi stylami CSS3. Typowe problemy to brakujące czcionki internetowe, nieprawidłowe układy responsywne oraz brak obsługi typów mediów CSS. Ponadto iTextSharp ma trudności z obsługą znaków międzynarodowych i grafiki SVG podczas konwersji treści HTML.

Ograniczenia te nie mają charakteru wyłącznie kosmetycznego. Gdy faktura lub raport przeznaczony dla klienta wyświetla się nieprawidłowo, ponieważ nie pojawia się kolor tła lub siatka się zawala, plik PDF traci swój sens. Dla zespołów zajmujących się utrzymaniem szablonów HTML odtworzenie tego samego układu w modelu obiektowym iTextSharp oznacza konieczność utrzymywania dwóch wersji każdego projektu dokumentu. To powielanie zwiększa koszty i powoduje rozbieżności między widokiem w przeglądarce a plikiem PDF.

Jak generować pliki PDF z HTML przy użyciu silnika Chrome?

IronPDF zmienia sposób generowania plików PDF dzięki wykorzystaniu silnika renderującego Chrome, zapewniając idealną konwersję HTML do PDF. Zainstaluj pakiet IronPDF NuGet, aby rozpocząć pracę w uproszczony sposób w swoim projekcie Visual Studio.

using IronPdf;

// Configure IronPDF in Program.cs (top-level statements, .NET 10)
var builder = WebApplication.CreateBuilder(args);

builder.Services.AddSingleton<ChromePdfRenderer>(_ =>
{
    var renderer = new ChromePdfRenderer();
    renderer.RenderingOptions.MarginTop = 10;
    renderer.RenderingOptions.MarginBottom = 10;
    renderer.RenderingOptions.EnableJavaScript = true;
    renderer.RenderingOptions.CssMediaType = PdfCssMediaType.Print;
    return renderer;
});

builder.Services.AddMemoryCache();
builder.Services.AddControllersWithViews();

var app = builder.Build();
app.MapControllers();
app.Run();
using IronPdf;

// Configure IronPDF in Program.cs (top-level statements, .NET 10)
var builder = WebApplication.CreateBuilder(args);

builder.Services.AddSingleton<ChromePdfRenderer>(_ =>
{
    var renderer = new ChromePdfRenderer();
    renderer.RenderingOptions.MarginTop = 10;
    renderer.RenderingOptions.MarginBottom = 10;
    renderer.RenderingOptions.EnableJavaScript = true;
    renderer.RenderingOptions.CssMediaType = PdfCssMediaType.Print;
    return renderer;
});

builder.Services.AddMemoryCache();
builder.Services.AddControllersWithViews();

var app = builder.Build();
app.MapControllers();
app.Run();
Imports IronPdf

' Configure IronPDF in Program.vb (top-level statements, .NET 10)
Dim builder = WebApplication.CreateBuilder(args)

builder.Services.AddSingleton(Function(_)
    Dim renderer = New ChromePdfRenderer()
    renderer.RenderingOptions.MarginTop = 10
    renderer.RenderingOptions.MarginBottom = 10
    renderer.RenderingOptions.EnableJavaScript = True
    renderer.RenderingOptions.CssMediaType = PdfCssMediaType.Print
    Return renderer
End Function)

builder.Services.AddMemoryCache()
builder.Services.AddControllersWithViews()

Dim app = builder.Build()
app.MapControllers()
app.Run()
$vbLabelText   $csharpLabel

Jakiej jakości możesz oczekiwać od Chrome Rendering?

Przeglądarka PDF wyświetlająca dokument z fioletowym nagłówkiem z gradientem, zawierającym tytuł

ChromePdfRenderer obsługuje złożone układy bez konieczności stosowania ręcznych obejść. Obsługuje CSS Grid, Flexbox, czcionki internetowe z Google Fonts oraz wykresy JavaScript. Biblioteka zarządza również opóźnieniami renderowania treści dynamicznych i obsługuje konfigurację okna wyświetlania dla stron responsywnych. Pełne opcje konfiguracji można znaleźć w opisie opcji renderowania.

Jak przekonwertować widok Razor do formatu PDF w ASP.NET MVC?

IronPDF wyróżnia się możliwościami renderowania widoku dzięki silnikowi Razor Engine. Możesz konwertować całe widoki Razor bezpośrednio do formatu PDF z pełną obsługą ViewBag, ViewData i powiązania modeli. Poniższy przykład renderuje widok faktury po stronie serwera i zwraca go jako plik PDF do pobrania:

// Production-ready Razor view to PDF
public class InvoiceController : Controller
{
    private readonly ChromePdfRenderer _pdfRenderer;
    private readonly IInvoiceService _invoiceService;
    private readonly IRazorViewToStringRenderer _razorRenderer;

    public InvoiceController(
        ChromePdfRenderer pdfRenderer,
        IInvoiceService invoiceService,
        IRazorViewToStringRenderer razorRenderer)
    {
        _pdfRenderer = pdfRenderer;
        _invoiceService = invoiceService;
        _razorRenderer = razorRenderer;
    }

    [HttpGet]
    public async Task<IActionResult> DownloadInvoiceAsync(int id)
    {
        var invoice = await _invoiceService.GetInvoiceAsync(id);
        if (invoice == null) return NotFound();

        var htmlContent = await _razorRenderer.RenderViewToStringAsync(
            "Invoice/InvoiceTemplate", invoice);

        var renderOptions = new ChromePdfRenderOptions
        {
            PaperSize = PdfPaperSize.A4,
            MarginTop = 20,
            MarginBottom = 20,
            PrintHtmlBackgrounds = true,
            CreatePdfFormsFromHtml = true
        };

        var pdf = await Task.Run(() =>
            _pdfRenderer.RenderHtmlAsPdf(htmlContent, renderOptions));

        pdf.MetaData.Title = $"Invoice-{invoice.InvoiceNumber}";
        pdf.MetaData.Subject = $"Invoice for {invoice.CustomerName}";

        var fileName = $"Invoice-{invoice.InvoiceNumber}-{DateTime.UtcNow:yyyyMMdd}.pdf";
        return File(pdf.BinaryData, "application/pdf", fileName);
    }
}
// Production-ready Razor view to PDF
public class InvoiceController : Controller
{
    private readonly ChromePdfRenderer _pdfRenderer;
    private readonly IInvoiceService _invoiceService;
    private readonly IRazorViewToStringRenderer _razorRenderer;

    public InvoiceController(
        ChromePdfRenderer pdfRenderer,
        IInvoiceService invoiceService,
        IRazorViewToStringRenderer razorRenderer)
    {
        _pdfRenderer = pdfRenderer;
        _invoiceService = invoiceService;
        _razorRenderer = razorRenderer;
    }

    [HttpGet]
    public async Task<IActionResult> DownloadInvoiceAsync(int id)
    {
        var invoice = await _invoiceService.GetInvoiceAsync(id);
        if (invoice == null) return NotFound();

        var htmlContent = await _razorRenderer.RenderViewToStringAsync(
            "Invoice/InvoiceTemplate", invoice);

        var renderOptions = new ChromePdfRenderOptions
        {
            PaperSize = PdfPaperSize.A4,
            MarginTop = 20,
            MarginBottom = 20,
            PrintHtmlBackgrounds = true,
            CreatePdfFormsFromHtml = true
        };

        var pdf = await Task.Run(() =>
            _pdfRenderer.RenderHtmlAsPdf(htmlContent, renderOptions));

        pdf.MetaData.Title = $"Invoice-{invoice.InvoiceNumber}";
        pdf.MetaData.Subject = $"Invoice for {invoice.CustomerName}";

        var fileName = $"Invoice-{invoice.InvoiceNumber}-{DateTime.UtcNow:yyyyMMdd}.pdf";
        return File(pdf.BinaryData, "application/pdf", fileName);
    }
}
Imports System
Imports System.Threading.Tasks
Imports Microsoft.AspNetCore.Mvc

' Production-ready Razor view to PDF
Public Class InvoiceController
    Inherits Controller

    Private ReadOnly _pdfRenderer As ChromePdfRenderer
    Private ReadOnly _invoiceService As IInvoiceService
    Private ReadOnly _razorRenderer As IRazorViewToStringRenderer

    Public Sub New(pdfRenderer As ChromePdfRenderer, invoiceService As IInvoiceService, razorRenderer As IRazorViewToStringRenderer)
        _pdfRenderer = pdfRenderer
        _invoiceService = invoiceService
        _razorRenderer = razorRenderer
    End Sub

    <HttpGet>
    Public Async Function DownloadInvoiceAsync(id As Integer) As Task(Of IActionResult)
        Dim invoice = Await _invoiceService.GetInvoiceAsync(id)
        If invoice Is Nothing Then Return NotFound()

        Dim htmlContent = Await _razorRenderer.RenderViewToStringAsync("Invoice/InvoiceTemplate", invoice)

        Dim renderOptions As New ChromePdfRenderOptions With {
            .PaperSize = PdfPaperSize.A4,
            .MarginTop = 20,
            .MarginBottom = 20,
            .PrintHtmlBackgrounds = True,
            .CreatePdfFormsFromHtml = True
        }

        Dim pdf = Await Task.Run(Function() _pdfRenderer.RenderHtmlAsPdf(htmlContent, renderOptions))

        pdf.MetaData.Title = $"Invoice-{invoice.InvoiceNumber}"
        pdf.MetaData.Subject = $"Invoice for {invoice.CustomerName}"

        Dim fileName = $"Invoice-{invoice.InvoiceNumber}-{DateTime.UtcNow:yyyyMMdd}.pdf"
        Return File(pdf.BinaryData, "application/pdf", fileName)
    End Function
End Class
$vbLabelText   $csharpLabel

Jak konwersja widoku Razor wypada w porównaniu z ręcznym tworzeniem?

Renderowanie w formacie PDF strony głównej aplikacji internetowej ASP.NET Core, pokazujące menu nawigacyjne, nagłówek powitalny i stopkę z zachowanym stylem Bootstrap, demonstrujące, w jaki sposób układy stron internetowych przekładają się na format PDF

Porównaj to z podejściem iTextSharp, które wymaga ręcznego budowania struktury dokumentu w kodzie. Każdy nagłówek, komórka tabeli, wybór czcionki i dostosowanie odstępów musi być wyrażone jako obiekt C#. Nie ma szablonu HTML, który można by wyświetlić w przeglądarce; Każda zmiana wymaga cyklu kompilacji i sprawdzenia w odniesieniu do pliku PDF.

Integracja IronPDF z Razor pozwala na ponowne wykorzystanie istniejących widoków Razor, plików HTML lub ciągów HTML do generowania plików PDF. Można również pracować z plikami ZIP w formacie HTML lub wdrożyć konfiguracje podstawowych adresów URL do ładowania zasobów. Poradnik dotyczący konwersji CSHTML do PDF zawiera szczegółowy opis całego procesu renderowania Razor, w tym konfiguracji wstrzykiwania zależności.

Jak radzisz sobie z pobieraniem plików i strumieniowaniem w celu utworzenia pliku PDF?

Obie biblioteki obsługują różne metody generowania plików PDF w aplikacjach internetowych. IronPDF oferuje dodatkowe funkcje, takie jak kompresja plików PDF, linearyzacja w celu szybkiego przeglądania w sieci oraz rasteryzacja do obrazów. Poniższy kontroler strumieniowania pokazuje, jak obsługiwać duże pliki PDF z wykorzystaniem buforowania i obsługi żądań zakresowych:

// Streaming controller for large PDFs
public class StreamingPdfController : Controller
{
    private readonly ChromePdfRenderer _ironPdfRenderer;
    private readonly IMemoryCache _cache;

    public StreamingPdfController(ChromePdfRenderer ironPdfRenderer, IMemoryCache cache)
    {
        _ironPdfRenderer = ironPdfRenderer;
        _cache = cache;
    }

    [HttpGet]
    public async Task<IActionResult> StreamLargePdf(string reportId)
    {
        var cacheKey = $"pdf_stream_{reportId}";
        if (_cache.TryGetValue<byte[]>(cacheKey, out var cachedPdf))
            return File(cachedPdf, "application/pdf", $"report_{reportId}.pdf");

        Response.ContentType = "application/pdf";
        Response.Headers.Add("Content-Disposition",
            $"attachment; filename=large_report_{reportId}.pdf");

        await using var stream = Response.BodyWriter.AsStream();
        var html = await GenerateLargeHtmlReport(reportId);
        var pdf = _ironPdfRenderer.RenderHtmlAsPdf(html);
        pdf.SaveAs(stream);

        if (pdf.BinaryData.Length < 10_000_000)
            _cache.Set(cacheKey, pdf.BinaryData, TimeSpan.FromMinutes(30));

        return new EmptyResult();
    }

    [HttpGet]
    public IActionResult DownloadWithRangeSupport(string documentId)
    {
        var pdfBytes = GetPdfBytes(documentId);
        return File(pdfBytes, "application/pdf",
            $"document_{documentId}.pdf", enableRangeProcessing: true);
    }
}
// Streaming controller for large PDFs
public class StreamingPdfController : Controller
{
    private readonly ChromePdfRenderer _ironPdfRenderer;
    private readonly IMemoryCache _cache;

    public StreamingPdfController(ChromePdfRenderer ironPdfRenderer, IMemoryCache cache)
    {
        _ironPdfRenderer = ironPdfRenderer;
        _cache = cache;
    }

    [HttpGet]
    public async Task<IActionResult> StreamLargePdf(string reportId)
    {
        var cacheKey = $"pdf_stream_{reportId}";
        if (_cache.TryGetValue<byte[]>(cacheKey, out var cachedPdf))
            return File(cachedPdf, "application/pdf", $"report_{reportId}.pdf");

        Response.ContentType = "application/pdf";
        Response.Headers.Add("Content-Disposition",
            $"attachment; filename=large_report_{reportId}.pdf");

        await using var stream = Response.BodyWriter.AsStream();
        var html = await GenerateLargeHtmlReport(reportId);
        var pdf = _ironPdfRenderer.RenderHtmlAsPdf(html);
        pdf.SaveAs(stream);

        if (pdf.BinaryData.Length < 10_000_000)
            _cache.Set(cacheKey, pdf.BinaryData, TimeSpan.FromMinutes(30));

        return new EmptyResult();
    }

    [HttpGet]
    public IActionResult DownloadWithRangeSupport(string documentId)
    {
        var pdfBytes = GetPdfBytes(documentId);
        return File(pdfBytes, "application/pdf",
            $"document_{documentId}.pdf", enableRangeProcessing: true);
    }
}
Imports System
Imports System.Threading.Tasks
Imports Microsoft.AspNetCore.Mvc
Imports Microsoft.Extensions.Caching.Memory

' Streaming controller for large PDFs
Public Class StreamingPdfController
    Inherits Controller

    Private ReadOnly _ironPdfRenderer As ChromePdfRenderer
    Private ReadOnly _cache As IMemoryCache

    Public Sub New(ironPdfRenderer As ChromePdfRenderer, cache As IMemoryCache)
        _ironPdfRenderer = ironPdfRenderer
        _cache = cache
    End Sub

    <HttpGet>
    Public Async Function StreamLargePdf(reportId As String) As Task(Of IActionResult)
        Dim cacheKey = $"pdf_stream_{reportId}"
        Dim cachedPdf As Byte() = Nothing

        If _cache.TryGetValue(cacheKey, cachedPdf) Then
            Return File(cachedPdf, "application/pdf", $"report_{reportId}.pdf")
        End If

        Response.ContentType = "application/pdf"
        Response.Headers.Add("Content-Disposition", $"attachment; filename=large_report_{reportId}.pdf")

        Await Using stream = Response.BodyWriter.AsStream()
            Dim html = Await GenerateLargeHtmlReport(reportId)
            Dim pdf = _ironPdfRenderer.RenderHtmlAsPdf(html)
            pdf.SaveAs(stream)

            If pdf.BinaryData.Length < 10000000 Then
                _cache.Set(cacheKey, pdf.BinaryData, TimeSpan.FromMinutes(30))
            End If
        End Using

        Return New EmptyResult()
    End Function

    <HttpGet>
    Public Function DownloadWithRangeSupport(documentId As String) As IActionResult
        Dim pdfBytes = GetPdfBytes(documentId)
        Return File(pdfBytes, "application/pdf", $"document_{documentId}.pdf", enableRangeProcessing:=True)
    End Function
End Class
$vbLabelText   $csharpLabel

W zaawansowanych scenariuszach IronPDF obsługuje równoległe generowanie plików PDF, przetwarzanie wielowątkowe oraz operacje wsadowe. Możesz wdrożyć niestandardowe logowanie, obsługiwać uwierzytelnianie sieciowe, pracować z plikami cookie oraz dodawać nagłówki żądań HTTP w celu bezpiecznego generowania dokumentów.

Jak wypadają te dwie biblioteki w bezpośrednim porównaniu?

Poniższa tabela podsumowuje kluczowe różnice między iTextSharp a IronPDF for .NET w projektach ASP.NET MVC:

iTextSharp vs. IronPDF — porównanie funkcji dla ASP.NET MVC
Funkcja iTextSharp IronPDF
Renderowanie HTML do PDF Ograniczone (XMLWorker, brak nowoczesnego CSS3) Pełny silnik Chrome (CSS3, JS, Flexbox)
Obsługa Razor / CSHTML Brak natywnej obsługi Wbudowane renderowanie widoków Razor
Bezpieczeństwo wątków Wymaga ręcznego zablokowania Domyślnie bezpieczne dla wątków
Async API Brak natywnej obsługi asynchroniczności Pełna obsługa asynchroniczna
Linux / Docker Obsługiwane Obsługiwane
Rodzaj licencji AGPL (open source) lub komercyjne Wersja komercyjna z bezpłatną wersją próbną
Podpisy cyfrowe Tak Tak
Formularze PDF Tak (ręcznie) Tak (z elementów formularza HTML)

iTextSharp oferuje szczegółową kontrolę nad programowym tworzeniem plików PDF, co czyni go praktycznym rozwiązaniem, gdy struktura dokumentu jest prosta i stała. IronPDF to lepszy wybór, gdy chcesz przekonwertować szablony HTML lub widoki Razor na profesjonalne dokumenty PDF z precyzyjnym renderowaniem, pełną obsługą CSS3 i możliwością wykonywania kodu JavaScript.

W przypadku produkcyjnych aplikacji ASP.NET IronPDF zapewnia doskonałą obsługę asynchroniczną oraz integrację z nowoczesnymi wzorcami .NET, w tym wstrzykiwaniem zależności i potokami oprogramowania pośredniczącego. Możliwość renderowania widoków Razor, obsługa podpisów cyfrowych oraz obsługa złożonych układów sprawiają, że jest to preferowany wybór dla aplikacji Enterprise. Biblioteka obsługuje również aplikacje Blazor Server oraz zgodność z formatem PDF/A dla dokumentów archiwalnych.

A co z licencjami i kwestiami związanymi z projektem?

Biblioteka iTextSharp korzysta z licencji AGPL w swojej wersji open source, co wymaga, aby kod aplikacji również był open source. Licencje komercyjne na projekty własnościowe są dostępne w iText Group. Ta kwestia licencyjna jest szczególnie ważna w przypadku produktów SaaS lub wewnętrznych narzędzi korporacyjnych, w których nie można publikować kodu źródłowego.

IronPDF stosuje model licencji komercyjnej z bezpłatną wersją próbną do celów programistycznych i testowych. Licencje są dostosowane do środowiska wdrożeniowego: programista, pojedynczy serwer lub nieograniczone opcje wdrożenia. Wdrażając którekolwiek z tych rozwiązań, należy wziąć pod uwagę scenariusze wdrożeniowe, w tym środowiska Docker, Azure i Linux.

Kwestie związane z wydajnością w scenariuszach o dużym natężeniu ruchu obejmują wdrażanie operacji asynchronicznych, właściwe zarządzanie pamięcią oraz strategie buforowania. Silnik Chrome firmy IronPDF zapewnia doskonałą wydajność przy renderowaniu złożonego kodu HTML, natomiast iTextSharp może być bardziej wydajny w przypadku prostego programowego generowania plików PDF bez udziału kodu HTML. W przypadku aplikacji generujących setki plików PDF na minutę, testy porównawcze w warunkach realistycznego obciążenia są najbardziej wiarygodnym wskaźnikiem tego, która biblioteka najlepiej pasuje do Twojej infrastruktury.

Migracja z iTextSharp do IronPDF jest prosta w przypadku większości projektów MVC. Główną zmianą jest zastąpienie kodu służącego do ręcznego tworzenia dokumentów szablonem HTML renderowanym przez silnik Chrome. IronPDF zapewnia obszerną dokumentację, przykłady kodu oraz wsparcie inżynieryjne, aby przejście przebiegło płynnie.

Jakie są Twoje kolejne kroki?

W przypadku nowych projektów wymagających konwersji HTML do PDF z obsługą nowoczesnych standardów internetowych, IronPDF oferuje wyraźną przewagę dzięki renderowaniu opartemu na przeglądarce Chrome. Starsze projekty, które już wykorzystują iTextSharp do podstawowego tworzenia plików PDF, mogą kontynuować dotychczasową implementację, chyba że wymagana będzie dokładność renderowania HTML.

Zacznij od bezpłatnej wersji próbnej IronPDF i przetestuj ją bezpośrednio z istniejącymi widokami Razor lub szablonami HTML. Zapoznaj się z pełną dokumentacją i Dokumentacją API, aby przekonać się, jak szybko przebiega integracja. Jeśli masz pytania dotyczące migracji istniejącego projektu opartego na iTextSharp lub potrzebujesz wskazówek dotyczących obsługi strumienia pamięci PDF i zgodności z PDF/A, zespół wsparcia technicznego chętnie Ci pomoże.

Aby uzyskać szerszy obraz porównania IronPDF z rodziną produktów iText, zapoznaj się ze specjalną stroną porównawczą iText vs. IronPDF.

Zwróć uwagęiTextSharp jest zarejestrowanym znakiem towarowym odpowiedniego właściciela. Ta strona nie jest powiązana z iTextSharp, nie jest przez nią promowana ani sponsorowana. Wszystkie nazwy produktów, logo i marki są własnością ich odpowiednich właścicieli. Porównania mają charakter wyłącznie informacyjny i odzwierciedlają informacje dostępne publicznie w momencie pisania.

Często Zadawane Pytania

Jaka jest główna zaleta używania IronPDF nad iTextSharp do generowania PDF w ASP.NET MVC?

IronPDF oferuje lepsze możliwości renderowania HTML w porównaniu do iTextSharp, co ułatwia generowanie wysokiej jakości PDF z treści webowych.

Czy mogę używać IronPDF do generowania faktur w aplikacji ASP.NET MVC?

Tak, IronPDF jest odpowiedni do generowania faktur i innych dokumentów PDF w aplikacjach ASP.NET MVC dzięki funkcjom konwersji HTML do PDF.

Jak wdrożenie IronPDF porównuje się do iTextSharp pod względem łatwości użycia?

IronPDF uważany jest zazwyczaj za łatwiejszy do wdrożenia niż iTextSharp, szczególnie dla deweloperów chcących szybko zintegrować funkcje generowania PDF bez obszernego ustawiania.

Czy IronPDF obsługuje konwersję złożonych stron webowych do PDF w ASP.NET MVC?

Tak, IronPDF doskonale radzi sobie z konwersją złożonych stron webowych do PDF, dzięki zaawansowanemu mechanizmowi renderowania HTML, który dokładnie odwzorowuje treść webową.

Czy IronPDF jest dobrym wyborem do generowania treści do pobrania z aplikacji ASP.NET MVC?

IronPDF jest doskonałym wyborem do generowania treści do pobrania z uwagi na zdolność do tworzenia wysokiej jakości PDF z szerokiego zakresu treści webowych.

Jakie scenariusze są idealne do użycia IronPDF w generowaniu PDF?

IronPDF jest idealny do scenariuszy wymagających wysokiej jakości konwersji HTML na PDF, takich jak generowanie raportów, faktur lub dokumentów do pobrania z treści webowych.

Czy IronPDF oferuje lepsze wsparcie dla nowoczesnych technologii webowych w porównaniu do iTextSharp?

Tak, IronPDF jest zaprojektowany do pracy z nowoczesnymi technologiami webowymi, zapewniając lepszą kompatybilność i dokładność w renderowaniu w porównaniu do iTextSharp.

Jak IronPDF obsługuje obrazy i CSS podczas generowania PDF?

IronPDF obsługuje obrazy i CSS z wysoką zgodnością, zapewniając, że wynikowy PDF dokładnie odpowiada oryginalnej treści HTML, włączając w to złożone układy i style.

Czy IronPDF można łatwo zintegrować z istniejącymi projektami ASP.NET MVC?

Tak, IronPDF można łatwo zintegrować z istniejącymi projektami ASP.NET MVC, oferując przejrzyste API dla deweloperów do wdrożenia funkcji generowania PDF.

Jakie są główne zastosowania IronPDF w aplikacjach ASP.NET MVC?

Główne zastosowania IronPDF w aplikacjach ASP.NET MVC to generowanie raportów, faktur i innych dokumentów, gdzie kluczowa jest dokładna konwersja HTML na PDF.

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