跳過到頁腳內容
使用IRONPDF

如何在 ASP.NET 中以編程方式打印 PDF 文件

ASP .NET 列印 PDF 文件的任務通常涉及開發人員經常遇到的獨特挑戰。 無論您是為發票、報告還是裝運標籤生成 PDF 文件,實現可靠的列印功能需要導航伺服器-客戶端架構的複雜性。

In this article, we'll show you how to handle PDF printing tasks using IronPDF's powerful PDF library for .NET.

理解挑戰

傳統的桌面應用程式可以直接訪問默認印表機,但 ASP.NET Core 應用程式在列印 PDF 文件時面臨多個障礙:

// 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
IRON VB CONVERTER ERROR developers@ironsoftware.com
$vbLabelText   $csharpLabel

上面的代碼展示了一個常見的錯誤。 伺服器環境缺乏直接印表機訪問,系統因 IIS 權限限制而拋出錯誤。 另一件需要記住的是,Web 應用程式必須有效地處理伺服器端和客戶端列印場景。

開始使用 IronPDF

IronPDF為生成 PDF 文件和列印它們提供了一個完整的 .NET 核心解決方案,無需像 Adobe Reader 這樣的外部依賴。 讓我們使用 NuGet 安裝 IronPDF 包:

Install-Package IronPdf

此 .NET 庫可在操作系統之間無縫工作,消除了困擾其他庫的兼容性問題。 這個工具在 Microsoft Windows 和其他操作系統環境中運行良好。

使用默認印表機在伺服器端創建和列印 PDF 文檔

這是如何從 HTML 標記生成並從您的 ASP.NET 控制器列印 PDF 文件的方法:

using IronPdf;
using Microsoft.AspNetCore.Mvc;
using System.Drawing; 
public class PdfController : Controller
{
    public IActionResult Index()
    {
        // Initialize the renderer
        var renderer = new ChromePdfRenderer();
        // Configure print-optimized settings
        renderer.RenderingOptions.PrintHtmlBackgrounds = true;
        renderer.RenderingOptions.MarginBottom = 10;
        renderer.RenderingOptions.CssMediaType = PdfCssMediaType.Print;
        // Generate PDF from HTML
        var pdf = renderer.RenderHtmlAsPdf("<h1>Invoice</h1><p>Total: $749</p>");
        // Print to default printer
        pdf.Print();
        return Ok("Document sent to printer");
    }
}
using IronPdf;
using Microsoft.AspNetCore.Mvc;
using System.Drawing; 
public class PdfController : Controller
{
    public IActionResult Index()
    {
        // Initialize the renderer
        var renderer = new ChromePdfRenderer();
        // Configure print-optimized settings
        renderer.RenderingOptions.PrintHtmlBackgrounds = true;
        renderer.RenderingOptions.MarginBottom = 10;
        renderer.RenderingOptions.CssMediaType = PdfCssMediaType.Print;
        // Generate PDF from HTML
        var pdf = renderer.RenderHtmlAsPdf("<h1>Invoice</h1><p>Total: $749</p>");
        // Print to default printer
        pdf.Print();
        return Ok("Document sent to printer");
    }
}
IRON VB CONVERTER ERROR developers@ironsoftware.com
$vbLabelText   $csharpLabel

ChromePdfRenderer 在轉換時保留了 CSS 樣式和字體大小格式。 此示例顯示了不需要用戶干預的默認印表機的基本列印。

輸出

網絡印表機配置

針對需要特定印表機路由的企業環境:

public IActionResult PrintToNetworkPrinter(string filePath)
{
    // Load existing PDF file
    var pdfDocument = PdfDocument.FromFile(filePath);
    // Get print document for advanced settings
    var printDocument = pdfDocument.GetPrintDocument();
    // Specify network printer
    printDocument.PrinterSettings.PrinterName = @"\\server\printer";
    printDocument.PrinterSettings.Copies = 2;
    // Configure page settings
    printDocument.DefaultPageSettings.Landscape = false;
    var renderer = printDocument.PrinterSettings.PrinterResolution;
    // Execute print
    printDocument.Print();
    return Json(new { success = true });
}
public IActionResult PrintToNetworkPrinter(string filePath)
{
    // Load existing PDF file
    var pdfDocument = PdfDocument.FromFile(filePath);
    // Get print document for advanced settings
    var printDocument = pdfDocument.GetPrintDocument();
    // Specify network printer
    printDocument.PrinterSettings.PrinterName = @"\\server\printer";
    printDocument.PrinterSettings.Copies = 2;
    // Configure page settings
    printDocument.DefaultPageSettings.Landscape = false;
    var renderer = printDocument.PrinterSettings.PrinterResolution;
    // Execute print
    printDocument.Print();
    return Json(new { success = true });
}
IRON VB CONVERTER ERROR developers@ironsoftware.com
$vbLabelText   $csharpLabel

這種方法提供了對印表機設置的完全控制,包括紙張格式和分辨率,這對於正確的圖形和布局至關重要。

輸出

如何以程式化方式在 ASP.NET 中列印 PDF 文件:圖 2 - 使用網絡列印列印 PDFs

列印確認

如何以程式化方式在 ASP.NET 中列印 PDF 文件:圖 3 - PDF 列印任務成功消息

客戶端列印策略

由於瀏覽器限制直接訪问印表機,通过提供 PDF 文件下载来实现客户端列印:

public IActionResult GetRawPrintablePdf()
    {
        var renderer = new ChromePdfRenderer();
        var pdf = renderer.RenderHtmlAsPdf(GetInvoiceHtml());
        // This header tells the browser to display the file inline.
        // We use IHeaderDictionary indexer to prevent ArgumentException.
        **HttpContext context**.Response.Headers["Content-Disposition"] = "inline; filename=invoice.pdf";
        return File(pdf.BinaryData, "application/pdf");
    }
    public IActionResult PrintUsingClientWrapper()
    {
        var printUrl = Url.Action(nameof(GetRawPrintablePdf));
        // Use a simple HTML/JavaScript wrapper to force the print dialog
        var html = new StringBuilder();
        html.AppendLine("<!DOCTYPE html>");
        html.AppendLine("<html lang=\"en\">");
        html.AppendLine("<head>");
        html.AppendLine("    <title>Print Document</title>");
        html.AppendLine("</head>");
        html.AppendLine("<body>");
        // Load the PDF from the 'GetRawPrintablePdf' action into an invisible iframe.
        html.AppendLine($"    <iframe src='{printUrl}' style='position:absolute; top:0; left:0; width:100%; height:100%; border:none;'></iframe>");
        html.AppendLine("    <script>");
        // Wait for the iframe (and thus the PDF) to load, then trigger the print dialog.
        html.AppendLine("        window.onload = function() {");
        html.AppendLine("            // Wait briefly to ensure the iframe content is rendered before printing.");
        html.AppendLine("            setTimeout(function() {");
        html.AppendLine("                window.print();");
        html.AppendLine("            }, 100);");
        html.AppendLine("        };");
        html.AppendLine("    </script>");
        html.AppendLine("</body>");
        html.AppendLine("</html>");
        return Content(html.ToString(), "text/html");
    }
    private string GetInvoiceHtml()
    {
        // Build HTML with proper structure
        return @"
        <html>
        <head>
            <style>
                body { font-family: Arial, sans-serif; }
                .header { font-weight: bold; color: #1e40af; border-bottom: 2px solid #3b82f6; padding-bottom: 5px; }
                .content { padding-top: 10px; }
            </style>
        </head>
        <body>
            <div class='header'>Invoice Summary (Client View)</div>
            <div class='content'>
                <p>Document content: This file is optimized for printing.</p>
                <p>Total Amount: <b>$749.00</b></p>
            </div>
        </body>
        </html>";
    }
public IActionResult GetRawPrintablePdf()
    {
        var renderer = new ChromePdfRenderer();
        var pdf = renderer.RenderHtmlAsPdf(GetInvoiceHtml());
        // This header tells the browser to display the file inline.
        // We use IHeaderDictionary indexer to prevent ArgumentException.
        **HttpContext context**.Response.Headers["Content-Disposition"] = "inline; filename=invoice.pdf";
        return File(pdf.BinaryData, "application/pdf");
    }
    public IActionResult PrintUsingClientWrapper()
    {
        var printUrl = Url.Action(nameof(GetRawPrintablePdf));
        // Use a simple HTML/JavaScript wrapper to force the print dialog
        var html = new StringBuilder();
        html.AppendLine("<!DOCTYPE html>");
        html.AppendLine("<html lang=\"en\">");
        html.AppendLine("<head>");
        html.AppendLine("    <title>Print Document</title>");
        html.AppendLine("</head>");
        html.AppendLine("<body>");
        // Load the PDF from the 'GetRawPrintablePdf' action into an invisible iframe.
        html.AppendLine($"    <iframe src='{printUrl}' style='position:absolute; top:0; left:0; width:100%; height:100%; border:none;'></iframe>");
        html.AppendLine("    <script>");
        // Wait for the iframe (and thus the PDF) to load, then trigger the print dialog.
        html.AppendLine("        window.onload = function() {");
        html.AppendLine("            // Wait briefly to ensure the iframe content is rendered before printing.");
        html.AppendLine("            setTimeout(function() {");
        html.AppendLine("                window.print();");
        html.AppendLine("            }, 100);");
        html.AppendLine("        };");
        html.AppendLine("    </script>");
        html.AppendLine("</body>");
        html.AppendLine("</html>");
        return Content(html.ToString(), "text/html");
    }
    private string GetInvoiceHtml()
    {
        // Build HTML with proper structure
        return @"
        <html>
        <head>
            <style>
                body { font-family: Arial, sans-serif; }
                .header { font-weight: bold; color: #1e40af; border-bottom: 2px solid #3b82f6; padding-bottom: 5px; }
                .content { padding-top: 10px; }
            </style>
        </head>
        <body>
            <div class='header'>Invoice Summary (Client View)</div>
            <div class='content'>
                <p>Document content: This file is optimized for printing.</p>
                <p>Total Amount: <b>$749.00</b></p>
            </div>
        </body>
        </html>";
    }
IRON VB CONVERTER ERROR developers@ironsoftware.com
$vbLabelText   $csharpLabel

PDF 文件在瀏覽器中打開,用户可以通过标准的浏览器列印对话框用其默认印表機启动列印。 这种方法优于发起直接的服务器端列印请求。

輸出

如何以程式化方式在 ASP.NET 中列印 PDF 文件:图 4 - 客户端列印对话框

处理各种源代码输入

IronPDF 灵活处理各种源代码输入,对想创建动态列印代码的开发人员来说非常重要:

public async Task<IActionResult> PrintFromMultipleSources()
{
    var renderer = new ChromePdfRenderer();
    // From URL
    var pdfFromUrl = await renderer.RenderUrlAsPdfAsync("https://example.com");
    // From HTML file path
    var pdfFromFile = renderer.RenderHtmlFileAsPdf(@"Templates\report.html");
    var pdfToStream = renderer.RenderHtmlAsPdf("<h2>PDF from Memory Stream</h2><p>This content was loaded into memory first.</p>");
// Now, write the valid PDF bytes to the stream
using (var stream = new MemoryStream(pdfToStream.BinaryData))
{
    var pdfFromStream = new PdfDocument(stream);
    // Example: Print the PDF loaded from the stream
    // pdfFromStream.Print(); 
}
pdfFromUrl.Print();
// Logging the various files handled
    var fileList = new List<string> { "URL", "File Path", "Memory Stream" };
return Ok("PDF documents processed and 'example.com' printed to default server printer.");
}
public async Task<IActionResult> PrintFromMultipleSources()
{
    var renderer = new ChromePdfRenderer();
    // From URL
    var pdfFromUrl = await renderer.RenderUrlAsPdfAsync("https://example.com");
    // From HTML file path
    var pdfFromFile = renderer.RenderHtmlFileAsPdf(@"Templates\report.html");
    var pdfToStream = renderer.RenderHtmlAsPdf("<h2>PDF from Memory Stream</h2><p>This content was loaded into memory first.</p>");
// Now, write the valid PDF bytes to the stream
using (var stream = new MemoryStream(pdfToStream.BinaryData))
{
    var pdfFromStream = new PdfDocument(stream);
    // Example: Print the PDF loaded from the stream
    // pdfFromStream.Print(); 
}
pdfFromUrl.Print();
// Logging the various files handled
    var fileList = new List<string> { "URL", "File Path", "Memory Stream" };
return Ok("PDF documents processed and 'example.com' printed to default server printer.");
}
IRON VB CONVERTER ERROR developers@ironsoftware.com
$vbLabelText   $csharpLabel

上面的行展示了如何创建新的文件源处理列表。 每个方法都会在保持列印质量的同时保存文档结构和图形。

如何以程式化方式在 ASP.NET 中列印 PDF 文件:图 5

错误处理和日志

实施可靠的错误处理以适应生产环境:

using System.Drawing.Printing; // For PrinterSettings
// ... other usings ...
public IActionResult SafePrint(string documentId)
{
    try
    {
        var pdf = LoadPdfDocument(documentId);
        // Verify printer availability
        if (!PrinterSettings.InstalledPrinters.Cast<string>()
            .Contains("Target Printer"))
        {
            // Log error and handle gracefully
            return BadRequest("Printer not available");
        }
        pdf.Print();
        // Log successful output
        return Ok($"Document {documentId} printed successfully");
    }
    catch (Exception ex)
    {
        // Log error details
        return StatusCode(500, "Printing failed");
    }
}
using System.Drawing.Printing; // For PrinterSettings
// ... other usings ...
public IActionResult SafePrint(string documentId)
{
    try
    {
        var pdf = LoadPdfDocument(documentId);
        // Verify printer availability
        if (!PrinterSettings.InstalledPrinters.Cast<string>()
            .Contains("Target Printer"))
        {
            // Log error and handle gracefully
            return BadRequest("Printer not available");
        }
        pdf.Print();
        // Log successful output
        return Ok($"Document {documentId} printed successfully");
    }
    catch (Exception ex)
    {
        // Log error details
        return StatusCode(500, "Printing failed");
    }
}
IRON VB CONVERTER ERROR developers@ironsoftware.com
$vbLabelText   $csharpLabel

这能确保即使在系统资源不可用时也能可靠打印,是打印服务的关键部分。

輸出 Scenarios

印表機不可用

如果代码中指定的打印机不可用,代码将提供此错误消息:

如何以程式化方式在 ASP.NET 中列印 PDF 文件:图 6 - 打印机不可用错误

PDF 成功打印

如果您的 PDF 已成功列印,您應該會看到如下確認信息:

如何以程式化方式在 ASP.NET 中列印 PDF 文件:图 7 - PDF 列印成功消息

高级配置

IronPDF的文件夾結構支持複雜場景。 您所使用的 IronPDF 庫版本可能會影響這些設置:

public IActionResult ConfigureAdvancedPrinting(object sender, EventArgs e)
{
    var renderer = new ChromePdfRenderer();
    // Configure rendering options
    renderer.RenderingOptions.PaperSize = PdfPaperSize.A4;
    renderer.RenderingOptions.EnableJavaScript = true;
    renderer.RenderingOptions.RenderDelay = 500; // Wait for dynamic content
    // Generate complex PDF documents
    var pdf = renderer.RenderHtmlAsPdf(GetDynamicContent());
    // Apply security settings
    pdf.SecuritySettings.AllowUserPrinting = true;
    pdf.MetaData.Author = "Your Company";
    return File(pdf.BinaryData, "application/pdf");
}
public IActionResult ConfigureAdvancedPrinting(object sender, EventArgs e)
{
    var renderer = new ChromePdfRenderer();
    // Configure rendering options
    renderer.RenderingOptions.PaperSize = PdfPaperSize.A4;
    renderer.RenderingOptions.EnableJavaScript = true;
    renderer.RenderingOptions.RenderDelay = 500; // Wait for dynamic content
    // Generate complex PDF documents
    var pdf = renderer.RenderHtmlAsPdf(GetDynamicContent());
    // Apply security settings
    pdf.SecuritySettings.AllowUserPrinting = true;
    pdf.MetaData.Author = "Your Company";
    return File(pdf.BinaryData, "application/pdf");
}
IRON VB CONVERTER ERROR developers@ironsoftware.com
$vbLabelText   $csharpLabel

生成文檔後,打印的命令很簡單,就是 pdf.Print()。

IronPrint 替代方案

對於專門的打印需求,Iron Software 還提供了 IronPrint,一個具有增強跨平台支持的專用 .NET 列印庫。 您可以在其網站上找到更多信息的鏈接。主要參數僅僅是文件路徑。 產品描述可在他們的網站找到。

結論

IronPDF 將 ASP.NET PDF 列印從一個複雜的挑戰轉變為直接的實施。 無需要求 Adobe Reader 或外部依賴,您可以以最少的代碼生成和列印 PDF 文件。 該 PDF 庫從 HTML 轉換到印表機配置進行處理,這使其成為伺服器端自動化和客戶端列印場景的理想選擇。

準備好簡化您的 PDF 列印工作流程了嗎? 立即開始免費使用免費試用,體驗 IronPDF 如何簡化您的 ASP.NET 應用程式中的文档處理。 通过全面的文档和直接的工程支持,您可以在几分钟内运行生产就绪的 PDF 列印。

常見問題解答

如何在 ASP.NET 中列印 PDF 文件?

您可以使用 IronPDF 在 ASP.NET 中列印 PDF 文件,它透過其全面的 API 簡化了列印過程,實現了輕鬆整合和可靠的列印功能。

在 ASP.NET 應用程式中列印 PDF 時,常見的挑戰有哪些?

常見的挑戰包括管理複雜的伺服器-客戶端架構以及產生一致的列印輸出。 IronPDF 透過旨在實現無縫整合和可靠結果的功能來應對這些挑戰。

IronPDF 能否用於產生特定用途的 PDF 文檔,例如發票或報告?

是的,IronPDF 可用於產生各種用途的 PDF 文件,包括發票、報告和運送標籤,為開發人員提供了一個多功能的文件產生工具。

IronPDF 提供了哪些功能來支援 ASP.NET 中的 PDF 列印?

IronPDF 提供 HTML 轉 PDF、CSS 樣式和 JavaScript 支援等功能,所有這些都有助於在 ASP.NET 應用程式中有效地列印 PDF。

是否可以使用 IronPDF 在 ASP.NET 中實現 PDF 自動列印?

是的,IronPDF 允許在 ASP.NET 應用程式中自動列印 PDF 文件,使開發人員能夠簡化工作流程並提高生產力。

IronPDF 如何處理伺服器-客戶端架構的複雜度?

IronPDF 旨在透過提供強大的 API 來處理伺服器-客戶端架構的複雜性,從而簡化直接從伺服器端產生和列印 PDF 的過程。

IronPDF是否支援在列印前對PDF文件進行自訂?

IronPDF 支援對 PDF 文件進行廣泛的自訂選項,讓開發人員在列印前控制佈局、內容和設計。

IronPDF支援哪些程式語言進行PDF列印?

IronPDF 與 C# 和其他 .NET 語言相容,是 ASP.NET 框架內開發人員的理想選擇。

IronPDF 能否與其他 .NET 應用程式整合?

是的,IronPDF 可以輕鬆與其他 .NET 應用程式集成,從而可以無縫添加到現有系統中,並增強 PDF 管理功能。

IronPDF 如何確保不同裝置上列印輸出的一致性?

IronPDF 支援高保真渲染和將 HTML、CSS 和 JavaScript 精確轉換為 PDF,從而確保列印輸出的一致性,無論使用何種列印裝置。

IronPDF 是否相容於 .NET 10?升級到 .NET 10 能帶來哪些好處?

是的,IronPDF 完全相容於 .NET 10,包括 Windows、Linux、macOS 和容器化環境的 .NET 10 專案。升級至 .NET 10 可解鎖諸多改進,例如降低記憶體佔用、提升效能、使用新的 C# 語言特性,以及 ASP.NET Core 10 中可簡化 PDF 產生和整合的增強功能。

Curtis Chau
技術作家

Curtis Chau 擁有卡爾頓大學計算機科學學士學位,專注於前端開發,擅長於 Node.js、TypeScript、JavaScript 和 React。Curtis 熱衷於創建直觀且美觀的用戶界面,喜歡使用現代框架並打造結構良好、視覺吸引人的手冊。

除了開發之外,Curtis 對物聯網 (IoT) 有著濃厚的興趣,探索將硬體和軟體結合的創新方式。在閒暇時間,他喜愛遊戲並構建 Discord 機器人,結合科技與創意的樂趣。