最近用到了winform去打印,网上查了一些资料,大概内容:

一 、首先有几个类 PageSetupDialog 、 PrintDialog 、PrintDocument 、PrintPreviewControls,\PrintPreviewDialog。这几个类的功能做简要介绍

PageSetupDialog 这个是打印设置对话框。

PrintDialog 、打印对话框。按确定能触发 printDocument1_PrintPage事件,或者通过 printDocument1.Print()触发 printDocument1_PrintPage事件。
PrintDocument 、打印的具体内容在这个里面设置是打印资料的对象哦。需要在这个的PrintPage事件下面写绘图的的形状什么的用GDI做。

PrintPreviewDialog:打印预览对话框。

PrintPreviewControls\\这个是打印的一个预览控件我这里没有用到,应该是可以实时显示用的。

二、具体的操作步骤

1、新建winform项目及创建窗体

2、拖取 打印 相关控件
   PageSetupDialog 、 PrintDialog 、 PrintDocument 、PrintPreviewDialog

3、设置上述控件的Document属性为相应的PrintDocument

4、设置按钮等控件 及 添加相应按钮事件

5、示意代码如下

三、打印代码如下

public partial class Form3 : Form
{
    public Form3()
    {
        InitializeComponent();
        this.printDocument1.OriginAtMargins = true;//启用页边距
        this.pageSetupDialog1.EnableMetric = true; //以毫米为单位

}

//打印设置
    private void btnSetPrint_Click(object sender, EventArgs e)
    {
        this.pageSetupDialog1.ShowDialog(); 
    }

//打印预览
    private void btnPrePrint_Click(object sender, EventArgs e)
    {
        this.printPreviewDialog1.ShowDialog(); 
    }

//打印
    private void btnPrint_Click(object sender, EventArgs e)
    {
        if (this.printDialog1.ShowDialog() == DialogResult.OK)
        {
            this.printDocument1.Print();
        }
    }

//打印内容的设置
    private void printDocument1_PrintPage(object sender, System.Drawing.Printing.PrintPageEventArgs e)
    {                        
        ////打印内容 为 整个Form
        //Image myFormImage;
        //myFormImage = new Bitmap(this.Width, this.Height);
        //Graphics g = Graphics.FromImage(myFormImage);
        //g.CopyFromScreen(this.Location.X, this.Location.Y, 0, 0, this.Size);
        //e.Graphics.DrawImage(myFormImage, 0, 0);

////打印内容 为 局部的 this.groupBox1
        //Bitmap _NewBitmap = new Bitmap(groupBox1.Width, groupBox1.Height);
        //groupBox1.DrawToBitmap(_NewBitmap, new Rectangle(0, 0, _NewBitmap.Width, _NewBitmap.Height));
        //e.Graphics.DrawImage(_NewBitmap, 0, 0, _NewBitmap.Width, _NewBitmap.Height);

//打印内容 为 自定义文本内容 
        Font font = new Font("宋体", 12);
        Brush bru = Brushes.Blue; 
        for (int i = 1; i <= 5; i++)
        {
            e.Graphics.DrawString("Hello world ", font, bru, i*20, i*20);
        }
    }

四、打印中遇到的问题

1、纸张大小一般是多大的,打印的时候打印内容和纸张怎么适应?怎么计算打印的页数,怎么计算需要打印多少页。

A4纸张为210*297

2、边距怎么设置。

答:边距设置,

A.NET对于页边距是绝对的“大国沙文主义”,只认美制的“英寸”不认别的制式,其默认单位是“0.01英寸”。
而我们的OS就比较入乡随俗,知道用“毫米”。所以在PageSetupDialog窗体上中显示的单位是“毫米”(取决于OS)。
由于两边制式不一样,搭不上话,.NET就会强制的把OS的制式单位给转换成它“习惯”的“英寸”。 也就是说:
在你点击“页面设置”对话框的“确定”按钮后,.NET会自动进行“毫米->英寸”的隐式转换。

B再度打开PageSetupDialog对话框时,PageSetupDialog对象却并没有进行与上面的隐式转换对应的“英寸->毫米”逆向转换,
而仅仅是简单粗暴地将单位名改了,从“Display”(0.01英寸)改成了“TenthsOfAMillimeter”(0.1毫米),数值却动都没动一下。
也就是说不管你给PageSetupDialog什么值,它都认为是以0.1毫米为单位的数。

在printDoc.DefaultPageSettings.Margins = new System.Drawing.Printing.Margins(100, 100, 50, 50); 中给出了打印边距设置为默认值是转化为0.1倍的mm值,然后如果从

3、怎么打印多页内容。

if (nPrintedHeight < nWinHeight)
{
e.HasMorePages = true;
}
else
{
e.HasMorePages = false;
}

4、怎么用代码在页面的固定位置粘贴预定义好的图片。当图片和文字重合的时候怎么把文字显示到图片的上面。

6、想要打印表格的时候怎么弄?

C# winfrom打印技术初探的更多相关文章

  1. 3D打印技术在医疗上的实际应用与实验室研究

    2018-01-17 Chris 免费3D打印模型资源站 预计阅读时间:5-10分钟 关键字:3D打印髋关节.脊柱置换产品,3D打印技术辅助精准截骨,义齿,生物墨水(BioInk),干细胞   随着& ...

  2. 3D打印技术之切片引擎(5)

    [此系列文章基于熔融沉积( fused depostion modeling, FDM )成形工艺] 从这一篇文章開始,就開始说填充.在3D打印切片技术中,填充算法是最核心的部分.3D打印技术的经常使 ...

  3. VB 共享软件防破解设计技术初探(三)

    ×××××××××××××××××××××××××××××××××××××××××××××× 其他文章快速链接: VB 共享软件防破解设计技术初探(一)http://bbs.pediy.com/sho ...

  4. VB 共享软件防破解设计技术初探(二)

    VB 共享软件防破解设计技术初探(二) ×××××××××××××××××××××××××××××××××××××××××××××× 其他文章快速链接: VB 共享软件防破解设计技术初探(一)http ...

  5. VB 共享软件防破解设计技术初探(一)

    VB 共享软件防破解设计技术初探(一) ×××××××××××××××××××××××××××××××××××××××××××××× 其他文章快速链接: VB 共享软件防破解设计技术初探(二)http ...

  6. Android 插件技术:动态加载dex技术初探

    1.Android动态加载dex技术初探 http://blog.csdn.net/u013478336/article/details/50734108 Android使用Dalvik虚拟机加载可执 ...

  7. afl-fuzz技术初探

    afl-fuzz技术初探 转载请注明出处:http://www.cnblogs.com/WangAoBo/p/8280352.html 参考了: http://pwn4.fun/2017/09/21/ ...

  8. 3D打印技术的火爆,真的会让传统模具行业没落吗?

    当一种新生事物出现时,人们除了赞美它带来的新畅想外,往往还会对"旧事物"贬低几分--各种淘汰观点总是不绝于耳.但可惜的是,新生事物取代旧事物的事儿并不会必然发生.比如,直到现在广播 ...

  9. 【VC++技术杂谈003】打印技术之打印机状态监控

    在上一篇博文中我主要介绍了如何获取以及设置系统的默认打印机,本文将介绍如何对打印机状态进行实时监控,记录下所打印的文档.打印的份数以及打印时间等打印信息. 1.打印机虚脱机技术 在正式介绍如何对打印机 ...

随机推荐

  1. keil小技能随用随定义

    大家都知道在C语言编程时一般都是先定义再使用这个变量的,不允许在语句的后面再定义,但是有时候我们会在KEIL中发现有些人使用变量就在语句后定义,这时我们自己去尝试却发现总是失败,这是为何呢? 原来是我 ...

  2. c# 判断当前时间是否在某一时间段内

    //获取当前系统时间并判断是否为服务时间 TimeSpan nowDt = DateTime.Now.TimeOfDay; TimeSpan workStartDT = DateTime.Parse( ...

  3. MYsql 之单标查询.

    http://www.cnblogs.com/wangfengming/articles/8064956.html .数据操作 .增 INSERT into t2(name,age) VALUES() ...

  4. C++ STL的容器类型

    1.顺序容器 2.关联容器 3.vector的使用 vector<数据类型> a; a.push_back(10)  -------->把数据从末末尾段插入vector里面 a.po ...

  5. Mac 忘记密码

    今天早上到公司发现电脑被动过,马上查看浏览器的历史记录,果然发现了一些痕迹.虽然是公司的电脑,但是随便被人翻看,还是很不爽! 于是马上把原来公司给的默认密码改掉. 不料,中午出去吃了个饭,回来就把密码 ...

  6. android 代码实现back键功能

    方案一,简单但响应慢: doExec("input keyevent 4"); public String doExec(String cmd) { String s = &quo ...

  7. 爬虫常用库之pyquery 库

    pyquery库是jQuery的Python实现,可以用于解析HTML网页内容,我个人写过的一些抓取网页数据的脚本就是用它来解析html获取数据的.他的官方文档地址是:http://packages. ...

  8. 【洛谷P4934】 礼物,拓扑排序

    题目大意:给你$n$个不重复的数,其值域为$[0,2^k)$,问你至少需要将这$n$个数拆成多少个集合,使得它们互相不是对方的子集,并输出方案. 数据范围:$n≤10^6$,$k≤20$. $MD$我 ...

  9. RDLC_部署到不同的浏览器

    首先我用的是vs2015 的reportview插件 在数据库中应该配置报表的服务器地址,在项目中添加ReportViewer 插件,单独用一个页面显示接收报表 <form id="f ...

  10. 关于JSON基础的总结

    本文总结自百度百科 JSON 语法规则 JSON 语法是 JavaScript 对象表示语法的子集. 数据在键值对中 数据由逗号分隔 花括号保存对象 方括号保存数组 JSON 名称/值对 JSON 数 ...