日常开头水一下,看了下上次博客,一年零八天了,啧啧,奢侈。

最近这个工作挺满意的,是我想要的发展方向,后续要做机器学习,现在得先把公司之前堆积的问题解决了。

谈人生到此结束,还是说正题吧。(感觉这标题吸引不了人啊)

打印:PrintDocument

环境:WPF and Winform

要求:排版并打印图片

之前一直不明白很多参数的问题,现在想清楚了,随手记录一下。

WPF暂放一边,把winform先解决了,跟百度烂大街的一样是 PrintPage事件Graphics绘制来打印的。其它部分参考

https://www.cnblogs.com/hsiang/p/6921817.html

首先用Graphics绘制一直不明白的是该怎么绘制,纸张的大小是多少,怎么样才能按照指定尺寸打印。

//我们先聊聊纸张大小,看纸张大小可以在开始文件打印
  PrintDocument.Print(); 
并选好打印机后,在 PrintPage事件里绘制要打印的数据
private void pdControl_PrintPage(object sender, PrintPageEventArgs e)
{
    var printDocument = (PrintDocument)sender;
    //纸张的高和宽
    var paper_h = printDocument.DefaultPageSettings.PaperSize.Height;
    var paper_w = printDocument.DefaultPageSettings.PaperSize.Width;
}

然而知道高和宽但不知道单位啊,这高和宽到底是像素还是英寸还是其它的什么鬼。

在实例化new PaperSize就看得到注释:

百分之一英寸为单位

这样第一个问题就解决了,纸张的大小是 printDocument.DefaultPageSettings.PaperSize,并且单位是百分之一英寸。

不过不要太相信这个,比如我要打印的图片是6寸的(特地量了),但给出是尺寸宽多了0.15In,高多了0.13In。好歹win自带的PDF打印A4纸也就相差0.002以下好吧。这个为什么有误差待大神解释。

那么第二个问题(第三个):该怎么绘制才能按照指定尺寸打印

既然我们知道了打印的范围也就避免了绘制超出纸张。那么我们就要绘制内容了,咱这只讲图片,其它的也差不多。

我做的是根据图片的大小铺满整个打印纸。

   //我们先建个类,来记录要图片大小及纸张大小
//这个类只是方便调试转换度量单位,实际应用只选一种计算单位就行了
class PrintUnit
{
     //图片大小,这里图片其实是一寸的照片
public int unit_w = ;
public int unit_h = ;
     //纸张大小300dpi 6*300 4*300
public PaperSize paperSize = new PaperSize("A6", , );
     //度量单位
private GraphicsUnit unit = GraphicsUnit.Pixel;
public GraphicsUnit Unit
{
get => unit;
set
{
unit = value;
          //如果度量单位为毫米
if (unit == GraphicsUnit.Millimeter)
{
            //具体换算为 1200/300*25.4 约等于 102
  paperSize.Height = ;
paperSize.Width = ;
unit_w = ;
unit_h = ;
}
}
}
}

然后在 PrintPage事件里得到计算打印纸可以铺满多少图片

            PrintUnit printUnit = new PrintUnit();
       g.PageUnit = printUnit.Unit;
       column = printUnit.paperSize.Width / printUnit.unit_w;
row = printUnit.paperSize.Height / printUnit.unit_h; for (int i = ; i < row; i++)
{
for (int j = ; j < column; j++)
{
//g.DrawImage(
// Resources._1,
// new Rectangle(j * printUnit.unit_w, i * printUnit.unit_h, printUnit.unit_w, printUnit.unit_h),
// new Rectangle(0, 0, Resources._1.Width, Resources._1.Height),
// g.PageUnit);
g.DrawImage(Resources._1, j * printUnit.unit_w, i * printUnit.unit_h, printUnit.unit_w, printUnit.unit_h);
}
}

  有趣的是在DrawImage(Image image, Rectangle destRect, Rectangle srcRect, GraphicsUnit srcUnit);的重载方法里图片有误差,原因不明。

有点乱了,来强行解释一波。

在打印事件里PrintPageEventArgs.PageUnit 是设置度量单位,就是你要绘制的单位是按照像素还是毫米或其它,默认是百分之一英寸。

//比如你要打印A4纸210mm×297mm ,打印PrintPage事件里设置度量单位为Millimeter
g.PageUnit=GraphicsUnit.Millimeter;
//铺满整个A4纸
g.DrawImage(image, 0, 0, 210, 297);

就是这么简单,不过不建议用毫米为单位,因为这样图片容易误差,这是因为绘制时会将毫米转换成像素。

很明显用毫米来绘制时会有间隙

懒得排版,事多,溜了溜了。

前方高能提醒,代码很乱,不用谢。

https://files.cnblogs.com/files/zlyxm/DemoPrint_zlyxm.rar

C# 图片打印杂谈的更多相关文章

  1. 将图片打印到word中

    1.生成模板文件 工具类: package com.sfec.snmgr.track.utils;import com.alibam.core.wechat.util.QRCodeUtil;impor ...

  2. Fr3设置图片打印

    见 fr3的文件内容,为xml <?xml version="1.0" encoding="utf-8"?> <TfrxReport Vers ...

  3. vc下打印透明背景图片

    一.前言 刚接到个任务,要把带有透明背景的章子图片打印出来,开始觉得不是很简单吗,直接用vc自动生成的打印功能不就ok了.不过问题却不是想像的那么简单! 二.窗口中显示透明图片 在窗口中显示图片,可以 ...

  4. C#双面打印解决方法(打印word\excel\图片)

    最近需要按顺序打印word.excel.图片,其中有的需要单面打印,有的双面.网上查了很多方法.主要集中在几个方式解决 1.word的print和excel的printout里设置单双面 2.prin ...

  5. c# winform 解决PictureBox 无法打印全部图片的问题

    一.   问题描述 在页面使用PictureBox 加载资料图片后,点击“打印”,只能打印图片首页,较大图片则无法全部打印. 二.   原因分析 PictureBox中打印图片时没有设置继续打印相关属 ...

  6. C#:使用FastReport打印带图片传参模板的实现方法

    大家都知道,C#打印图片可以直接调用PrintDocument控件的PrintPage事件,通过画刷对image对象直接进行绘制.但是这种方法存在局限,例如如果打印的图片需要按纸张大小进行缩放的话,那 ...

  7. LODOP打印图片水平居中

    其他居中,查看本博客相关博文:LODOP中打印项水平居中简短问答.图片也属于超文本打印项,因此如果想把图片居中,也需要图片本身内容相对于图片打印项宽度居中,然后再设置打印项居中.如图,同一张图片,都设 ...

  8. 自定义Chrome的console(样式、打印图片、开关)

    1.常用console类型 console.log() 常规打印 console.warn() 打印警告信息 console.error() 打印错误信息 console.time() 和 conso ...

  9. Web打印--Lodop API

    Lodop是一款专业的WEB打印控件,其设计目标是简单易用.功能足够强大,开创WEB打印开发的新局面. Lodop设计者对WEB下的打印开发任务进行了分类汇总,高度抽象,设计出仅用几个功能函数,就可实 ...

随机推荐

  1. hdu 4300 Clairewd’s message(kmp/扩展kmp)

    题意:真难懂.. 给出26个英文字母的加密表,明文中的'a'会转为加密表中的第一个字母,'b'转为第二个,...依次类推. 然后第二行是一个字符串(str1),形式是密文+明文,其中密文一定完整,而明 ...

  2. oracle实例的内存(SGA和PGA)调整,优化数据库性能

    一.名词解释 (1)SGA:SystemGlobal Area是OracleInstance的基本组成部分,在实例启动时分配;系统全局域SGA主要由三部分构成:共享池.数据缓冲区.日志缓冲区. (2) ...

  3. python中的编码和解码

    计算机中常见的编码方式有多种,英文一般是ascii编码,其他有unicode,utf-8,gbk,utf-16等编码. 常见编码方式: ASCII编码:ASCII是早期的编码,包含英文字母.数字和 ...

  4. codevs3955最长严格上升子序列

    传送门  时间限制: 1 s  空间限制: 256000 KB  题目等级 : 钻石 Diamond   题目描述 Description 给一个数组a1, a2 ... an,找到最长的上升降子序列 ...

  5. 【hyddd驱动开发学习】DDK与WDK

    最近尝试去了解WINDOWS下的驱动开发,现在总结一下最近看到的资料. 1.首先,先从基础的东西说起,开发WINDOWS下的驱动程序,需要一个专门的开发包,如:开发JAVA程序,我们可能需要一个JDK ...

  6. uoj103 apio2014 Palindromes

    题目链接:http://uoj.ac/problem/103 题解: 首先,我们可以用后缀自动机算出每个字符串的出现次数.然后我们可以用manacher找出所有不同的回文串(o(n)个),统计答案即可 ...

  7. PostgreSQL 图形化客户端工具的使用技巧你都get了吗?

    PostgreSQL 数据库作为目前功能较强大的开源数据库,得到了广泛应用.其中,TSA就用到了这款数据库来存储处理后的一些业务数据.虽然PostgreSQL自身提供了命令行交互式客户端工具psql, ...

  8. 879C

    贪心 题目看错了...还以为是从操作序列中选5个...然后半个小时没了... 我们把每位分别用0和1带入,看看返回值是什么,然后分类讨论.千万不用特判!!!之前忘了删了就fst... #include ...

  9. 洛谷 - P2730 - 魔板 Magic Squares - bfs

    写状态转移弄了很久,老了,不记得自己的数组是怎么标号的了. #include <bits/stdc++.h> using namespace std; #define ll long lo ...

  10. 51nod 1267【二分】

    思路: 首先我们能够很容易地想到,4个数的和,拆成两两相加:a+b=-c-d; 我们也能很轻松地求出两两之和,但是呢..不同的和会存在相同的值相加,所以还要排除这个条件.具体操作就是标记一下,然后将和 ...