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

C++如何在Windows下静默打印JPG、PDF文件到实体打印机

Windows平台MSVC2013 C++静默打印方案(无QT、无弹窗)

以下实现完全基于Windows原生API,无第三方重依赖,符合MSVC2013编译要求,全程无任何对话框弹出。

一、JPG/通用图片静默打印实现

实现逻辑

直接调用Win32 GDI+打印接口,跳过所有打印相关对话框,手动指定打印机和打印参数完成静默输出。

核心步骤

  • 调用GetDefaultPrinter或EnumPrinters获取目标打印机句柄,支持硬编码指定打印机或读取配置选择,无需弹出打印机选择框
  • 用GDI+原生Image类加载JPG、PNG、BMP等常见格式图片,无需额外解码库
  • 初始化打印文档参数,调用StartDoc、StartPage启动打印任务,所有参数提前配置,不调用任何打印对话框API
  • 将图片绘制到打印DC,自动适配打印纸张尺寸和DPI
  • 完成打印后释放所有资源

可直接编译的核心代码

#include <windows.h>
#include <gdiplus.h>
#pragma comment(lib, "gdiplus.lib")

// 静默打印图片接口,printerName为空时使用系统默认打印机
BOOL SilentPrintImage(const WCHAR* imageFilePath, const WCHAR* printerName = NULL) {
    // 初始化GDI+
    Gdiplus::GdiplusStartupInput gdiStartupInput;
    ULONG_PTR gdiToken;
    Gdiplus::GdiplusStartup(&gdiToken, &gdiStartupInput, NULL);

    HDC printerDC = NULL;
    WCHAR targetPrinter[256] = {0};
    DWORD bufSize = 256;

    // 获取目标打印机DC
    if (printerName == NULL) {
        // 读取系统默认打印机
        if (!GetDefaultPrinter(targetPrinter, &bufSize)) {
            Gdiplus::GdiplusShutdown(gdiToken);
            return FALSE;
        }
        printerDC = CreateDC(L"WINSPOOL", targetPrinter, NULL, NULL);
    } else {
        printerDC = CreateDC(L"WINSPOOL", printerName, NULL, NULL);
    }
    if (printerDC == NULL) {
        Gdiplus::GdiplusShutdown(gdiToken);
        return FALSE;
    }

    // 配置打印文档信息
    DOCINFO docInfo = {0};
    docInfo.cbSize = sizeof(DOCINFO);
    docInfo.lpszDocName = L"SilentImagePrint";
    docInfo.lpszOutput = NULL;

    // 启动打印任务
    if (StartDoc(printerDC, &docInfo) <= 0) {
        DeleteDC(printerDC);
        Gdiplus::GdiplusShutdown(gdiToken);
        return FALSE;
    }
    if (StartPage(printerDC) <= 0) {
        EndDoc(printerDC);
        DeleteDC(printerDC);
        Gdiplus::GdiplusShutdown(gdiToken);
        return FALSE;
    }

    // 加载图片并适配打印尺寸
    Gdiplus::Image srcImage(imageFilePath);
    Gdiplus::Graphics printGraphics(printerDC);
    int printAreaWidth = GetDeviceCaps(printerDC, HORZRES);
    int printAreaHeight = GetDeviceCaps(printerDC, VERTRES);
    printGraphics.DrawImage(&srcImage, 0, 0, printAreaWidth, printAreaHeight);

    // 结束打印释放资源
    EndPage(printerDC);
    EndDoc(printerDC);
    DeleteDC(printerDC);
    Gdiplus::GdiplusShutdown(gdiToken);
    return TRUE;
}

扩展说明

如果需要自定义纸张尺寸、灰度打印、双面打印等参数,可以通过SetDevMode接口修改打印机配置,全程无弹窗。

二、PDF静默打印方案

方案1:PDF直打(适配支持PDF原生打印的打印机)

大部分商用激光/喷墨打印机都支持直接解析PDF流,无需本地渲染:

  • 调用OpenPrinter打开目标打印机
  • 调用StartDocPrinter、StartPagePrinter启动打印任务
  • 读取PDF二进制内容,调用WritePrinter直接写入打印机端口
  • 完成后调用EndPagePrinter、EndDocPrinter释放资源,全程无任何GUI弹出

方案2:通用PDF打印(兼容所有打印机)

如果打印机不支持PDF直打,可以用轻量开源PDF渲染库(如MuPDF最小编译版本,编译后体积仅300KB左右,远小于QT依赖)将PDF逐页渲染为位图,再调用上面的图片打印流程完成输出,不要用ShellExecute调用第三方PDF阅读器打印,会触发弹窗。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.10.01 15:09:03