C#实现自定义打印文字和图片的示例代码
作者:ViperL1 发布时间:2021-05-30 02:35:20
标签:C#,打印,文字,图片
C#中打印其实就是自己绘图+调用系统打印函数,于是便有了以下操作
1.调用打印机设置
如果你想在打印前设置打印机属性(或者切换打印机),请务必添加这段代码,否则电脑会直接按照预设的设置进行打印(打印机都没法选)
//打印机设置
PrintDialog printDialog = new PrintDialog();
printDialog.Document = ptDoc;
printDialog.ShowDialog();
ptDoc就是打印的文件内容,会在后面解释
2.关联文档
等于我们需要新建一个空白的画布,然后把我们需要的文字,图片,线条依次摆上去
PrintDocument ptDoc = new PrintDocument();
ptDoc.DocumentName = "测试文件";//在队列中显示的名字
ptDoc.PrintPage += PtDoc_PrintPage;//关联内容生成方法
3.绘制内容
本次测试的内容分为:横排文字,竖排文字,图片,具体内容和位置可以通过修改参数进行调整
private void PtDoc_PrintPage(object sender, PrintPageEventArgs e)
{
e.Graphics.Clear(Color.White);
// 开始绘制文档
// 默认为横排文字
e.Graphics.DrawString("标题:打印测试",
new Font(new FontFamily("宋体"), 40, FontStyle.Bold),
System.Drawing.Brushes.Red,
170, 10);
// 横线
e.Graphics.DrawLine(Pens.Black, 20, 110, 800, 110);
// 竖排文字
e.Graphics.DrawString("内容",
new Font(new FontFamily("宋体"), 14, FontStyle.Bold),
System.Drawing.Brushes.Black,
20, 120,
new StringFormat(StringFormatFlags.DirectionVertical));
e.Graphics.DrawString( this.txtName.Text,
new Font(new FontFamily("宋体"), 14, FontStyle.Bold),
System.Drawing.Brushes.Black,
20, 200);
//e.Graphics.DrawImage(Image.FromFile(Path), 20, 250, 800, 100); //会造成失真
Image imgsample = Image.FromFile(Path);
Point pt = Zoom(imgsample.Width, imgsample.Height, 200);
e.Graphics.DrawImage(imgsample, 20, 250, pt.X, pt.Y);//直接打印可能出现太大打印不下
}
同时直接打印图片的话可能造成图片太大,可以写一个缩放方法来限制图片的最大尺寸
private Point Zoom(int x, int y,int maxWidth)
{
Point pt = new Point(x, y);
while (pt.X > maxWidth)
{
pt.X /= 2;
pt.Y /= 2;
}
return pt;
}
最后结果如下
来源:https://blog.csdn.net/weixin_37878740/article/details/124233949


猜你喜欢
- 我们在使用SpringData JPA框架时,进行条件查询,如果是固定条件的查询,我们可以使用符合框架规则的自定义方法以及@Query注解实
- 定义:当对象间存在一对多关系时,则使用观察者模式(Observer Pattern)。比如,当一个对象被修改时,则会自动通知它的依赖对象。特
- 类加载器的分类。试验:使用maven打包<build> <plugins> <plu
- 内存泄漏:是指内存得不到GC的及时回收,从而造成内存占用过多,从而导致程序Crash,也就是常说的OOM。 一、static 先来看下面一段
- 1. 阐述对于Java中Map的遍历方式,很多文章都推荐使用entrySet,认为其比keySet的效率高很多。理由是:entrySet方法
- 模拟登陆的原理很简单,就是发送一个Http 请求服务器获得响应,然后客户端获取到cookie即可实现模拟登陆,比如一些抢票软件的原理无非也是
- Java 编程语言中时间的处理类有 Date类与 Calendar类。目前官方不推荐使用 Date类,因为其不利于国际化;而是推荐使用 Ca
- 简介机器学习在全球范围内越来越受欢迎和使用。 它已经彻底改变了某些应用程序的构建方式,并且可能会继续成为我们日常生活中一个巨大的(并且正在增
- 本文实例讲述了C#编程之事务用法。分享给大家供大家参考,具体如下:ado.net2.0的SqlTransaction使用方法/////ado
- 本教程的目的是使用Java编写的分离的层去访问数据库中的表,这一层通常称为数据访问层(DAL)使用DAL的最大好处是通过直接使用一些类似in
- 最近在配置OpenCV的时候,由于使用的是VS2019,结果找不到Microsoft.Cpp.X64.user这个文件。导致每次新建项目都得
- 解决项目中表单重复提交的问题,在平常的项目中有以下几种可能出现表单重复提交的情况,比如说:1.由于服务器缓慢或者网络延迟的原因,重复点击提交
- Android USB转串口通信开发实例详解好久没有写文章了,年前公司新开了一个项目,是和usb转串口通信相关的,需求是用安卓平
- 日期格式处理在控制器中使用对象接收数据前端:<form action="test/add" method=&quo
- 目前市面上的第三方短信服务平台数量十分庞大,并能为企业提供三网合一的短信接口,这些服务商通过整合短信发送服务,简单的打包成为API和SDK接
- 嵌入式Servlet容器在Spring Boot中,默认支持的web容器有 Tomcat, Jetty, 和 Undertow1、原理分析那
- 建库建表DROP DATABASE IF EXISTS mp;CREATE DATABASE mp DEFAULT CHARACTER SE
- 一、复制克隆 用等号直接Dictionary1 = Dictionary2,复制过去的是地址(赋址),这时改变Dictionary2,Dic
- 一、java多线程基本入门java多线程编程还是比较重要的,在实际业务开发中经常要遇到这个问题。 java多线程,传统创建线程的方式有两种。
- 1. strlen(),计算字符串长度 int strlen(const char string) {