问题是这样的,打印机使用的是卷筒的连续纸,要打印的内容因为数据行数不同,高度会有变化。这时如果能在打印时动态改变纸张大小(其实只改变高度即可)当然是最好的选择。

我使用了网上久负盛名的[长江支流]的“金质打印通”做为打印控件,挺好用的。不过并不支持动态设置纸张。每次打印都使用对话框让用户进行设置肯定是不行的。

所有的代码,都是围绕“金质打印通”的CS版的OpenedCodes下的MisGoldPrinter类的构造函数展开的。下面是原始代码,供参考。

public MisGoldPrinter(bool p_IsLandscape)
{
PrinterSingleton.Reset();
mCurrentPageIndex = 1;
mCurrentRowIndex = 0;

//单一模式,全部打印对象使用下面相同的对象,提高打印速度效率
mPrintDocument = PrinterSingleton.PrintDocument;
mPrintDocument.DefaultPageSettings.Landscape = p_IsLandscape;
mPrinterMargins = PrinterSingleton.PrinterMargins;

mPrintDocument.DocumentName = "MIS金质打印通,欢迎使用!";

_sewing = new Sewing(30,SewingDirectionFlag.Left);

mPrinter = new Printer();
_body = new Body(); //主要对象,所以实例化
}

纸是400*无限大的,页边距是20,20,40,40(Left,Right,Top,Bottom)相当于5cm,5cm,10cm,10cm

先尝试了改变纸的高度:
//根据行数算高度
int h = 200 + 21 * rows + 40;
PrinterSingleton.PrintDocument.DefaultPageSettings.PaperSize.Height = h;

结果告诉我纸张大小不能修改,除非Kind是Custom。可是Kind明明就是Custom,我用控制面板在打印机那边已经设置了使用自定义纸张,单步调试时也看过了Kind属性确实是Custom,不过微软说不能改那就是不能改。

那我就new一个PaperSize,在构造时设置高度总行了吧
改成:
int h = 200 + 21 * rows + 40;
PrinterSingleton.PrintDocument.DefaultPageSettings.PaperSize = new PaperSize("name",400,h); //我的纸宽度是定值

单步调试时看了,Kind也是Custom,也打印出来东西了,不过很怪的是内容全都缩在纸中间的一小块地方,周围好大的空白,再使用金质打印通里的PageSetup重新设置页边距都不行。
于是我又加了这么一句:
PrinterSingleton.PrinterMargins = new PrinterMargins(20,20,40,40,360,160 + 21 * rows);
问题还是一样。
再次单步时发现自定义的PaperSize和正常的比少点东西,它有个RawKind成员,应该说是隐藏的属性吧,自定义的对象的RawKind成员值是 Custom,而正常的则是一个数字,比如285。再结合网上的一些意见,我想这打印机是肯定不认识自定义的PaperSize了。

逼到这个份上,只要能解决问题,怎么干都行。于是我选择了一种比较土的方法:204在 打印机上设置10几20种纸张类型,差100(合2.5cm)一个,打印时去选择最接近的。纸的名字,分别叫300,400,500...2000,方便 编程。可是怎么选纸呢?金质打印通的代码里有个自定义的PrinterPageSetting对象,可能在这里面有,不过没有公开代码(有个开源学习版也 许公开了,我没有看过,总之最后我找到答案了)
找来找去终于找的是这一句:PrinterSingleton.PrintDocument.PrinterSettings.PaperSizes,注意有s是个数组

因为我每次打印都要改变纸的高度,所以要传参数:数据行数。所以选纸的这部分代码不能再放到构造函数里了,增加了一个SetRows函数,修改后的代码如下:

public MisGoldPrinter() //p_IsLandscape参数放到SetRows里。这会导致另外一个构造函数不能要了
{
PrinterSingleton.Reset();
mCurrentPageIndex = 1;
mCurrentRowIndex = 0;

_sewing = new Sewing(30,SewingDirectionFlag.Left);

mPrinter = new Printer();
_body = new Body(); //主要对象,所以实例化
}

public void SetRows(int rows,bool p_IsLandscape)
{
//得到页高度
int h = 40 + 160 + 21 * rows + 40; //每行数据大约高21,160是我的页面的Header和MultiHeader的高度,是试出来的值,呵呵
//得到下一个接近的100的倍数
h = Convert.ToInt16(Math.Ceiling(h / 100f) * 100);

//用ps引用一下,减少代码长度
Print

移动计算的未来十年与超越

erSettings ps = PrinterSingleton.PrintDocument.PrinterSettings;
//选择合适的纸张
for(int i=0;i<ps.PaperSizes.Count;i++){
if(ps.PaperSizes[i].PaperName.Equals(Convert.ToString(h)))
{
PrinterSingleton.PrintDocument.DefaultPageSettings.PaperSize = ps.PaperSizes[i];
break;
}
}

mPrintDocument = PrinterSingleton.PrintDocument;
//设置每页有多少行
this.RowsPerPage = rows;

mPrintDocument.DefaultPageSettings.Landscape = p_IsLandscape;
//设置PrinterMargin
PrinterSingleton.PrinterMargins = new PrinterMargins(20,20,40,40,360,160 + 21 * rows);
mPrinterMargins = PrinterSingleton.PrinterMargins;

mPrintDocument.DocumentName = "MIS金质打印通,欢迎使用www.nitoxy.com,昱昱炎炎!";
}

行了。虽然最多还是可能会浪费99也就是将近2.475cm的纸,不过已经可以令人满意了

转载于:https://www.cnblogs.com/zeroone/p/3306240.html

C#.NET 打印连续纸高度动态变化(基于长江支流的金质打印通)相关推荐

  1. 谈论C#.NET 打印连续纸高度动态变化(基于长江支流的金质打印通)

    3月4日 谈论C#.NET 打印连续纸高度动态变化(基于长江支流的金质打印通) 引用 C#.NET 打印连续纸高度动态变化(基于长江支流的金质打印通) 问题是这样的,打印机使用的是卷筒的连续纸,要打印 ...

  2. 易基因:肠道菌群:早产儿出生后不同时间点肠道微生物定植的动态变化|项目文章

    易基因微生物组学测序分析成果见刊<Front Microbiol> 2023年02月17日,中国农业科学院深圳农业基因组研究所Adnan Khan.云南省第一人民医院米弘瑛为共同第一作者, ...

  3. h5 数字变化_基于JS实现数字动态变化显示效果附源码

    先给大家展示下效果,感觉不错,可以参考实现代码,文末附有源码哦. 1.目标 以液晶电子表样式,动态变化的在指定元素内显示数字. 目标关键词:动态变化(定时器),指定元素(DOM元素ID),数字(num ...

  4. 景观格局动态变化分析方法(基于ArcGIS、Fragstats、ENVI、ERDAS、Patch Analysis for ArcGIS) (2011-03-15 08:07:03)...

    转载 http://blog.sina.com.cn/s/blog_54388b830100rfod.html 分类: GIS基础与应用, 景观格局 虽然以前对该类分析已经进行过研究,并已完成过相关项 ...

  5. 面向动态环境基于点的语义SLAM系统

    点击上方"3D视觉工坊",选择"星标" 干货第一时间送达 作者:robot L | 来源:知乎 https://zhuanlan.zhihu.com/p/133 ...

  6. 微生物组数据揭示中国稻谷产毒真菌分布及仓储动态变化

    中国水稻主产区产毒真菌的分布 Distribution of mycotoxin-producing fungi across major rice production areas of China ...

  7. MIT提出Liquid机器学习系统,可像液体一样适应动态变化

    在自动驾驶等许多重要应用中,数据都是实时动态的,并且时不时还会出现一些意外情况.为了高效地应对这一问题,MIT 的研究者受生物神经元启发而设计了一种新型神经网络,并且他们还通过理论证明和实验验证体现了 ...

  8. 自定义按钮动态变化_新闻价值的变化定义

    自定义按钮动态变化 I read Bari Weiss' resignation letter from the New York Times with some perplexity. In par ...

  9. 国家粮食与物资储备局揭示中国稻谷产毒真菌分布及仓储动态变化

    中国水稻主产区产毒真菌的分布 Distribution of mycotoxin-producing fungi across major rice production areas of China ...

最新文章

  1. 私有链的特点简单介绍
  2. Mysql高并发优化
  3. 一个TreeView 样式表
  4. maven 安装_Maven的下载、安装、配置以及验证操作
  5. Ubuntu解决gedit warning问题的方法
  6. ASP.NET Core的配置(2):配置模型详解
  7. 蛋花花APP,APP开发这几点你要注意了
  8. Java泛型教程–示例类,接口,方法,通配符等
  9. 批量下载baidu音乐主页的歌曲
  10. 如何用Pygame写游戏(十六)
  11. MySQL 函数:IF(expr,v1,v2) 判断
  12. 广东省大学计算机应用基础考试试题,2021年广东省对口考试要做哪些题目?计算机应用基础(Windows7+office2010)周测月考单元卷...
  13. 聊一聊微服务之间的通讯方式
  14. String 占位符
  15. 堂食扫码点餐的小程序设计开发
  16. html5 自动矢量化,ArcScan自动矢量化
  17. python在tk界面播放本地视频_如何使用python3在tkinter窗口中插入视频播放器?
  18. 【信号处理】内插器原理和MATLAB仿真
  19. 100+大数据开源处理工具汇总
  20. 网上收集的几个花指令

热门文章

  1. 中国SaaS的破茧与进击
  2. 离散题目11(判双射函数)
  3. 小白学Java系列教程
  4. 摄影测量--各种坐标系的总结
  5. 分辨率带宽和视频带宽
  6. py文件和ipynb文件互相转换
  7. 漫画编程java_【漫画】JAVA并发编程之并发模拟工具
  8. 面向对象和线程 住宿查询大作业
  9. GPS 0183协议GGA、GLL、GSA、GSV、RMC、VTG、ZDA、DTM作者:hiphopor
  10. 计算机硬件采购,计算机硬件采购合同范本