个人主页 阿松爱睡觉横竖醒不来你可以不屠龙但不能不磨剑文章目录一、前言二、学习示例三、要点分析一PrintDocument二PrintDocument打印周期事件三PrintDocument.Print()四PrintDocument.PrinterSettings五PageSettings一、前言这里讲一下在unity开发中直接调用API控制打印进行一下简单的打印。前提是你得有打印机才行另外电脑还要有打印机的驱动。这里打印机用的是佳能3000学习示例是我在实际开发中实现的功能的一个示例用于在项目中需要把目前屏幕中的UI界面直接发送至打印机进行打印也可以选择本地的图片进行打印。二、学习示例首先要在代码中引用这两个命名空间然后才可以使用打印机的一些APIusingSystem.Drawing.Printing;usingSystem.Drawing;我们先看一个打印的示例是一个打印照片的功能在实践中学习看完示例之后再逐步的讲解各个步骤的含义。// 创建PrintDocument打印文档对象// 打印图片或者文字你得有A4纸才能打印吧这就好比你创建了一张A4纸PrintDocumentpdnewPrintDocument();// 获取打印机设置PrinterSettingspspd.PrinterSettings;// 设置打印方向为横向pd.DefaultPageSettings.Landscapetrue;// 获取默认纸张大小以100th of an inch为单位PaperSizepkSizeps.DefaultPageSettings.PaperSize;intiWidthpkSize.Width;intiHeightpkSize.Height;// 将纸张大小转换为像素floatfWidth(float)iWidth*100.0f/25.4f;floatfHeight(float)iHeight*100.0f/25.4f;// 创建一个与纸张大小相匹配的矩形参数是两个边距和宽高// 即使设置为00打印的时候还是会有一点点的边距大概4毫米左右的大小。这里是因为打印机硬件的部分为了防止墨水喷到机器零件上面目前还不知怎么解除这个限制。RectangleFrectfnewRectangleF(0,0,fWidth,fHeight);// 加载要打印的图片传入照片的路径ImageimageImage.FromFile(imagePath);// 订阅PrintPage事件可以理解为你要在A4纸上具体要打印什么样的信息pd.PrintPage(sender,e){// 从文件加载图像using(ImageimageImage.FromFile(imagePath)){// 计算图像在页面上的位置和大小// 调整页边距这里设置完不生效该打啥样还是打啥样应该是前面提到的硬件限制e.PageSettings.MarginsnewMargins(100,100,200,200);// 上下左右边距各10单位例如1/100英寸Rectanglerecte.MarginBounds;// 检查是否需要调整打印方向//日志输出一下检查是否有误Debug.Log($rect:{rect.Width},{rect.Height};image:{image.Width},{image.Height});Debug.Log($打印机的页边距{e.PageSettings.Margins.Left},{e.PageSettings.Margins.Right},{e.PageSettings.Margins.Top},{e.PageSettings.Margins.Bottom});// 旋转图像照片是横板照片image.RotateFlip(RotateFlipType.Rotate90FlipNone);if(image.Widthimage.Height){// 图像为横向设置打印方向为横向e.PageSettings.Landscapetrue;}//获取打印机dpiPrinterSettingsprinterSettingsnewPrinterSettings();intdpiXprinterSettings.DefaultPageSettings.PrinterResolution.X;intdpiYprinterSettings.DefaultPageSettings.PrinterResolution.Y;// A4纸尺寸毫米intwidthMM210;intheightMM297;// 转换为像素intwidthPixels(int)((widthMM/25.4)*dpiX);intheightPixels(int)((heightMM/25.4)*dpiY);Debug.Log($PrinterSettings:dpiX-{dpiX},dpiY-{dpiY},widthPixels-{widthPixels},heightPixels-{heightPixels});floatscale0.85f;// 创建目标矩形inttargetWidthpkSize.Width-30;inttargetHeight(int)(pkSize.Height*((float)targetWidth/(float)pkSize.Width));rectnewRectangle(0,10,targetWidth,targetHeight);Debug.Log($rect:{rect.Width},{rect.Height};image:{image.Width},{image.Height});// 在页面上绘制图像e.Graphics.DrawImage(image,rect);}};pd.Print();三、要点分析一PrintDocumentPrintDocument是.NET Framework中用于打印的一个类它属于System.Drawing.Printing命名空间所以在头部要记得using。PrintDocument类提供了一个用于处理打印作业的框架允许你自己设置和执行打印任务打印文档的每一页都可以单独设置。二PrintDocument打印周期事件是的PrintDocument类除了PrintPage事件之外还有其他几个事件可以用于处理打印过程中的不同阶段。以下是一些常用的事件PrintPage每打印一页时就会被触发一次可以设置每一页需要打印的操作和具体打印内容。BeginPrint在打印整体开始之前执行可以在这里进行一些初始化工作。EndPrint在打印整体完成之后发生即所有页面都已打印完执行可以在这里进行一些清理工作。QueryPageSettings在打印每一页之前发生允许为每一页设置不同的页面设置。看下示例代码usingSystem;usingSystem.Drawing;usingSystem.Drawing.Printing;publicclassPrintExample{publicstaticvoidMain(){pd.BeginPrintnewPrintEventHandler(pd_BeginPrint);pd.EndPrintnewPrintEventHandler(pd_EndPrint);pd.QueryPageSettingsnewQueryPageSettingsEventHandler(pd_QueryPageSettings);pd.PrintPagenewPrintPageEventHandler(pd_PrintPage);// 打印文档pd.Print();// 或者显示打印对话框让用户进行打印PrintDialogprintDialognewPrintDialog();printDialog.Documentpd;if(printDialog.ShowDialog()DialogResult.OK){// 打印图像pd.Print();}}privatestaticvoidpd_BeginPrint(objectsender,PrintEventArgse){Debug.Log(开始打印作业);}privatestaticvoidpd_EndPrint(objectsender,PrintEventArgse){Debug.Log(打印作业完成);}privatestaticvoidpd_QueryPageSettings(objectsender,QueryPageSettingsEventArgse){Debug.Log(查询页面设置);}privatestaticvoidpd_PrintPage(objectsender,PrintPageEventArgse){Debug.Log(打印页面);// 在这里绘制页面内容e.Graphics.DrawString(Hello, World!,newFont(Arial,12),Brushes.Black,100,100);// 简单的打印图片using(ImageimageImage.FromFile(imagePath)){rectnewRectangle(0,0,image.Width,image.Height);e.Graphics.DrawImage(image,rect);}// 设置是否继续打印下一页e.HasMorePagesfalse;}}在这个示例中我们注册了BeginPrint、EndPrint、QueryPageSettings和PrintPage事件并在每个事件处理程序中输出了一些信息。你可以根据需要在这些事件处理程序中添加更多的逻辑。三PrintDocument.Print()显而易见就是执行打印任务告诉打印机开始打印。四PrintDocument.PrinterSettingsPrinterSettings是打印机的一些设置用来设置打印机的一些属性。InstalledPrinters(静态)获取当前系统安装的所有打印机名称的字符串数组。IsDefaultPrinter获取一个值指示当前PrinterSettings是否表示默认打印机。PrinterName获取或设置打印机名称。SupportsColor获取一个值指示打印机是否支持彩色打印。SupportsDuplex获取一个值指示打印机是否支持双面打印。Duplex获取或设置双面打印设置例如单面、垂直双面、水平双面。FromPage获取或设置打印的起始页码。ToPage获取或设置打印的结束页码。MaximumCopies获取打印机支持的最大份数。MaximumPage获取打印机支持的最大页码。MinimumPage获取打印机支持的最小页码。PrintToFile获取或设置一个值指示是否将文档打印到文件。PrintFileName获取或设置打印到文件的文件名。PrintRange获取或设置打印范围例如所有页面、选定页面、当前页面。Copies获取或设置打印的份数。看下使用示例usingSystem.Drawing.Printing;publicvoidConfigurePrinter(){PrintDocumentpdnewPrintDocument();// 设置打印机名称pd.PrinterSettings.PrinterNameYour Printer Name;// 设置为横向打印pd.DefaultPageSettings.Landscapetrue;// 设置打印份数pd.PrinterSettings.Copies2;// 设置双面打印if(pd.PrinterSettings.CanDuplex){pd.PrinterSettings.DuplexDuplex.Vertical;}// 设置纸张大小pd.DefaultPageSettings.PaperSizenewPaperSize(A4,827,1169);// 设置页边距pd.DefaultPageSettings.MarginsnewMargins(50,50,50,50);// 打印文档pd.Print();}五PageSettingsPageSettings是打印页面纸张的一些设置例如页边距这些属性Bounds获取页面设置的边界。Color获取或设置一个值指示是否使用彩色打印。Landscape获取或设置一个值指示页面是否横向打印。Margins获取或设置页面的边距。PaperSize获取或设置纸张大小。PaperSource获取或设置纸张来源。PrinterSettings获取或设置与页面设置关联的PrinterSettings。PrintableArea获取页面的可打印区域。除此之外还有一些方法SetPaperSize(paperSize)设置纸张大小。SetMargins(margins)设置页面的边距。