《打印机篇》打印机
打印示例1,使用PrintDocument、PrintDialog、PrintPreviewDialog
原文链接:https://www.jb51.net/article/67938.htm
1、使用PrintDocument进行打印
using System;
using System.Drawing;
using System.Drawing.Printing;
using System.Windows.Forms;
namespace PrintTest
{
public partial class Form1 : Form
{
public Form1()
{
InitializeComponent();
}
private void button1_Click(object sender, EventArgs e)
{
//实例化打印对象
PrintDocument printDocument1 = new PrintDocument();
//设置打印用的纸张,当设置为Custom的时候,可以自定义纸张的大小
printDocument1.DefaultPageSettings.PaperSize = new PaperSize("Custum", 500, 500);
//注册PrintPage事件,打印每一页时会触发该事件
printDocument1.PrintPage += new PrintPageEventHandler(this.PrintDocument_PrintPage);
//开始打印
printDocument1.Print();
}
private void PrintDocument_PrintPage(object sender, System.Drawing.Printing.PrintPageEventArgs e)
{
//设置打印内容及其字体,颜色和位置
e.Graphics.DrawString("Hello World!", new Font(new FontFamily("黑体"), 24), System.Drawing.Brushes.Red, 50, 50);
}
}
}
2.使用PrintDialog增加打印对话框
using System;
using System.Drawing;
using System.Drawing.Printing;
using System.Windows.Forms;
namespace PrintTest
{
public partial class Form1 : Form
{
public Form1()
{
InitializeComponent();
}
private void button1_Click(object sender, EventArgs e)
{
//实例化打印对象
PrintDocument printDocument1 = new PrintDocument();
//设置打印用的纸张,当设置为Custom的时候,可以自定义纸张的大小
printDocument1.DefaultPageSettings.PaperSize = new PaperSize("Custum", 500, 500);
//注册PrintPage事件,打印每一页时会触发该事件
printDocument1.PrintPage += new PrintPageEventHandler(this.PrintDocument_PrintPage);
//初始化打印对话框对象
PrintDialog printDialog1 = new PrintDialog();
//将PrintDialog.UseEXDialog属性设置为True,才可显示出打印对话框
printDialog1.UseEXDialog = true;
//将printDocument1对象赋值给打印对话框的Document属性
printDialog1.Document = printDocument1;
//打开打印对话框
DialogResult result = printDialog1.ShowDialog();
if (result == DialogResult.OK)
printDocument1.Print();//开始打印
}
private void PrintDocument_PrintPage(object sender, System.Drawing.Printing.PrintPageEventArgs e)
{
//设置打印内容及其字体,颜色和位置
e.Graphics.DrawString("Hello World!", new Font(new FontFamily("黑体"), 24), System.Drawing.Brushes.Red, 50, 50);
}
}
}
打印对话框如下图所示。
3.使用PrintPreviewDialog增加打印预览对话框
using System;
using System.Drawing;
using System.Drawing.Printing;
using System.Windows.Forms;
namespace PrintTest
{
public partial class Form1 : Form
{
public Form1()
{
InitializeComponent();
}
private void button1_Click(object sender, EventArgs e)
{
//实例化打印对象
PrintDocument printDocument1 = new PrintDocument();
//设置打印用的纸张,当设置为Custom的时候,可以自定义纸张的大小
printDocument1.DefaultPageSettings.PaperSize = new PaperSize("Custum", 500, 500);
//注册PrintPage事件,打印每一页时会触发该事件
printDocument1.PrintPage += new PrintPageEventHandler(this.PrintDocument_PrintPage);
//初始化打印预览对话框对象
PrintPreviewDialog printPreviewDialog1 = new PrintPreviewDialog();
//将printDocument1对象赋值给打印预览对话框的Document属性
printPreviewDialog1.Document = printDocument1;
//打开打印预览对话框
DialogResult result = printPreviewDialog1.ShowDialog();
if (result == DialogResult.OK)
printDocument1.Print();//开始打印
}
private void PrintDocument_PrintPage(object sender, System.Drawing.Printing.PrintPageEventArgs e)
{
//设置打印内容及其字体,颜色和位置
e.Graphics.DrawString("Hello World!", new Font(new FontFamily("黑体"), 24), System.Drawing.Brushes.Red, 50, 50);
}
}
}
打印时,会显示下图所示预览画面。
注意:PrintDialog与PrintPreviewDialog位于名称空间System.Windows.Forms(程序集为System.Windows.Forms.dll)中,而PrintDocument位于名称空间System.Drawing.Printing(程序集为System.Drawing.dll)中。
打印示例2(参考)
原文链接:https://www.cnblogs.com/jiangyunfeng/p/11666638.html
在windows应用程序中文档的打印是一项非常重要的功能,在以前一直是一个非常复杂的工作,Microsoft .net Framework的打印功能都以组件的方式提供,为程序员提供了很大的方便,但是这几个组件的使用还是很复杂的,有必要解释一下。
打印操作通常包括以下四个功能
- 1、打印设置 设置打印机的一些参数比如更改打印机驱动程序等
- 2、页面设置 设置页面大小纸张类型等
- 3、打印预览 类似于word中的打印预览
- 4、打印
实现打印功能的核心是PrintDocument类这个类属于System.Drawing.Printing名字空间这个类封装了当前的打印设置页面设置以及所有的与打印有关的事件和方法,这个类包括以下几个属性 事件 和方法
方法如下:
- 1、PrinterSettings 属性,存放打印机的设置信息这个属性不需要程序员设置因为它是由打印对话框获取的
- 2、PrintCountroller 属性,控制打印过程
- 3、DefaultPageSettings 属性,存放页面设置信息 打印纸大小方向等也不需要程序员设置因为它是由页面设置对话框获取的
- 4、DocumentName 属性,指定文档名称,出现在打印机状态窗口中
事件如下:
- 1、BeginPrint事件,在打印之前发出
- 2、PrintPage事件,每打印一页是发出,事件接受一个PrintPageEventArgs参数该参数封装了打印相关的信息
PrintPageEventArgs参数有很多重要的属性
1 Cancel 取消打印
2 Graphics 页面的绘图对象
3 HasMorePages 是否还有要打印的页面
方法如下:
- Print 方法 该方法没有参数 调用它将按照当前设置开始打印
若实现打印功能:
1、首先构造PrintDocument对象添加打印事件
PrintDocument printDocument;
private void InitializeComponent()
{
...
printDocument=new PrintDocument();
printDocument.PrintPage += new PrintPageEventHandler
(this.printDocument_PrintPage);
...
}
2、实现打印事件功能
打印和绘图类似都是调用Graphics 类的方法进行画图,不同的是一个在显示器上一个在打印纸上并且打印要进行一些复杂的计算,如换行 分页等。
private void printDocument_PrintPage(object
sender,PrintPageEventArgs e)
{
StringReader lineReader = new
StringReader(textBox.Text);
Graphics g = e.Graphics; //获得绘图对象
float linesPerPage = 0; //页面的行号
float yPosition = 0; //绘制字符串的纵向位置
int count = 0; //行计数器
float leftMargin = e.MarginBounds.Left; //左边距
float topMargin = e.MarginBounds.Top; //上边距
string line = null; 行字符串
Font printFont = this.textBox.Font; //当前的打印字体
SolidBrush myBrush = new
SolidBrush(Color.Black);//刷子
linesPerPage = e.MarginBounds.Height /
printFont.GetHeight(g);//每页可打印的行数
//逐行的循环打印一页
while(count < linesPerPage &&
((line=lineReader.ReadLine()) != null))
{
yPosition = topMargin + (count *
printFont.GetHeight(g));
g.DrawString(line, printFont, myBrush,
leftMargin, yPosition, new StringFormat());
count++;
}
如果本页打印完成而line不为空说明还有没完成的页面这将触发下一次的打印事件在下一次的打印中lineReader会自动读取上次没有打印完的内容因为lineReader是这个打印方法外的类的成员它可以记录当前读取的位置
if(line != null)
e.HasMorePages = true;
else
e.HasMorePages = false;
}
3、打印设置,构造打印对话框
将对话框中设置的Document属性赋给printDocument这样会将用户的设置自动保存到printDocument的PrinterSettings属性中
protected void FileMenuItem_PrintSet_Click(object
sender,EventArgs e)
{
PrintDialog printDialog = new PrintDialog();
printDialog.Document = printDocument;
printDialog.ShowDialog();
}
页面设置和打印预览与打印设置原理相同都是构造对话框将用户在对话框中的设置保存到相应的类的属性中
protected void FileMenuItem_PageSet_Click(object
sender,EventArgs e)
{
PageSetupDialog pageSetupDialog = new
PageSetupDialog();
pageSetupDialog.Document = printDocument;
pageSetupDialog.ShowDialog();
}
4、打印预览
protected void FileMenuItem_PrintView_Click(object
sender,EventArgs e)
{
PrintPreviewDialog printPreviewDialog = new
PrintPreviewDialog();
printPreviewDialog.Document = printDocument;
try
{
printPreviewDialog.ShowDialog();
}
catch(Exception excep)
{
MessageBox.Show(excep.Message, "打印出错",
MessageBoxButtons.OK, MessageBoxIcon.Error);
}
}
打印就可以直接调用printDocument的Print()方法因为用户可能在打印之前还要再更改打印设置所以
5、在这里再次显示打印设置对话框
protected void FileMenuItem_Print_Click(object
sender,EventArgs e)
{
PrintDialog printDialog = new PrintDialog();
printDialog.Document = printDocument;
lineReader = new StringReader(textBox.Text);
if (printDialog.ShowDialog() ==
DialogResult.OK)
{
try
{
printDocument.Print();
}
catch(Exception excep)
{
MessageBox.Show(excep.Message,
"打印出错", MessageBoxButtons.OK, MessageBoxIcon.Error);
printDocument.PrintController.OnEndPrint(printDocument,new
PrintEventArgs());
}
}
}
6、总结打印的过程是
- 1 在应用程序窗体初始化时构造PrintDocument对象 添加 printDocument 的 PrintPage 方法
- 2 实现PrintPage方法 4 在用户的单击事件中调用 printDocument 的 Print方法实现打印功能在这中间可能要用到 PrintDialog PrintPreviewDialog PageSetupDialog 设置和查看打印效
打印示例3(参考)
原文链接:http://www.takasa.cn/?p=1804
一、C#实现打印功能操作通常包括以下四个功能。
- 1、打印设置 设置打印机的一些参数比如更改打印机驱动程序等。
- 2、页面设置 设置页面大小纸张类型等。
- 3、打印预览 类似于word中的打印预览。
- 4、打印。下面就向你具体介绍操作的步骤。
二、实现打印功能的步骤
第一步:(添加事件):若实现打印功能首先构造PrintDocument对象添加打印事件:
PrintDocument printDocument;
private void InitializeComponent()
{
printDocument=new PrintDocument();
printDocument.PrintPage += new PrintPageEventHandler (this.printDocument_PrintPage);
}
第二步:实现第一步的的事件委托方法(printDocument_PrintPage)
实现此方法过程中用到了StringReader类,必须先定义,private StringReader LineReader = null;//字符串流对象,一行一行读取文本
private void printDocument1_PrintPage(object sender, PrintPageEventArgse)
{
Graphics g = e.Graphics; //获得绘图对象
float linesPerPage = 0; //页面的行号
float yPosition = 0; //绘制字符串的纵向位置
int count = 0; //行计数器
float leftMargin = e.MarginBounds.Left; //左边距
float topMargin = e.MarginBounds.Top; //上边距
string line = null; //行字符串
Font printFont = this.richTextBox1.Font;//当前的打印字体
SolidBrushmyBrush = new SolidBrush(Color.Black);//刷子
linesPerPage = e.MarginBounds.Height / printFont.GetHeight(g); //每页可打印的行数
//逐行的循环打印一页
while (count < linesPerPage && ((line = LineReader.ReadLine())!= null))
{
yPosition = topMargin + (count * printFont.GetHeight(g));
g.DrawString(line, printFont, myBrush, leftMargin, yPosition, new StringFormat());
count++;
}
if (line != null)
e.HasMorePages = true;
else
e.HasMorePages = false;
}
第三步:打印设置功能的实现
打印设置,构造打印对话框,将对话框中设置的Document属性赋给printDocument这样会将用户的设置自动保存到printDocument的PrinterSettings属性中
protectedvoid FileMenuItem_PrintSet_Click(object sender,EventArgs e)
{
PrintDialog printDialog = new PrintDialog();
printDialog.Document = printDocument;
printDialog.ShowDialog();
}
第四步:打印预览功能实现
此功能和打印设置原理相同,调出printPreviewDialog对话框即可,但值得注意的是必须实例化StringReader对象,lineReader = new StringReader(textBox.Text)。
protected void FileMenuItem_PrintView_Click( object sender,EventArgs e)
{
PrintPreviewDialog printPreviewDialog = new PrintPreviewDialog();
printPreviewDialog.Document = printDocument;
lineReader = new StringReader(textBox.Text);
try
{
printPreviewDialog.ShowDialog();
}
catch(Exception excep)
{
MessageBox.Show(excep.Message,”打印预览出错”, MessageBoxButtons.OK,
MessageBoxIcon.Error);
}
}
第五步:就是打印功能的实现,和打印预览注意的地方一样注意实例化StringReader对象
protected void FileMenuItem_Print_Click(object sender,EventArgs e)
{
PrintDialog printDialog = new PrintDialog();
printDialog.Document = printDocument;
lineReader = new StringReader(textBox.Text);
if (printDialog.ShowDialog() == DialogResult.O
{
try
{
printDocument.Print();
}
catch(Exception excep)
{
MessageBox.Show(excep.Message, “打印出错”,
MessageBoxButtons.OK,
MessageBoxIcon.Error);
printDocument.PrintController.OnEndPrint(new PrintEventArgs());
}
}
}
自定义纸张不支持问题
指定打印机/纸张/纸盒(不弹窗打印)
自定义纸张不支持问题,是由于打印机对纸张名称做了限制,只能用PaperSizes中遍历到的。
原文链接:https://zhuanlan.zhihu.com/p/143979296
我在WinForm 编程时一直有一个困扰很久的问题,有很多时候我们需要静默打印 或者不想使用默认的UI 进行打印设置
这个时候我的想法如下
1.获取全部打印机
2.获取打印机能打什么样的纸
3.将打印机设置传入并打印
首选用到的打印机设置类
System.Drawing.Printing.PrinterSettings
System.Drawing.Printing.PageSettings
第一步 找到所有打印机 主要使用这个属性 这个属性还是静态的
PrinterSettings.InstalledPrinters
第二步 找到你想要的那个打印机(代码忽略)
第三步 设置打印机名称(必须一模一样)
PrinterSettings settings = new PrinterSettings();
settings.PrinterName = PrintName;//打印机名称
第四步 设置打印机的纸张(在这里其实我遇到一些困难 发现如果自己输入纸张宽高 搞自定义有很多打印机不支持 最后还是找到了解决办法)
循环打印机支持的纸张 然后找到想要的打印机支持的纸的名字 这样做错误就很少了 设置项也很少 并且对于多纸张支持打印机可以对纸盒进行自动选择
PageSettings pageSettings = new PageSettings();
foreach (PaperSize data in settings.PaperSizes)
{
if (data.PaperName == printpagename)
{
pageSettings.PaperSize = data;
}
}
最后 进行打印
view.Print(settings, pageSettings);
当然这里我使用了一款支持打印机设置的浏览器引擎还是chromium 内核(确实是找了很久)
支持完全静默 不用显示 直接使用引擎进行打印需要使用 (ThreadRunner) 终于可以告别IE内核了 个人感觉比CEF要好用点 毕竟是收费的
EO.WebBrowser