You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

.NET 8下C#程序打印网络打印机报错‘访问打印机设置无效’求助

解决.NET 8下C#打印PDF到网络打印机的"访问打印机设置无效"问题

核心问题分析

你当前的代码存在两个关键问题:

  1. PrintDocument无法直接打印PDF:这个类的设计目标是通过GDI+绘制内容(比如文本、图形)后打印,不支持直接加载并打印PDF文件。
  2. 打印机配置错误:设置PrintToFile = true会让输出转向本地文件,而非实际打印机,和你要打印到网络打印机的需求冲突;同时如果打印机名称格式不正确,也会触发权限/设置无效的报错。

解决方案

1. 修正打印机基础配置

  • 网络打印机的名称格式必须是\\打印机服务器IP或主机名\打印机共享名,比如\\192.168.1.100\OfficePrinter
  • 若要使用系统默认打印机,无需手动指定名称,可通过以下代码获取:
var printerSettings = new PrinterSettings();
// 获取默认打印机
printerSettings.PrinterName = PrinterSettings.InstalledPrinters
    .Cast<string>()
    .FirstOrDefault(p => new PrinterSettings { PrinterName = p }.IsDefaultPrinter);
  • 移除PrintToFile = true和PrintFileName配置,这两个是用于将打印内容保存为文件的选项,不适合直接打印到物理打印机。

2. 正确打印PDF的实现方式

因为PrintDocument不支持PDF,推荐使用PdfiumViewer(轻量开源的PDF渲染库)来完成PDF打印,步骤如下:

步骤1:安装NuGet包

在项目中安装PdfiumViewer:

Install-Package PdfiumViewer

步骤2:完整打印代码示例

using PdfiumViewer;
using System.Drawing.Printing;
using System.Linq;

static void Main()
{
    string pdfFilePath = @"C:\AREA PDFS\new-ocr.pdf";
    // 替换为你的网络打印机名称,或使用默认打印机
    string printerName = @"\\192.168.1.100\OfficePrinter";

    // 验证打印机是否存在
    if (!PrinterSettings.InstalledPrinters.Cast<string>().Contains(printerName))
    {
        Console.WriteLine("指定的打印机不存在");
        return;
    }

    // 加载PDF文档
    using (var document = PdfDocument.Load(pdfFilePath))
    using (var printDocument = document.CreatePrintDocument())
    {
        // 设置打印机
        printDocument.PrinterSettings.PrinterName = printerName;
        // 使用打印机默认设置,无需手动配置额外参数
        printDocument.DefaultPageSettings.Margins = new Margins(0, 0, 0, 0);

        try
        {
            printDocument.Print();
            Console.WriteLine("PDF文件已成功发送至打印机");
        }
        catch (InvalidPrinterException ex)
        {
            Console.WriteLine($"打印失败:{ex.Message}");
        }
    }
}

3. 备选方案:调用Acrobat Reader命令行打印

如果你的环境中已安装Adobe Acrobat Reader,可以直接调用命令行打印(无需额外依赖库):

using System.Diagnostics;

static void PrintPdfWithAcrobat(string pdfPath, string printerName)
{
    var processStartInfo = new ProcessStartInfo
    {
        FileName = "AcroRd32.exe",
        Arguments = $"/t \"{pdfPath}\" \"{printerName}\"",
        CreateNoWindow = true,
        UseShellExecute = false
    };

    using (var process = Process.Start(processStartInfo))
    {
        process.WaitForExit();
        Console.WriteLine(process.ExitCode == 0 ? "打印成功" : "打印失败");
    }
}

关于打印机默认设置的疑问

不需要手动输入所有打印机设置,只要指定正确的打印机名称,系统会自动使用该打印机的默认配置(比如纸张大小、打印方向等)。如果需要修改特定设置,才需要手动调整PrintDocument.DefaultPageSettings中的参数。

内容的提问来源于stack exchange,提问作者r_each

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.06.21 17:53:13