Przejdź do treści stopki
KORZYSTANIE Z IRONPDF

Jak drukować pliki PDF w ASP.NET za pomocą IronPDF

IronPDF umożliwia niezawodne drukowanie plików PDF w aplikacjach ASP.NET dzięki funkcjom po stronie serwera i klienta. Obsługuje wymagania Enterprise, w tym drukarki sieciowe, obsługę błędów oraz generowanie dokumentów zgodnych z przepisami z pełną ścieżką audytu.

Zadania związane z drukowaniem plików PDF w ASP.NET często wiążą się z wyzwaniami charakterystycznymi dla architektur Enterprise. Niezależnie od tego, czy chodzi o generowanie dokumentów takich jak faktury, raporty czy etykiety wysyłkowe, wdrożenie niezawodnej funkcji drukowania wymaga poruszania się po złożonej architekturze serwer-klient przy jednoczesnym zachowaniu zgodności z wymogąmi bezpieczeństwa. Biblioteka IronPDF oferuje profesjonalne funkcje, w tym podpisy cyfrowe, znakowanie wodne oraz zgodność z formatem PDF/A do długoterminowej archiwizacji.

W tym artykule omówiono sposób obsługi zadań drukowania plików PDF przy użyciu biblioteki .NET PDF firmy IronPDF, obejmujący zarówno automatyzację po stronie serwera, jak i procesy drukowania po stronie klienta. Przykłady dotyczą platformy .NET 10, wykorzystują styl instrukcji najwyższego poziomu i są napisane w języku C#.

Jakie są główne wyzwania związane z drukowaniem plików PDF w ASP.NET?

Tradycyjne aplikacje desktopowe mają bezpośredni dostęp do domyślnej drukarki, ale aplikacje ASP.NET Core napotykają kilka przeszkód podczas drukowania dokumentów PDF. Środowiska serwerowe nie mają bezpośredniego dostępu do drukarek ze względu na ograniczenia bezpieczeństwa IIS, a próba uruchomienia procesów w celu uzyskania dostępu do plików powoduje błędy uprawnień. Ograniczenia te mają szczególne znaczenie w branżach podlegających regulacjom, w których konieczne jest zachowanie ścieżek audytu i kontroli dostępu. Ponadto procesy serwera WWW zazwyczaj działają na ograniczonych kontach usługowych, które nie mają dostępu do fizycznych sterowników drukarek, co sprawia, że drukowanie oparte na procesach jest zawodne, nawet jeśli lokalne testy zakończą się powodzeniem.

// This fails in ASP.NET -- wrong approach
Process.Start(@"C:\Files\document.pdf"); // Works locally, crashes on server
// This fails in ASP.NET -- wrong approach
Process.Start(@"C:\Files\document.pdf"); // Works locally, crashes on server
$vbLabelText   $csharpLabel

Powyższy kod ilustruje typowy błąd. Aplikacje internetowe muszą skutecznie obsługiwać scenariusze drukowania zarówno po stronie serwera, jak i po stronie klienta, przy jednoczesnym zachowaniu wymagań dotyczących lokalizacji danych. IronPDF rozwiązuje ten problem, udostępniając w pełni zarządzany interfejs API .NET, który nie jest zależny od zewnętrznych procesów ani sterowników drukarek.

Jak zainstalować IronPDF w projekcie ASP.NET?

IronPDF zapewnia kompletne rozwiązanie .NET Core do generowania dokumentów PDF i drukowania ich bez zewnętrznych zależności. Instalacja pakietu NuGet jest prosta zarówno dla aplikacji .NET Framework, jak i .NET Core.

Zainstaluj za pomocą konsoli menedżera pakietów:

Install-Package IronPdf
Install-Package IronPdf
SHELL

Lub za pomocą interfejsu CLI platformy .NET:

dotnet add package IronPdf
dotnet add package IronPdf
SHELL

IronPDF działa na różnych systemach operacyjnych, w tym Windows Server, dystrybucjach Linuksa i kontenerach Docker, eliminując problemy z kompatybilnością, które dotykają inne biblioteki. W systemie macOS biblioteka natywnie obsługuje zarówno procesory Intel, jak i Apple Silicon.

Po instalacji dodaj klucz licencyjny podczas uruchamiania, aby aktywować pełen zestaw funkcji:

IronPdf.License.LicenseKey = "YOUR-LICENSE-KEY";
IronPdf.License.LicenseKey = "YOUR-LICENSE-KEY";
IronPdf.License.LicenseKey = "YOUR-LICENSE-KEY"
$vbLabelText   $csharpLabel

Dostępna jest bezpłatna licencja próbna, która pozwala przetestować wszystkie funkcje przed zakupem.

Jak tworzyć i drukować dokumenty PDF po stronie serwera?

Poniższy przykład pokazuje, jak wygenerować i wydrukować dokument PDF na podstawie kodu HTML w kontrolerze ASP.NET. ChromePdfRenderer zapewnia renderowanie z dokładnością co do piksela przy pełnej obsłudze CSS. Użycie CssMediaType.Print aktywuje arkusze stylów specyficzne dla drukowania zdefiniowane w kodzie HTML, dzięki czemu wynik dokładnie odpowiada temu, co wyświetlałby podgląd wydruku w przeglądarce:

using IronPdf;
using Microsoft.AspNetCore.Mvc;

var builder = WebApplication.CreateBuilder(args);
builder.Services.AddControllers();
var app = builder.Build();
app.MapControllers();
app.Run();

[ApiController]
[Route("[controller]")]
public class PdfController : ControllerBase
{
    [HttpGet("print")]
    public IActionResult PrintDocument()
    {
        var renderer = new ChromePdfRenderer();
        renderer.RenderingOptions.PrintHtmlBackgrounds = true;
        renderer.RenderingOptions.MarginBottom = 10;
        renderer.RenderingOptions.CssMediaType = PdfCssMediaType.Print;

        var pdf = renderer.RenderHtmlAsPdf("<h1>Invoice</h1><p>Total: $749.00</p>");

        // Print to default server printer
        pdf.Print();

        return Ok("Document sent to printer");
    }
}
using IronPdf;
using Microsoft.AspNetCore.Mvc;

var builder = WebApplication.CreateBuilder(args);
builder.Services.AddControllers();
var app = builder.Build();
app.MapControllers();
app.Run();

[ApiController]
[Route("[controller]")]
public class PdfController : ControllerBase
{
    [HttpGet("print")]
    public IActionResult PrintDocument()
    {
        var renderer = new ChromePdfRenderer();
        renderer.RenderingOptions.PrintHtmlBackgrounds = true;
        renderer.RenderingOptions.MarginBottom = 10;
        renderer.RenderingOptions.CssMediaType = PdfCssMediaType.Print;

        var pdf = renderer.RenderHtmlAsPdf("<h1>Invoice</h1><p>Total: $749.00</p>");

        // Print to default server printer
        pdf.Print();

        return Ok("Document sent to printer");
    }
}
Imports IronPdf
Imports Microsoft.AspNetCore.Mvc

Dim builder = WebApplication.CreateBuilder(args)
builder.Services.AddControllers()
Dim app = builder.Build()
app.MapControllers()
app.Run()

<ApiController>
<Route("[controller]")>
Public Class PdfController
    Inherits ControllerBase

    <HttpGet("print")>
    Public Function PrintDocument() As IActionResult
        Dim renderer = New ChromePdfRenderer()
        renderer.RenderingOptions.PrintHtmlBackgrounds = True
        renderer.RenderingOptions.MarginBottom = 10
        renderer.RenderingOptions.CssMediaType = PdfCssMediaType.Print

        Dim pdf = renderer.RenderHtmlAsPdf("<h1>Invoice</h1><p>Total: $749.00</p>")

        ' Print to default server printer
        pdf.Print()

        Return Ok("Document sent to printer")
    End Function
End Class
$vbLabelText   $csharpLabel

W tym przykładzie wyrenderowany plik PDF jest wysyłany bezpośrednio do domyślnej drukarki serwerowej. ChromePdfRenderer zachowuje styl CSS i formatowanie czcionek. W przypadku stron zawierających dużo kodu JavaScript należy dodać opóźnienie renderowania za pomocą RenderingOptions.WaitFor, aby umożliwić zakończenie ładowania treści dynamicznych przed przechwyceniem.

Jak wygląda wydruk po stronie serwera?

Okno dialogowe

Jak skonfigurować drukarki sieciowe w ASP.NET?

Dla środowisk Enterprise wymagających określonego routingu drukarek z monitorowaniem zgodności, IronPDF oferuje kompleksowe zarządzanie drukowaniem dokumentów. Biblioteka obsługuje różne rozmiary papieru i orientacje stron:

using IronPdf;
using System.Drawing.Printing;
using Microsoft.AspNetCore.Mvc;

[ApiController]
[Route("[controller]")]
public class NetworkPrintController : ControllerBase
{
    [HttpPost("print-network")]
    public IActionResult PrintToNetworkPrinter(string filePath)
    {
        try
        {
            var pdfDocument = PdfDocument.FromFile(filePath);
            var printDocument = pdfDocument.GetPrintDocument();

            // Specify network printer with failover support
            printDocument.PrinterSettings.PrinterName = @"\\server\printer";
            printDocument.PrinterSettings.Copies = 2;
            printDocument.DefaultPageSettings.PaperSize = new PaperSize("A4", 827, 1169);

            var printJobId = Guid.NewGuid().ToString();
            printDocument.Print();

            return Ok(new
            {
                success = true,
                jobId = printJobId,
                message = "Document sent to " + printDocument.PrinterSettings.PrinterName
            });
        }
        catch (Exception ex)
        {
            return StatusCode(500, new { error = "Print operation failed", details = ex.Message });
        }
    }
}
using IronPdf;
using System.Drawing.Printing;
using Microsoft.AspNetCore.Mvc;

[ApiController]
[Route("[controller]")]
public class NetworkPrintController : ControllerBase
{
    [HttpPost("print-network")]
    public IActionResult PrintToNetworkPrinter(string filePath)
    {
        try
        {
            var pdfDocument = PdfDocument.FromFile(filePath);
            var printDocument = pdfDocument.GetPrintDocument();

            // Specify network printer with failover support
            printDocument.PrinterSettings.PrinterName = @"\\server\printer";
            printDocument.PrinterSettings.Copies = 2;
            printDocument.DefaultPageSettings.PaperSize = new PaperSize("A4", 827, 1169);

            var printJobId = Guid.NewGuid().ToString();
            printDocument.Print();

            return Ok(new
            {
                success = true,
                jobId = printJobId,
                message = "Document sent to " + printDocument.PrinterSettings.PrinterName
            });
        }
        catch (Exception ex)
        {
            return StatusCode(500, new { error = "Print operation failed", details = ex.Message });
        }
    }
}
Imports IronPdf
Imports System.Drawing.Printing
Imports Microsoft.AspNetCore.Mvc

<ApiController>
<Route("[controller]")>
Public Class NetworkPrintController
    Inherits ControllerBase

    <HttpPost("print-network")>
    Public Function PrintToNetworkPrinter(filePath As String) As IActionResult
        Try
            Dim pdfDocument = PdfDocument.FromFile(filePath)
            Dim printDocument = pdfDocument.GetPrintDocument()

            ' Specify network printer with failover support
            printDocument.PrinterSettings.PrinterName = "\\server\printer"
            printDocument.PrinterSettings.Copies = 2
            printDocument.DefaultPageSettings.PaperSize = New PaperSize("A4", 827, 1169)

            Dim printJobId = Guid.NewGuid().ToString()
            printDocument.Print()

            Return Ok(New With {
                .success = True,
                .jobId = printJobId,
                .message = "Document sent to " & printDocument.PrinterSettings.PrinterName
            })
        Catch ex As Exception
            Return StatusCode(500, New With {.error = "Print operation failed", .details = ex.Message})
        End Try
    End Function
End Class
$vbLabelText   $csharpLabel

Takie podejście zapewnia pełną kontrolę nad ustawieniami drukarki, w tym formatem papieru i rozdzielczością. Wdrożenie obejmuje obsługę błędów i śledzenie zadań wymagane przez frameworki zgodności. W przypadku drukowania dużych ilości dokumentów warto rozważyć wdrożenie przetwarzania asynchronicznego i optymalizacji pamięci, aby utrzymać wysoką przepustowość serwera.

Jakie są kwestie związane z bezpieczeństwem w przypadku drukowania sieciowego?

Okno dialogowe

Jak sprawdzić, czy zadania drukowania zakończyły się powodzeniem?

Wynik konsoli przeglądarki pokazujący pomyślną operację drukowania z odpowiedzią JSON zawierającą

Jaka jest najlepsza strategia drukowania po stronie klienta?

Ponieważ przeglądarki ograniczają bezpośredni dostęp do drukarki ze względów bezpieczeństwa, należy wdrożyć drukowanie po stronie klienta, udostępniając plik PDF z odpowiednimi nagłówkami bezpieczeństwa. IronPDF obsługuje różne opcje kompresji w celu przyspieszenia dostarczania plików. Ten wzorzec jest idealny, gdy użytkownicy końcowi muszą wybrać własne miejsce docelowe drukowania z okna dialogowego drukowania przeglądarki:

using IronPdf;
using IronPdf.Rendering;
using Microsoft.AspNetCore.Mvc;
using System.Text;

[ApiController]
[Route("[controller]")]
public class ClientPrintController : ControllerBase
{
    [HttpGet("pdf")]
    public IActionResult GetRawPrintablePdf()
    {
        var renderer = new ChromePdfRenderer();
        renderer.RenderingOptions.EnableJavaScript = false;

        var pdf = renderer.RenderHtmlAsPdf(GetInvoiceHtml());

        pdf.SecuritySettings.AllowUserPrinting = true;
        pdf.SecuritySettings.AllowUserEditing = false;
        pdf.SecuritySettings.AllowUserCopyPasteContent = false;

        pdf.ApplyWatermark(
            "<h2 style='color:red;opacity:0.3'>CONFIDENTIAL</h2>",
            30,
            VerticalAlignment.Middle,
            HorizontalAlignment.Center);

        HttpContext.Response.Headers["Content-Disposition"] = "inline; filename=invoice.pdf";
        HttpContext.Response.Headers["X-Content-Type-Options"] = "nosniff";

        return File(pdf.BinaryData, "application/pdf");
    }

    [HttpGet("print-wrapper")]
    public IActionResult PrintUsingClientWrapper()
    {
        var printUrl = Url.Action(nameof(GetRawPrintablePdf));
        var html = new StringBuilder();
        html.AppendLine("<!DOCTYPE html><html lang=\"en\"><head><title>Print Document</title></head><body>");
        html.AppendLine($"<iframe src='{printUrl}' style='position:absolute;top:0;left:0;width:100%;height:100%;border:none;'></iframe>");
        html.AppendLine("<script>window.onload = function() { setTimeout(function() { window.print(); }, 100); };</script>");
        html.AppendLine("</body></html>");
        return Content(html.ToString(), "text/html");
    }

    private static string GetInvoiceHtml() => @"
        <html><head><style>
            body { font-family: Arial, sans-serif; }
            .header { font-weight: bold; color: #1e40af; }
            @media print { .no-print { display: none; } }
        </style></head>
        <body>
            <div class='header'>Invoice Summary</div>
            <p>Total Amount: <b>$749.00</b></p>
        </body></html>";
}
using IronPdf;
using IronPdf.Rendering;
using Microsoft.AspNetCore.Mvc;
using System.Text;

[ApiController]
[Route("[controller]")]
public class ClientPrintController : ControllerBase
{
    [HttpGet("pdf")]
    public IActionResult GetRawPrintablePdf()
    {
        var renderer = new ChromePdfRenderer();
        renderer.RenderingOptions.EnableJavaScript = false;

        var pdf = renderer.RenderHtmlAsPdf(GetInvoiceHtml());

        pdf.SecuritySettings.AllowUserPrinting = true;
        pdf.SecuritySettings.AllowUserEditing = false;
        pdf.SecuritySettings.AllowUserCopyPasteContent = false;

        pdf.ApplyWatermark(
            "<h2 style='color:red;opacity:0.3'>CONFIDENTIAL</h2>",
            30,
            VerticalAlignment.Middle,
            HorizontalAlignment.Center);

        HttpContext.Response.Headers["Content-Disposition"] = "inline; filename=invoice.pdf";
        HttpContext.Response.Headers["X-Content-Type-Options"] = "nosniff";

        return File(pdf.BinaryData, "application/pdf");
    }

    [HttpGet("print-wrapper")]
    public IActionResult PrintUsingClientWrapper()
    {
        var printUrl = Url.Action(nameof(GetRawPrintablePdf));
        var html = new StringBuilder();
        html.AppendLine("<!DOCTYPE html><html lang=\"en\"><head><title>Print Document</title></head><body>");
        html.AppendLine($"<iframe src='{printUrl}' style='position:absolute;top:0;left:0;width:100%;height:100%;border:none;'></iframe>");
        html.AppendLine("<script>window.onload = function() { setTimeout(function() { window.print(); }, 100); };</script>");
        html.AppendLine("</body></html>");
        return Content(html.ToString(), "text/html");
    }

    private static string GetInvoiceHtml() => @"
        <html><head><style>
            body { font-family: Arial, sans-serif; }
            .header { font-weight: bold; color: #1e40af; }
            @media print { .no-print { display: none; } }
        </style></head>
        <body>
            <div class='header'>Invoice Summary</div>
            <p>Total Amount: <b>$749.00</b></p>
        </body></html>";
}
Imports IronPdf
Imports IronPdf.Rendering
Imports Microsoft.AspNetCore.Mvc
Imports System.Text

<ApiController>
<Route("[controller]")>
Public Class ClientPrintController
    Inherits ControllerBase

    <HttpGet("pdf")>
    Public Function GetRawPrintablePdf() As IActionResult
        Dim renderer As New ChromePdfRenderer()
        renderer.RenderingOptions.EnableJavaScript = False

        Dim pdf = renderer.RenderHtmlAsPdf(GetInvoiceHtml())

        pdf.SecuritySettings.AllowUserPrinting = True
        pdf.SecuritySettings.AllowUserEditing = False
        pdf.SecuritySettings.AllowUserCopyPasteContent = False

        pdf.ApplyWatermark("<h2 style='color:red;opacity:0.3'>CONFIDENTIAL</h2>", 30, VerticalAlignment.Middle, HorizontalAlignment.Center)

        HttpContext.Response.Headers("Content-Disposition") = "inline; filename=invoice.pdf"
        HttpContext.Response.Headers("X-Content-Type-Options") = "nosniff"

        Return File(pdf.BinaryData, "application/pdf")
    End Function

    <HttpGet("print-wrapper")>
    Public Function PrintUsingClientWrapper() As IActionResult
        Dim printUrl = Url.Action(NameOf(GetRawPrintablePdf))
        Dim html As New StringBuilder()
        html.AppendLine("<!DOCTYPE html><html lang=""en""><head><title>Print Document</title></head><body>")
        html.AppendLine($"<iframe src='{printUrl}' style='position:absolute;top:0;left:0;width:100%;height:100%;border:none;'></iframe>")
        html.AppendLine("<script>window.onload = function() { setTimeout(function() { window.print(); }, 100); };</script>")
        html.AppendLine("</body></html>")
        Return Content(html.ToString(), "text/html")
    End Function

    Private Shared Function GetInvoiceHtml() As String
        Return "
        <html><head><style>
            body { font-family: Arial, sans-serif; }
            .header { font-weight: bold; color: #1e40af; }
            @media print { .no-print { display: none; } }
        </style></head>
        <body>
            <div class='header'>Invoice Summary</div>
            <p>Total Amount: <b>$749.00</b></p>
        </body></html>"
    End Function
End Class
$vbLabelText   $csharpLabel

Plik PDF otwiera się w przeglądarce, gdzie użytkownik uruchamia drukowanie za pomocą standardowego okna dialogowego PRINT. Takie podejście zapewnia bezpieczeństwo dzięki politykom bezpieczeństwa treści i znakom wodnym, jednocześnie uwalniając zasoby serwera od zależności od sterowników drukarek.

W jaki sposób drukowanie po stronie klienta zapewnia bezpieczeństwo danych?

Microsoft Edge print dialog showing a PDF invoice preview with $749.00 total and various print settings on the right side

Jak pracujesz z wieloma źródłami danych wejściowych?

IronPDF obsługuje różne źródła danych wejściowych, zachowując jednocześnie suwerenność danych — co jest ważne dla programistów tworzących dynamiczne procesy drukowania w środowiskach Enterprise. Biblioteka obsługuje pliki HTML, adresy URL, ciągi znaków HTML oraz treści w formacie Markdown:

using IronPdf;
using Microsoft.AspNetCore.Mvc;

[ApiController]
[Route("[controller]")]
public class MultiSourcePrintController : ControllerBase
{
    [HttpPost("print-multi")]
    public async Task<IActionResult> PrintFromMultipleSources()
    {
        var renderer = new ChromePdfRenderer();
        renderer.RenderingOptions.EnableJavaScript = false;
        renderer.RenderingOptions.Timeout = 30;

        // From URL with authentication
        renderer.LoginCredentials = new ChromeHttpLoginCredentials
        {
            NetworkUsername = "serviceaccount",
            NetworkPassword = "securepassword"
        };
        var pdfFromUrl = await renderer.RenderUrlAsPdfAsync("https://reports.internal.example.com/report");

        // From HTML file template
        var pdfFromFile = renderer.RenderHtmlFileAsPdf(@"Templates\report.html");

        // From sanitized HTML string
        var pdfFromString = renderer.RenderHtmlAsPdf("<h2>Summary Report</h2><p>Generated on demand.</p>");

        pdfFromUrl.Print();

        return Ok(new
        {
            message = "PDF documents processed and printed.",
            sources = new[] { "URL", "File", "HTML string" },
            timestamp = DateTime.UtcNow
        });
    }
}
using IronPdf;
using Microsoft.AspNetCore.Mvc;

[ApiController]
[Route("[controller]")]
public class MultiSourcePrintController : ControllerBase
{
    [HttpPost("print-multi")]
    public async Task<IActionResult> PrintFromMultipleSources()
    {
        var renderer = new ChromePdfRenderer();
        renderer.RenderingOptions.EnableJavaScript = false;
        renderer.RenderingOptions.Timeout = 30;

        // From URL with authentication
        renderer.LoginCredentials = new ChromeHttpLoginCredentials
        {
            NetworkUsername = "serviceaccount",
            NetworkPassword = "securepassword"
        };
        var pdfFromUrl = await renderer.RenderUrlAsPdfAsync("https://reports.internal.example.com/report");

        // From HTML file template
        var pdfFromFile = renderer.RenderHtmlFileAsPdf(@"Templates\report.html");

        // From sanitized HTML string
        var pdfFromString = renderer.RenderHtmlAsPdf("<h2>Summary Report</h2><p>Generated on demand.</p>");

        pdfFromUrl.Print();

        return Ok(new
        {
            message = "PDF documents processed and printed.",
            sources = new[] { "URL", "File", "HTML string" },
            timestamp = DateTime.UtcNow
        });
    }
}
Imports IronPdf
Imports Microsoft.AspNetCore.Mvc

<ApiController>
<Route("[controller]")>
Public Class MultiSourcePrintController
    Inherits ControllerBase

    <HttpPost("print-multi")>
    Public Async Function PrintFromMultipleSources() As Task(Of IActionResult)
        Dim renderer As New ChromePdfRenderer()
        renderer.RenderingOptions.EnableJavaScript = False
        renderer.RenderingOptions.Timeout = 30

        ' From URL with authentication
        renderer.LoginCredentials = New ChromeHttpLoginCredentials With {
            .NetworkUsername = "serviceaccount",
            .NetworkPassword = "securepassword"
        }
        Dim pdfFromUrl = Await renderer.RenderUrlAsPdfAsync("https://reports.internal.example.com/report")

        ' From HTML file template
        Dim pdfFromFile = renderer.RenderHtmlFileAsPdf("Templates\report.html")

        ' From sanitized HTML string
        Dim pdfFromString = renderer.RenderHtmlAsPdf("<h2>Summary Report</h2><p>Generated on demand.</p>")

        pdfFromUrl.Print()

        Return Ok(New With {
            .message = "PDF documents processed and printed.",
            .sources = New String() {"URL", "File", "HTML string"},
            .timestamp = DateTime.UtcNow
        })
    End Function
End Class
$vbLabelText   $csharpLabel

Każda metoda zachowuje strukturę dokumentu i grafikę, jednocześnie zapewniając wysoką jakość wydruku. Implementacja obejmuje uwierzytelnianie, walidację danych wejściowych oraz obsługę szyfrowania. Jeśli chodzi o dodatkowe źródła danych wejściowych, IronPDF obsługuje pliki DOCX, dokumenty RTF oraz formaty obrazów — dzięki czemu jest wystarczająco elastyczny, aby służyć jako pojedynczy potok przetwarzania PDF w całej aplikacji.

Po przetworzeniu dokumentów PDF system Windows wyświetla to okno dialogowe zapisywania, umożliwiające użytkownikom zapisanie wydruku po potwierdzeniu, że dokumenty zostały wysłane do domyślnej drukarki

Jak wdraża się obsługę błędów i rejestrowanie?

Niezawodna obsługa błędów jest niezbędna w środowiskach produkcyjnych, w których obowiązują wymagania dotyczące rejestrowania zgodności. IronPDF zapewnia natywną obsługę wyjątków oraz przewodnik dotyczący rozwiązywania problemów, służący do diagnozowania błędów drukowania. Wzorzec identyfikatora korelacji ułatwia dopasowanie wpisów dziennika do konkretnych żądań PRINT podczas przeglądania historii audytu:

using IronPdf;
using System.Drawing.Printing;
using Microsoft.AspNetCore.Mvc;

[ApiController]
[Route("[controller]")]
public class SafePrintController : ControllerBase
{
    [HttpPost("safe-print")]
    public IActionResult SafePrint(string documentId)
    {
        var correlationId = Guid.NewGuid().ToString();

        try
        {
            var pdf = PdfDocument.FromFile(GetSecureFilePath(documentId));

            var availablePrinters = PrinterSettings.InstalledPrinters.Cast<string>().ToList();
            var targetPrinter = availablePrinters.FirstOrDefault();

            if (string.IsNullOrEmpty(targetPrinter))
            {
                return BadRequest(new
                {
                    error = "No printer available",
                    correlationId
                });
            }

            var printDoc = pdf.GetPrintDocument();
            printDoc.PrinterSettings.PrinterName = targetPrinter;
            printDoc.Print();

            return Ok(new
            {
                message = $"Document {documentId} printed successfully",
                printer = targetPrinter,
                correlationId,
                timestamp = DateTime.UtcNow
            });
        }
        catch (UnauthorizedAccessException)
        {
            return StatusCode(403, new { error = "Access denied", correlationId });
        }
        catch (Exception ex)
        {
            return StatusCode(500, new
            {
                error = "Printing failed",
                correlationId,
                message = "Contact support with the correlation ID"
            });
        }
    }

    private static string GetSecureFilePath(string documentId) =>
        Path.Combine(AppContext.BaseDirectory, "documents", documentId + ".pdf");
}
using IronPdf;
using System.Drawing.Printing;
using Microsoft.AspNetCore.Mvc;

[ApiController]
[Route("[controller]")]
public class SafePrintController : ControllerBase
{
    [HttpPost("safe-print")]
    public IActionResult SafePrint(string documentId)
    {
        var correlationId = Guid.NewGuid().ToString();

        try
        {
            var pdf = PdfDocument.FromFile(GetSecureFilePath(documentId));

            var availablePrinters = PrinterSettings.InstalledPrinters.Cast<string>().ToList();
            var targetPrinter = availablePrinters.FirstOrDefault();

            if (string.IsNullOrEmpty(targetPrinter))
            {
                return BadRequest(new
                {
                    error = "No printer available",
                    correlationId
                });
            }

            var printDoc = pdf.GetPrintDocument();
            printDoc.PrinterSettings.PrinterName = targetPrinter;
            printDoc.Print();

            return Ok(new
            {
                message = $"Document {documentId} printed successfully",
                printer = targetPrinter,
                correlationId,
                timestamp = DateTime.UtcNow
            });
        }
        catch (UnauthorizedAccessException)
        {
            return StatusCode(403, new { error = "Access denied", correlationId });
        }
        catch (Exception ex)
        {
            return StatusCode(500, new
            {
                error = "Printing failed",
                correlationId,
                message = "Contact support with the correlation ID"
            });
        }
    }

    private static string GetSecureFilePath(string documentId) =>
        Path.Combine(AppContext.BaseDirectory, "documents", documentId + ".pdf");
}
Imports IronPdf
Imports System.Drawing.Printing
Imports Microsoft.AspNetCore.Mvc

<ApiController>
<Route("[controller]")>
Public Class SafePrintController
    Inherits ControllerBase

    <HttpPost("safe-print")>
    Public Function SafePrint(documentId As String) As IActionResult
        Dim correlationId = Guid.NewGuid().ToString()

        Try
            Dim pdf = PdfDocument.FromFile(GetSecureFilePath(documentId))

            Dim availablePrinters = PrinterSettings.InstalledPrinters.Cast(Of String)().ToList()
            Dim targetPrinter = availablePrinters.FirstOrDefault()

            If String.IsNullOrEmpty(targetPrinter) Then
                Return BadRequest(New With {
                    .error = "No printer available",
                    .correlationId = correlationId
                })
            End If

            Dim printDoc = pdf.GetPrintDocument()
            printDoc.PrinterSettings.PrinterName = targetPrinter
            printDoc.Print()

            Return Ok(New With {
                .message = $"Document {documentId} printed successfully",
                .printer = targetPrinter,
                .correlationId = correlationId,
                .timestamp = DateTime.UtcNow
            })
        Catch ex As UnauthorizedAccessException
            Return StatusCode(403, New With {.error = "Access denied", .correlationId = correlationId})
        Catch ex As Exception
            Return StatusCode(500, New With {
                .error = "Printing failed",
                .correlationId = correlationId,
                .message = "Contact support with the correlation ID"
            })
        End Try
    End Function

    Private Shared Function GetSecureFilePath(documentId As String) As String
        Return Path.Combine(AppContext.BaseDirectory, "documents", documentId & ".pdf")
    End Function
End Class
$vbLabelText   $csharpLabel

Zapewnia to niezawodne drukowanie nawet wtedy, gdy zasoby systemowe są niedostępne. Identyfikatory korelacji umożliwiają śledzenie żądań w systemach rozproszonych oraz powiązanie wpisów dziennika z konkretnymi zadaniami drukowania w ścieżkach audytu. Strukturalne odpowiedzi o błędach pozwalają również klientowi wywołującemu podjąć odpowiednie działania — takie jak ponowna próba z drukarką rezerwową lub powiadomienie użytkownika.

Co się dzieje, gdy drukarki są niedostępne?

Jeśli drukarka określona w kodzie jest niedostępna, kod zwraca ustrukturyzowaną odpowiedź o błędzie:

Typowy komunikat o błędzie drukarki, który może pojawić się podczas próby drukowania dokumentów

Jak monitorować pomyślnie zakończone zadania drukowania?

Pomyślne wykonanie zadania drukowania zwraca komunikat potwierdzający zawierający szczegóły zadania:

Wiersz poleceń systemu Windows wyświetlający potwierdzenie pomyślnego wydruku pliku PDF znajdującego się w zagnieżdżonej strukturze folderów na pulpicie

Jakie zaawansowane opcje konfiguracyjne są dostępne?

Opcje renderowania IronPDF obsługują złożone scenariusze wymagane przez architektury Enterprise. Biblioteka udostępnia ustawienia optymalizacji wydajności i zarządzania pamięcią podczas generowania dokumentów o wysokiej jakości. Ustawienie DpiResolution na 300 zapewnia wydruk o jakości odpowiedniej dla dokumentów fizycznych, natomiast opcja CssMediaType.Print aktywuje wszelkie reguły CSS specyficzne dla drukowania w źródłowym kodzie HTML:

using IronPdf;
using Microsoft.AspNetCore.Mvc;

[ApiController]
[Route("[controller]")]
public class AdvancedPrintController : ControllerBase
{
    [HttpGet("advanced")]
    public IActionResult ConfigureAdvancedPrinting()
    {
        var renderer = new ChromePdfRenderer();
        renderer.RenderingOptions.PaperSize = PdfPaperSize.A4;
        renderer.RenderingOptions.EnableJavaScript = false;
        renderer.RenderingOptions.RenderDelay = 500;
        renderer.RenderingOptions.Timeout = 60;
        renderer.RenderingOptions.CssMediaType = PdfCssMediaType.Print;
        renderer.RenderingOptions.PrintHtmlBackgrounds = true;
        renderer.RenderingOptions.DpiResolution = 300;

        var pdf = renderer.RenderHtmlAsPdf(GetEnterpriseHtml());

        pdf.SecuritySettings.AllowUserPrinting = true;
        pdf.SecuritySettings.AllowUserEditing = false;
        pdf.SecuritySettings.OwnerPassword = Guid.NewGuid().ToString();

        pdf.MetaData.Author = "Enterprise Document System";
        pdf.MetaData.Subject = "Compliance Document";
        pdf.MetaData.Keywords = "enterprise,secure,compliant";
        pdf.MetaData.CreationDate = DateTime.UtcNow;

        // Apply digital signature for document integrity
        // pdf.SignWithFile("/path/to/certificate.pfx", "certificatePassword");

        return File(pdf.BinaryData, "application/pdf");
    }

    private static string GetEnterpriseHtml() => @"
        <!DOCTYPE html><html><head>
        <style>@page { size: A4; margin: 1cm; } body { font-family: Arial, sans-serif; }</style>
        </head><body>
        <h1>Enterprise Document</h1>
        <p>CONFIDENTIAL -- INTERNAL USE ONLY</p>
        </body></html>";
}
using IronPdf;
using Microsoft.AspNetCore.Mvc;

[ApiController]
[Route("[controller]")]
public class AdvancedPrintController : ControllerBase
{
    [HttpGet("advanced")]
    public IActionResult ConfigureAdvancedPrinting()
    {
        var renderer = new ChromePdfRenderer();
        renderer.RenderingOptions.PaperSize = PdfPaperSize.A4;
        renderer.RenderingOptions.EnableJavaScript = false;
        renderer.RenderingOptions.RenderDelay = 500;
        renderer.RenderingOptions.Timeout = 60;
        renderer.RenderingOptions.CssMediaType = PdfCssMediaType.Print;
        renderer.RenderingOptions.PrintHtmlBackgrounds = true;
        renderer.RenderingOptions.DpiResolution = 300;

        var pdf = renderer.RenderHtmlAsPdf(GetEnterpriseHtml());

        pdf.SecuritySettings.AllowUserPrinting = true;
        pdf.SecuritySettings.AllowUserEditing = false;
        pdf.SecuritySettings.OwnerPassword = Guid.NewGuid().ToString();

        pdf.MetaData.Author = "Enterprise Document System";
        pdf.MetaData.Subject = "Compliance Document";
        pdf.MetaData.Keywords = "enterprise,secure,compliant";
        pdf.MetaData.CreationDate = DateTime.UtcNow;

        // Apply digital signature for document integrity
        // pdf.SignWithFile("/path/to/certificate.pfx", "certificatePassword");

        return File(pdf.BinaryData, "application/pdf");
    }

    private static string GetEnterpriseHtml() => @"
        <!DOCTYPE html><html><head>
        <style>@page { size: A4; margin: 1cm; } body { font-family: Arial, sans-serif; }</style>
        </head><body>
        <h1>Enterprise Document</h1>
        <p>CONFIDENTIAL -- INTERNAL USE ONLY</p>
        </body></html>";
}
Imports IronPdf
Imports Microsoft.AspNetCore.Mvc

<ApiController>
<Route("[controller]")>
Public Class AdvancedPrintController
    Inherits ControllerBase

    <HttpGet("advanced")>
    Public Function ConfigureAdvancedPrinting() As IActionResult
        Dim renderer As New ChromePdfRenderer()
        renderer.RenderingOptions.PaperSize = PdfPaperSize.A4
        renderer.RenderingOptions.EnableJavaScript = False
        renderer.RenderingOptions.RenderDelay = 500
        renderer.RenderingOptions.Timeout = 60
        renderer.RenderingOptions.CssMediaType = PdfCssMediaType.Print
        renderer.RenderingOptions.PrintHtmlBackgrounds = True
        renderer.RenderingOptions.DpiResolution = 300

        Dim pdf = renderer.RenderHtmlAsPdf(GetEnterpriseHtml())

        pdf.SecuritySettings.AllowUserPrinting = True
        pdf.SecuritySettings.AllowUserEditing = False
        pdf.SecuritySettings.OwnerPassword = Guid.NewGuid().ToString()

        pdf.MetaData.Author = "Enterprise Document System"
        pdf.MetaData.Subject = "Compliance Document"
        pdf.MetaData.Keywords = "enterprise,secure,compliant"
        pdf.MetaData.CreationDate = DateTime.UtcNow

        ' Apply digital signature for document integrity
        ' pdf.SignWithFile("/path/to/certificate.pfx", "certificatePassword")

        Return File(pdf.BinaryData, "application/pdf")
    End Function

    Private Shared Function GetEnterpriseHtml() As String
        Return "
        <!DOCTYPE html><html><head>
        <style>@page { size: A4; margin: 1cm; } body { font-family: Arial, sans-serif; }</style>
        </head><body>
        <h1>Enterprise Document</h1>
        <p>CONFIDENTIAL -- INTERNAL USE ONLY</p>
        </body></html>"
    End Function
End Class
$vbLabelText   $csharpLabel

Po wygenerowaniu dokumentu z zastosowaniem wszystkich konfiguracji zabezpieczeń wywołanie pdf.Print() powoduje wysłanie dokumentu do drukarki. Takie podejście zapewnia zgodność z korporacyjnymi standardami bezpieczeństwa, jednocześnie zachowując integralność dokumentów dzięki podpisom cyfrowym i szyfrowaniu. W celu długoterminowej archiwizacji warto rozważyć zgodność z formatem PDF/A — standardem zaprojektowanym specjalnie dla dokumentów, które muszą pozostać czytelne i możliwe do odtworzenia przez dziesięciolecia.

Czym różni się drukowanie po stronie serwera od drukowania po stronie klienta?

Wybór między drukowaniem po stronie serwera a drukowaniem po stronie klienta zależy od konkretnego przypadku użycia. Poniższa tabela podsumowuje kluczowe kompromisy:

Drukowanie plików PDF po stronie serwera a drukowanie po stronie klienta w ASP.NET
Aspekt Drukowanie po stronie serwera Drukowanie po stronie klienta
Dostęp do drukarki Drukarki sieciowe i lokalne na serwerze Drukarki użytkownika podłączone lokalnie
Interakcja z użytkownikiem Brak — w pełni zautomatyzowane Pojawia się okno dialogowe drukowania przeglądarki
Rejestrowanie zgodności Pełna ścieżka audytu po stronie serwera Tylko log konsoli po stronie klienta
Kontrola bezpieczeństwa Serwer egzekwuje wszystkie ograniczenia Przeglądarka egzekwuje zasady bezpieczeństwa treści
Najlepsze dla Zadania wsadowe, faktury, branże regulowane Drukowanie na żądanie uruchamiane przez użytkownika

W branżach podlegających regulacjom, wymagających udokumentowanych ścieżek audytu, preferowanym rozwiązaniem jest drukowanie po stronie serwera. Drukowanie po stronie klienta sprawdza się w sytuacjach, w których użytkownicy końcowi potrzebują kontroli nad miejscem docelowym wydruku.

Dlaczego warto wybrać IronPDF do drukowania plików PDF w ASP.NET?

IronPDF zmienia drukowanie plików PDF w ASP.NET ze skomplikowanego wyzwania w prostą implementację, zachowując jednocześnie standardy bezpieczeństwa korporacyjnego. Bez konieczności korzystania z programu Adobe Reader lub zewnętrznych zależności biblioteka generuje i drukuje pliki PDF przy użyciu minimalnej ilości kodu, zapewniając jednocześnie zgodność z SOC2, HIPAA i przepisami branżowymi.

Kompletny interfejs API obsługuje różne formaty wejściowe, funkcje edycji, zabezpieczenia oraz narzędzia organizacyjne do kompleksowego zarządzania plikami PDF. Obszerne samouczki, przykłady kodu i zasoby dotyczące rozwiązywania problemów zawarte w bibliotece zapewniają płynną integrację z istniejącą infrastrukturą.

W przypadku wymagań dotyczących drukowania wykraczających poza generowanie plików PDF — takich jak bezpośrednie drukowanie obrazów lub plików Office — firma Iron Software oferuje również IronPrint, dedykowaną bibliotekę drukowania .NET. W przeciwieństwie do IronPDF, który koncentruje się na generowaniu i manipulowaniu treścią plików PDF, IronPrint specjalizuje się w bezpośrednim drukowaniu plików bez pośredniej konwersji. Zgodnie z dokumentacją Microsoftu dotyczącą ASP.NET operacje drukowania po stronie serwera podlegają ograniczeniom tożsamości puli aplikacji IIS, co sprawia, że podejście oparte na bibliotece jest właściwym wyborem architektonicznym dla każdego wdrożenia produkcyjnego.

Zacznij już dziś od bezpłatnej wersji próbnej i przekonaj się, jak IronPDF upraszcza przetwarzanie dokumentów w aplikacjach ASP.NET. Dzięki kompletnej dokumentacji, bezpośredniemu wsparciu technicznemu i sprawdzonym certyfikatom zgodności, gotowe do produkcji drukowanie plików PDF może ruszyć w ciągu kilku minut. Więcej informacji można znaleźć w przewodniku Iron Software dotyczącym bezpieczeństwa dokumentów PDF oraz w specyfikacji dostępności PDF opracowanej przez W3C.

Często Zadawane Pytania

Jak mogę wydrukować plik PDF bezpośrednio z aplikacji ASP.NET?

Za pomocą IronPDF można drukować pliki PDF bezpośrednio z aplikacji ASP.NET, konwertując pliki HTML do formatu PDF, a następnie wysyłając je do drukarki. IronPDF upraszcza ten proces dzięki wbudowanym metodom.

Jakie są zalety korzystania z IronPDF do drukowania plików PDF w ASP.NET?

IronPDF oferuje szereg korzyści związanych z drukowaniem plików PDF w ASP.NET, w tym łatwą integrację, wysoką jakość renderowania oraz możliwość precyzyjnej konwersji treści HTML do formatu PDF.

Czy można dostosować plik PDF przed wydrukowaniem za pomocą IronPDF?

Tak, IronPDF pozwala dostosować pliki PDF przed wydrukowaniem poprzez dodanie nagłówków, stopek i znaków wodnych, a także ustawienie rozmiarów stron i marginesów.

Czy IronPDF obsługuje duże pliki PDF do drukowania?

IronPDF potrafi sprawnie obsługiwać duże pliki PDF, zapewniając dokładne i szybkie drukowanie nawet złożonych dokumentów z poziomu aplikacji ASP.NET.

Czy IronPDF obsługuje różne ustawienia drukarki do drukowania plików PDF?

IronPDF obsługuje różne ustawienia drukarki, umożliwiając określenie rozmiaru papieru, orientacji i jakości druku zgodnie z potrzebami.

Czy istnieje sposób na podgląd plików PDF przed wydrukowaniem w ASP.NET?

Dzięki IronPDF możesz wygenerować i wyświetlić podgląd pliku PDF w swojej aplikacji ASP.NET, umożliwiając użytkownikom przejrzenie dokumentu przed wydaniem polecenia drukowania.

Jakie formaty IronPDF może konwertować do formatu PDF w celu wydruku?

IronPDF może konwertować szeroki zakres formatów do formatu PDF w celu wydruku, w tym HTML, ASPX i pliki graficzne, dzięki czemu jest wszechstronnym narzędziem dostosowanym do różnych potrzeb aplikacji.

W jaki sposób IronPDF zapewnia jakość drukowanych dokumentów PDF?

IronPDF wykorzystuje zaawansowaną technologię renderowania, aby zapewnić, że drukowane dokumenty PDF zachowują wysoką wierność w stosunku do oryginalnej treści, z ostrym tekstem i wyraźnymi obrazami.

Czy IronPDF może być używany do drukowania plików PDF zaszyfrowanych lub chronionych hasłem?

Tak, IronPDF obsługuje pliki PDF zaszyfrowane lub chronione hasłem, umożliwiając ich bezpieczne drukowanie poprzez podanie niezbędnych danych uwierzytelniających w aplikacji ASP.NET.

Jak łatwo jest zintegrować IronPDF z istniejącą aplikacją ASP.NET?

Włączenie IronPDF do istniejącej aplikacji ASP.NET jest proste dzięki obszernej dokumentacji i obsłudze różnych środowisk programistycznych.

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