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

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

所有的代码,都是围绕“金质打印通”的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的纸,不过已经可以令人满意了

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

  1. 上下div高度动态自适应--另类处理方案

    这段时间在工作中遇到一个看似较为棘手的问题.问题描述:查询报表页面分为上下两部分,上部分为条件输入区域,下部分为报表展示区域.客户要求做到默认满屏(但要动态适应不同的窗体大小,也就是浏览器窗体用户会手 ...

  2. SignalR2结合ujtopo实现拓扑图动态变化

    上一篇文章基于jTopo的拓扑图设计工具库ujtopo,介绍了拓扑设计工具,这一篇我们使用SignalR2结合ujtopo实现拓扑图的动态变化. 仅仅作为演示,之前的文章SignalR2简易数据看板演 ...

  3. iframe高度动态自适应

    by zhangxinxu from http://www.zhangxinxu.com本文地址:http://www.zhangxinxu.com/wordpress/?p=1294 一.前言碎碎念 ...

  4. jQuery Validate input是动态变化的

    表单验证 $("#dataList").append("<div id='data"+dataNum+"' style='padding-top ...

  5. HighCharts 图表高度动态调整

    HighCharts 图表高度动态调整 前言 在使用HighCharts控件过程中,发现图表可以自适应div的高度,无法根据图表x.y轴的数量动态调整div高度,否则图标挤在一起,看起来非常不美观,也 ...

  6. textarea高度跟随文字高度而变化

    html部分: <textarea id="textarea">哈喽哈喽哈喽哈喽哈喽哈喽哈喽哈喽哈喽哈喽哈喽哈喽</textarea> js部分: < ...

  7. iOS - Label 数字动态变化

    1.数字动态变化 具体实现代码见 GitHub 源码 QExtension QCountingLabel.h /// 文本数字变化方式枚举 typedef NS_ENUM(NSUInteger, QC ...

  8. js实现页面时间动态变化

    利用函数嵌套和setTimeout函数实现时间动态变化 var myDate = new Date(); myDate.getYear(); //获取当前年份(2位) myDate.getFullYe ...

  9. vue项目 菜单侧边栏随着右侧内容盒子的高度实时变化

    测试的时候发现,在选择模板.选择产品第二步第三步的时候.如果超出两行的话会盖住看不见,(因为高度所有统一都被写死了,又加了overflow~emmm~)所以要改成走马灯形式.如图: 那么问题来了,我步 ...

随机推荐

  1. STL 常见容器

    vector: 是一种在结尾处高效插入.删除的容器,本质上是一个动态数组,可以自动维护数组的空间分配.它也允许在开头和中间插入.删除数据,但是效率极低. <span style="fo ...

  2. 自定义弹出div对话框

    <style type="text/css"> html,body{height:100%;overflow:hidden;} body,div,h2{margin:0 ...

  3. mvc框架下,怎样用cookie实现下次自动登录

    登录时有个下次自动登录的checkBox.点了它下次就可以自动登录了 具体流程我都晓得,就是细节的地方有些搞不定.我只要解决3个问题: (1)登录时如果点了checkbox,则在本机产生一个cooki ...

  4. hdu 2079 选课时间

    hdu 2079 选课时间 题意:选的学分总和为n,并且学分为a的课有b种,总共有K(1<=k<=8)种学分不同的课,并且要选的学分最多为40:问选课方案有多少种?(学分相同的课即认为相同 ...

  5. 2014年度辛星css教程夏季版第三节

    第二节我们讲述的几乎全是CSS的选择器,那么下面这一节我们来讲一下CSS的颜色和文本的一些东西,虽然我对调色不大敏感,但是对于颜色还是比较感兴趣的. *********CSS中的颜色********* ...

  6. Kinetic使用注意点--animation

    new Animation(func, layers) 参数: func:每一帧都会调用一次此函数.此函数接收一个包含四个元素的参数对象,时间单位均为毫秒. { timeDiff:"上一帧和 ...

  7. Amazon Alexa 语音识别1 : 简介

    Alexa是Amazon自家的语音识别技术,需要配合自家的Echo音箱使用.开发者可以在Amazon上建立自己的程序(Skill)来连接到自己的应用或是硬件.例如,用户家里有一套xx牌的智能灯,现在希 ...

  8. VS2010制作网站自定义安装程序 转

    最近在把一个网站打包成安装程序,这方面的文章网上有很多,也看了不少,但因为开发环境的不同,遇到了一些问题,便写下这篇文章记下整个流程(有很多资源都来自互联网,由于条目颇多,所以无法说明其来处,敬请谅解 ...

  9. oracle----删除数据

    1. 删除数据:delete语句: 语法: DELETE FROM table_name; (1),无条件删除: SQL> create table testdel as select * fr ...

  10. BZOJ 3969 Low Power 解题报告

    我们首先将所有电池排序,那么我们可以找到一组最优方案,使得一台机器的能量之差是相邻两电池的能量之差. 然后我们就二分这个答案,从前往后贪心地选这个数对,然后看是否所有的数对都是满足条件的. 假设这个数 ...