近期涉及到一个需求要求提供简单的打印功能,首先想到的winform的printDocument打印功能。之前有别的项目使用了这块进行了简单的封装,但是感觉有问题。问题很简单,之前的打印只能打印固定字体大小的内容。不好用。我不能自定义字体大小。

so,引出自己定义的需求。能不能自定义字体进行打印。而且简单粗暴不使用第三方控件。

首先百度了下网上的代码代码很多,但大多有存在问题,问题如下:

1.不能换行,因为使用RichTextBox之后固然是能够使用自定义字体了,但是问题也是存在的那就是不会给你自动换行,而且即使控件自动换行了也没用因为页面尺寸和控件尺寸并不一致。

2.打印会存在每一页只打印一部分的问题

围绕以上两个问题,我找了很多代码都不行,后来拼凑了下,并且找单位的大佬帮忙总算解决了,这里记录下:

首先拉出几个控件:

PrintDialog ,PrintDocument,FontDialog,PageSetupDialog,以及3个button。

依次说明下这些控件的作用,PrintDialog用于打印之前的提示框,PrintDocument用于存放答应的文本信息,FontDialog设置字体信息,PageSetupDialog设置打印的页面信息,三个button分别为:

以上控件拖出后需要设置的属性为:

pageSetupDialog1的Document = prinntDocument1;

之后我们还需要richtextbox控件,以下为打印的相关代码:

在打印之前设置全局变量

// 需要打印的左上角位置
int top = 0;
// 一共已经打印了多少行
int count = 0;
private void buttonFont_Click(object sender, EventArgs e)
{DialogResult dr = fontDialog1.ShowDialog(this);if (dr == DialogResult.OK){richTextBoxContent.Font = fontDialog1.Font;richTextBoxContent.ForeColor = fontDialog1.Color;}
}

此代码目的是设置富文本的字体和颜色

 private void buttonPages_Click(object sender, EventArgs e){pageSetupDialog1.Document = printDocument1;pageSetupDialog1.ShowDialog(this);}

这段代码为设置打印页面规制

private void buttonPrint_Click(object sender, EventArgs e)
{printDialog1.Document = printDocument1;DialogResult dr = printDialog1.ShowDialog(this);if (dr == DialogResult.OK){top = 0;count = 0;printDocument1.Print();}
}

这段代码设置了打印的初始值

top每次打印之前将打印的左上角置为0

count计算已经打印了多少行。

// 该方法每打印一页调用一次
private void printDocument1_PrintPage(object sender, System.Drawing.Printing.PrintPageEventArgs e)
{            // 设置需要打印的字体格式Font f = richTextBoxContent.Font;// 设置需要打印的字体颜色Brush b = new SolidBrush(richTextBoxContent.ForeColor);      // 获取每页如果能打印完每页的高度int PageHeight = (int)Math.Ceiling(f.GetHeight(e.Graphics) * Math.Floor(e.MarginBounds.Height / f.GetHeight(e.Graphics)));// 计算所有文本的打印区域大小Size sf = Size.Round(e.Graphics.MeasureString(richTextBoxContent.Text, richTextBoxContent.Font, e.MarginBounds.Width));e.Graphics.SetClip(e.MarginBounds);// 设置当前页的打印区域Rectangle r = new Rectangle(new Point(e.MarginBounds.Left, e.MarginBounds.Location.Y - top), new Size(sf.Width, PageHeight*(count+1)));e.Graphics.DrawString(richTextBoxContent.Text, richTextBoxContent.Font, b, r);// 如果当前左上角的高度加上每页的高度小于所有文本区域的高度说明当前页没有打印完if (top + PageHeight < sf.Height){// 页数加一count++;// 左上角向下移动指定高度top = top + PageHeight;// 表明还有下一页等待打印e.HasMorePages = true;                }
}

以上方法可能不好理解这里配图说明下:

首先我们需要解决的是换行问题,这里使用Rectangle,将文本填充到其中时,会自动换行。

其次解决分页问题,这个问题我们先要理解打印的思路,在打印之前我们需要将所有的待打印信息放到一个待打印区间,正常的流程为每页打印MarginBounds范围大小的内容,换句话说MarginBounds的大小决定了我们能打印多少。如果运气不好就会发生上一页一半字下一页一半字的问题。

为了解决这个问题我们采用了以下办法进行打印:

这里比较难理解的是

Rectangle r = new Rectangle(new Point(e.MarginBounds.Left, e.MarginBounds.Location.Y - top), new Size(sf.Width, PageHeight*(count+1)));

这个为啥要-top,具体我也不清楚,但猜测是总打印区域是向上移动r的区域y轴必须为负才能打印到下侧区域但打印的区间必须放大到新的页数否则将无法打印全部信息。

如果不对欢迎拍砖。

C# richTextBox的换行分页打印相关推荐

  1. html表格打印填充分页,window.print()页面打印之表格内容分页填充进行分页打印

    windwow.print()用于打印当前窗口的内容,很简便,可当内容特殊并且打印有特殊需求的时候就要绕个圈了.下面是需要打印的表格: 当数据量少的时候像上面的表格一样,中间的内容只有5条数据,打印出 ...

  2. Java实现表格打印翻页_简单又实用的小文章来了----表格分页打印的那些小事(2)...

    前言 之前写过一篇表格分页打印的实践,其基本思路是按照一比一还原打印宽高,然后根据页面高度内容以及内容长度进行粗略计算,针对不能显示的进行内容分割. 相比上次逻辑稍微繁琐一点,今天分享的方式是更加简单 ...

  3. vue分页打印指定内容

    再更新一种浏览器指定内容打印,^_^ ,需要分页打印的话,建议方法2看到最后.方法一没试,不知道能不能行.理论应该是可以的^_^.在此记录一下我的方案 ------------------分割线--- ...

  4. window.print()页面打印之表格内容分页填充进行分页打印

    windwow.print()用于打印当前窗口的内容,很简便,可当内容特殊并且打印有特殊需求的时候就要绕个圈了.下面是需要打印的表格: 当数据量少的时候像上面的表格一样,中间的内容只有5条数据,打印出 ...

  5. php可以打印一个页面,利用html实现分页打印功能的实例详解

    本篇介绍利用html实现分页打印功能的实例详解,有些不想打印出来的分页打印的都可以应用这类样式进行控制 在非打印时是无效的. 页面打印 /* 应用这个样式的在打印时隐藏 */ .noPrint { d ...

  6. table的分页打印

    在工作中,经常有打印报表的需求,一般<tbody>中的<tr>比较多的时候,打印机打印的时候肯定会出去分页,有的客户要求比较高,一张A4纸一定要带上表头和表尾的内容(就是< ...

  7. js javascript js控制分页打印,打印分页

    Html代码   <%@ page language="java" contentType="text/html; charset=UTF-8" page ...

  8. npoi 设定视图为分页预览_按班级分页打印,只要两步就行,不需要再筛选复制打印了...

    话说在猪爸爸幼儿园,和谐可亲的伊伊老师,最近遇上了一个小难题,每次要将各个班级的学生成绩打印出来,但是各个班级的成绩,都是放在一个工作表上,每次都需要筛选,然后把每一个班级的数据复制粘贴到其他工作表, ...

  9. java实现分页打印功能_web 页面分页打印的实现

    1.首先引入一个WebBrowser在需要打印的页面,可以直接添加: 复制代码 代码如下: 到页面,或者使用javascript在需要的时候临时添加也可以: 复制代码 代码如下: document.b ...

  10. Excel表格从指定部分重新分页打印的两种方法

    Excel表格现在已经成为了一个极其重要的办公工具,尤其是在数据处理方面,它可以进行各种数据的处理.统计分析和辅助决策操作,但是在日常工作中我们经常对一些功能无从下手,例如在进行表格内容打印时,需要将 ...

最新文章

  1. mysql 表的继承,MySQL是否支持表继承?
  2. Python心得--如何提高代码质量
  3. LNMP环境搭建(centos6.9+mysql5.7+php7.1+nginx1.10)
  4. 07_设置坐标轴刻度、设置刻度标签(Setting Tick Labels)、调整刻度标签 (Adjusting the ticklabels)
  5. Day5---D4:合规和审计管理
  6. 热血江湖战无止境与服务器连接不稳定,《热血江湖》V14.0“战无止境”新版玩不停...
  7. UOS桌面专业版下载链接
  8. Luogu4712「生物」能量流动
  9. SQL分页查询,SQL的LIMIT语句用法,SQL如何实现分页查询,SpringBoot实现分页查询。
  10. 遗传算法(Genetic Algorithm)原理详解和matlab代码解析实现及对应gaot工具箱实现代码
  11. 基于卷积神经网络的人脸识别
  12. linux 怎么格式化u盘写保护,u盘写保护如何解除?去掉保护模式的具体方法
  13. python:实现培根密码算法(附完整源码)
  14. 面向对象的英文全称叫做Object Oriented
  15. 维基百科怎么做_维基百科创建修改技巧分享!
  16. CST软件基本操作—1
  17. 删除IE浏览器input框自带的删除叉
  18. kali虚拟机VMBox安装
  19. 【CQF Math Class 数学笔记】
  20. 对docker一些认知

热门文章

  1. android+锁屏显示农历,在手机锁屏界面上显示农历日期和天气
  2. 哪个牌子的投影仪更好?哪个品牌投影仪好
  3. iphone和ipad的一些区别
  4. 全栈工程师需要了解掌握的技术栈
  5. 国美易卡不需要扩展,国美易卡系统维护复杂
  6. C语言实现日历时间转换为秒(mktime)
  7. Python模拟微信发红包
  8. oracle查询日期当天,oracle获取今天时间数据
  9. 计算机磁盘的卷是什么意思,磁盘卷和分区的不同是什么?
  10. 2021年国考申论写作之如何快速改进作文书写