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
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
Lub za pomocą interfejsu CLI platformy .NET:
dotnet add package IronPdf
dotnet add package IronPdf
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"
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
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?

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
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?

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

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
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?

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
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.

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
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:

Jak monitorować pomyślnie zakończone zadania drukowania?
Pomyślne wykonanie zadania drukowania zwraca komunikat potwierdzający zawierający szczegóły zadania:

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
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:
| 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.




