API(16)——打印系统开发(53)——C# 打印 api 操作属性设置,DocumentProperties

using System;
using System.Collections.Generic;
using System.ComponentModel;
using System.Data;
using System.Drawing;
using System.Linq;
using System.Text;
using System.Windows.Forms;
using System.Runtime.InteropServices;
using System.Drawing.Printing;


namespace WindowsFormsApplication2
{
    public partial class Form1 : Form
    {
        public Form1()
        {
            InitializeComponent();
        }
        private const int DM_PROMPT = 4;
        private const int DM_OUT_BUFFER = 2;
        private const int DM_IN_BUFFER = 8;
        [System.Runtime.InteropServices.DllImportAttribute("winspool.drv", SetLastError = true)]
        public extern static int DocumentProperties(
             IntPtr hWnd,              // handle to parent window 
             IntPtr hPrinter,           // handle to printer object
             string pDeviceName,   // device name
             ref IntPtr pDevModeOutput, // modified device mode
             ref IntPtr pDevModeInput,   // original device mode
             int fMode);                 // mode options 


        [System.Runtime.InteropServices.DllImportAttribute("winspool.drv")]
        public static extern int PrinterProperties(
            IntPtr hwnd,  // handle to parent window
            IntPtr hPrinter); // handle to printer object


        [System.Runtime.InteropServices.DllImportAttribute("winspool.drv", SetLastError = true)]
        public extern static int OpenPrinter(
            string pPrinterName,   // printer name
            ref IntPtr hPrinter,      // handle to printer object
            ref IntPtr pDefault);    // handle to default printer object. 


        [System.Runtime.InteropServices.DllImportAttribute("winspool.drv", SetLastError = true)]
        public static extern int ClosePrinter(
            IntPtr phPrinter); // handle to printer object
        PrintDocument doc = new PrintDocument();
        private void button1_Click(object sender, EventArgs e)
        {
            string printerName = doc.PrinterSettings.PrinterName;  
            if (printerName != null && printerName.Length > 0)
            {
                IntPtr pPrinter = IntPtr.Zero;
                IntPtr pDevModeOutput = IntPtr.Zero;
                IntPtr pDevModeInput = IntPtr.Zero;
                IntPtr nullPointer = IntPtr.Zero;
                OpenPrinter(printerName, ref pPrinter, ref nullPointer);  
                int iNeeded = DocumentProperties(this.Handle, pPrinter, printerName, ref pDevModeOutput, ref pDevModeInput, 0);
                pDevModeOutput = System.Runtime.InteropServices.Marshal.AllocHGlobal(iNeeded);
                DocumentProperties(this.Handle, pPrinter, printerName, ref pDevModeOutput, ref pDevModeInput, DM_PROMPT);
                ClosePrinter(pPrinter);
            }
        }


        private void button2_Click(object sender, EventArgs e)
        {
            string printerName = doc.PrinterSettings.PrinterName;


            if (printerName != null && printerName.Length > 0)
            {
                IntPtr pPrinter = IntPtr.Zero;
                IntPtr pDevModeOutput = IntPtr.Zero;
                IntPtr pDevModeInput = IntPtr.Zero;
                IntPtr nullPointer = IntPtr.Zero;


                OpenPrinter(printerName, ref pPrinter, ref nullPointer);


                int iNeeded = PrinterProperties(this.Handle, pPrinter);
                ClosePrinter(pPrinter);
            }
        }
     
    }
       
}

经典评论:

1、只能显示打印机首选项,不能设置!

要在Windows下使用C语言集成打印后台处理程序API接口和Ghostscript将PDF文件发送到打印机上,并使用不同的纸盒和纸张大小打印出来,可以按照以下步骤进行操作: 1. 安装Ghostscript和打印后台处理程序API接口库。 2. 在C程序中调用打印后台处理程序API接口,实现打印机的选择和纸张大小的设置。 3. 使用Ghostscript将PDF文件转换为打印机可识别的数据流,并将其发送到打印机上。 4. 在发送数据流之前,使用打印后台处理程序API接口设置打印机使用的纸盒和纸张大小。 5. 在打印完成后,释放资源并关闭打印机。 下面是一个简单的示例程序,演示如何使用C语言集成打印后台处理程序API接口和Ghostscript将PDF文件发送到打印机上,并使用不同的纸盒和纸张大小打印出来: ``` #include <windows.h> #include <stdio.h> #include <gdiplus.h> #pragma comment(lib, "gdiplus.lib") #define PRINTER_NAME "My Printer" int main() { // 初始化GDI+库 Gdiplus::GdiplusStartupInput gdiplusStartupInput; ULONG_PTR gdiplusToken; Gdiplus::GdiplusStartup(&gdiplusToken, &gdiplusStartupInput, NULL); // 获取打印机句柄 HDC hdcPrinter = CreateDC(NULL, PRINTER_NAME, NULL, NULL); if (hdcPrinter == NULL) { printf("Failed to create printer DC\n"); return -1; } // 获取打印机的设备描述表 int devModeSize = DocumentProperties(NULL, hdcPrinter, PRINTER_NAME, NULL, NULL, 0); DEVMODE* devMode = (DEVMODE*)malloc(devModeSize); DocumentProperties(NULL, hdcPrinter, PRINTER_NAME, devMode, NULL, DM_OUT_BUFFER); // 设置打印机使用的纸盒和纸张大小 devMode->dmFields |= DM_DEFAULTSOURCE | DM_PAPERSIZE; devMode->dmDefaultSource = DMBIN_MANUAL; // 使用手动送纸器 devMode->dmPaperSize = DMPAPER_A4; // 使用A4纸张 DocumentProperties(NULL, hdcPrinter, PRINTER_NAME, devMode, devMode, DM_IN_BUFFER | DM_OUT_BUFFER); // 获取Ghostscript的实例 HINSTANCE hGhostscript = LoadLibrary("gsdll32.dll"); if (hGhostscript == NULL) { printf("Failed to load Ghostscript DLL\n"); return -1; } // 获取Ghostscript的函数指针 typedef int (*GSAPI)(int argc, char** argv); GSAPI gsapi = (GSAPI)GetProcAddress(hGhostscript, "gsapi_new_instance"); if (gsapi == NULL) { printf("Failed to get Ghostscript function pointer\n"); return -1; } // 设置Ghostscript的参数 char* gsArgs[] = { "gsdll32.dll", // Ghostscript的DLL文件名 "-dPrinted", // 模拟打印输出 "-dBATCH", // 批处理模式 "-dNOPAUSE", // 不暂停 "-dSAFER", // 安全模式 "-dNOSAFER", // 关闭安全模式 "-sDEVICE=mswinpr2", // 使用Windows打印机设备 "-sOutputFile=%printer%" PRINTER_NAME, // 输出文件名为打印机名称 "-dDEVICEWIDTHPOINTS=595", // 设备宽度为595个点 "-dDEVICEHEIGHTPOINTS=842", // 设备高度为842个点 "-dFIXEDMEDIA", // 固定媒体大小 "-dPDFFitPage", // 自适应页面大小 "input.pdf", // 输入的PDF文件名 NULL }; // 调用Ghostscript将PDF文件发送到打印机 int gsResult = gsapi(sizeof(gsArgs) / sizeof(char*) - 1, gsArgs); if (gsResult != 0) { printf("Failed to print PDF file\n"); return -1; } // 释放资源 free(devMode); DeleteDC(hdcPrinter); FreeLibrary(hGhostscript); Gdiplus::GdiplusShutdown(gdiplusToken); return 0; } ``` 注意:上述示例程序仅供参考,实际应用中需要根据实际需求进行修改和优化。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值