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

如何获取Windows打印机表单指定边距?关于PaperSize类的疑问

关于System.Drawing.Printing.PaperSize类不包含边距的原因及获取边距的方法

在Windows系统中,打印机支持的纸张尺寸设置(可在“打印服务器属性/表单”中找到)包含纸张尺寸与边距:
打印服务器属性表单界面

但System.Drawing.Printing.PaperSize类仅封装纸张尺寸相关成员,不包含边距信息,原因及获取边距的方法如下:

一、为什么PaperSize类不包含边距信息

PaperSize的设计定位是仅描述纸张本身的物理尺寸(宽、高),属于纸张的固有属性;而打印机的边距是设备特定的打印能力参数——同一种纸张在不同型号的打印机上,支持的最小可打印边距可能存在差异,边距信息和打印机硬件、驱动直接相关,不属于纸张本身的属性范畴,因此不会被整合到PaperSize类中。

二、获取打印机边距信息的途径

1. 通过PrinterSettings类获取

利用PrinterSettings.DefaultPageSettings.Margins可以获取当前打印机针对默认纸张的最小可打印边距;如果需要针对特定纸张尺寸获取对应边距,需先指定目标纸张,再读取边距:

// 初始化打印机设置
PrinterSettings printerSettings = new PrinterSettings();
// 设置目标纸张(示例为A4)
printerSettings.DefaultPageSettings.PaperSize = PaperSizeKind.A4;
// 获取该纸张对应的最小边距
Margins minPrintMargins = printerSettings.DefaultPageSettings.Margins;

2. 调用Windows原生API获取更精准的边距

通过GetDeviceCaps函数可以直接从打印机驱动获取物理打印区域的参数,进而计算最小边距:

  • PHYSICALOFFSETX:打印区域相对于纸张左边缘的偏移(即最小左边距)
  • PHYSICALOFFSETY:打印区域相对于纸张上边缘的偏移(即最小上边距)
  • PHYSICALWIDTH:纸张物理宽度
  • PHYSICALPRINTABLEWIDTH:可打印区域宽度
  • 最小右边距 = 纸张物理宽度 - 打印区域左偏移 - 可打印区域宽度
  • 最小下边距 = 纸张物理高度 - 打印区域上偏移 - 可打印区域高度

对应的C#调用示例(需引入user32.dll和gdi32.dll):

[DllImport("gdi32.dll")]
static extern int GetDeviceCaps(IntPtr hdc, int nIndex);

// 在打印上下文的hdc中获取参数
int leftMargin = GetDeviceCaps(printHdc, 112); // PHYSICALOFFSETX
int topMargin = GetDeviceCaps(printHdc, 113); // PHYSICALOFFSETY
int paperWidth = GetDeviceCaps(printHdc, 110); // PHYSICALWIDTH
int printableWidth = GetDeviceCaps(printHdc, 111); // PHYSICALPRINTABLEWIDTH
int rightMargin = paperWidth - leftMargin - printableWidth;

三、验证PrintDocument边距的实现

针对你提到的“验证PrintDocument的边距是否不小于打印机最小边距”的场景,可以通过以下逻辑实现:

PrintDocument pd = new PrintDocument();
// 获取打印机针对当前纸张的最小边距
Margins minMargins = pd.PrinterSettings.DefaultPageSettings.Margins;
// 获取PrintDocument设置的边距
Margins docMargins = pd.DefaultPageSettings.Margins;

// 验证边距是否符合要求
bool marginsValid = docMargins.Left >= minMargins.Left &&
                    docMargins.Right >= minMargins.Right &&
                    docMargins.Top >= minMargins.Top &&
                    docMargins.Bottom >= minMargins.Bottom;

if (!marginsValid)
{
    // 处理边距不符合要求的情况
}

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.06.12 21:04:58