C#怎么实现页面打印功能?有相应控件吗?代码怎么写?有例子更好,谢谢!

C#怎么实现页面打印功能?有相应控件吗?代码怎么写?有例子更好,谢谢!,第1张

Winform里集成了几个打印控件:PrintPreviewDialog,PrintDocument,PrintDialog,PageSetupDialog,PrintPreviewControl,看书看资料会把人看晕,实际上打印核心控件只有一个,就是PrintDocument,PrintPreviewDialog也有点用,就是页面预览控件,真正开发中如果需要打印功能,一般会从网上Down现成的控件,如果要自己手动写,费时又费力,本着学习的态度,我们需要知道打印是怎么实现的,写两个比较常用的打印服务,一个是打印DataTable的,另一个是打印TextBox的。
示例一:以表格形式打印DataTable内的数据
//定义全局变量count,储存当前打印的行数
int count=0;
//定义一个方法,接收一个DataTable类型参数及PrintDocument的PrintPage事件传入的参数e以方便 *** 作
private voidPrintTable(DataTable dt, SystemDrawingPrintingPrintPageEventArgse)
{
//取得对应的Graphics对象
Graphicsg = eGraphics;
//获得相关页面X坐标、Y坐标、打印区域宽度、长度
intx = ePageSettingsMarginsLeft;
inty = ePageSettingsMarginsTop;
intwidth = ePageSettingsPaperSizeWidth -ePageSettingsMarginsLeft- ePageSettingsMarginsRight;
intheight = ePageSettingsPaperSizeHeight -ePageSettingsMarginsTop -ePageSettingsMarginsBottom;
//定义打印字体
Fontfont = new Font("宋体",15);
//rowCount是除去打印过的行数后剩下的行数
introwCount = dtRowsCount-count;
//maxPageRow是当前设置下该页面可以打印的最大行数
intmaxPageRow=height/(int)fontGetHeight();
//因为是表格,先画一条水平直线
gDrawLine(newPen(BrushesBlack, 1), new Point(x, y), new Point(x +(dtColumnsCount) 135, y));
//再画出表格各列的列标题
for(int i = 0; i < dtColumnsCount; i++)
{
stringhead = dtColumns[i]ColumnName;
gDrawString(head,font, BrushesBlack, x + i 135, y);
}
//画完标题,再画一条直线
gDrawLine(newPen(BrushesBlack, 1), new Point(x, y + (int)fontGetHeight()), newPoint(x + (dtColumnsCount) 135, y +(int)fontGetHeight()));
//判断,如果剩下的行数小于可打印的最大行数,则执行下列代码
if(maxPageRow >=rowCount)
{
//当前行数小于Table内总行数时,循环
while(count < dtRowsCount)
{
//内循环打印Table内行数据
intcolumnCount = 0;
while(columnCount < dtColumnsCount)
{
stringtemp = dtRows[count][columnCount]ToString();
//打印每个单元格内的数据
gDrawString(temp,font, BrushesBlack, x + columnCount 135, y + (count %maxPageRow) (int)fontGetHeight() +(int)fontGetHeight());
//打印完一行后,继续打印一条直线
gDrawLine(newPen(BrushesBlack, 1), new Point(x, y + (count % maxPageRow) (int)fontGetHeight() + 2 (int)fontGetHeight()), new Point(x +(dtColumnsCount) 135, y + (count % maxPageRow) (int)fontGetHeight() + 2 (int)fontGetHeight()));
columnCount++;
}
count++;
}
//所有数据打印完毕后,打印垂直直线
for (int i = 0; i <= dtColumnsCount; i++)
{
gDrawLine(newPen(BrushesBlack), new Point(x + i 135, y), new Point(x + i 135, y + rowCount (int)fontGetHeight() +(int)fontGetHeight()));
}
}
//判断,如果剩下的行数大于可打印的最大行数,则执行下列代码
else
{
do
{
//与上面类似,注意下面while的条件
intcolumnCount = 0;
while(columnCount < dtColumnsCount)
{
stringtemp = dtRows[count][columnCount]ToString();
//打印每个单元格
gDrawString(temp,font, BrushesBlack, x + columnCount 135, y + (count %maxPageRow) (int)fontGetHeight() +(int)fontGetHeight());
//打印水平直线
gDrawLine(newPen(BrushesBlack, 1), new Point(x, y + (count % maxPageRow) (int)fontGetHeight() + 2 (int)fontGetHeight()), new Point(x +(dtColumnsCount)135, y + (count % maxPageRow) (int)fontGetHeight() + 2 (int)fontGetHeight()));
columnCount++;
}
count++;
}while ((count % maxPageRow >0));
//打印垂直直线
for(int i = 0; i <= dtColumnsCount;i++ )
{
gDrawLine(newPen(BrushesBlack), new Point(x + i 135, y), new Point(x + i 135, y + height + (int)fontGetHeight()));
}
}
//指定HasMorePages值,如果页面最大行数小于剩下的行数,则返回true(还有),否则返回false
if(maxPageRow<rowCount)
{
eHasMorePages= true;
}
else
{
eHasMorePages= false;
count= 0;
}
}
奇长无比,打印的原理就是画,所有东西都是画出来的,大体思路就是这样,其他的无非就是计算跟调整间距问题,多试几次不难,我觉得最难的部分是循环取值及设置HasMorePages属性,PrintDocument的PrintPage方法是打印完一页调用一次,因此当自己做打印设置时,需要清楚的知道哪些变量需要储存为全局变量以方便记录打印位置,HasMorePages属性也需要注意,是不是只需要一个条件就可以指定其值,很多情况下需要多个条件同时满足,另外对画表格这种事情来说,前几页跟最后一页while里条件写法肯定是不同的,写一起就乱套了,最后,在给HasMorePages设置为false后,不要忘记把你的全局变量恢复初始值,否则连点两下打印预览就没数据了,以上是A4大小,如果只实现简单打印,这样足够了,如果设计到调整页面,设置字体等等,抱歉,做不了,这就需要网上DOWN现成的了。下一个说说TextBox里的文本打印。
示例二:文本打印
//设置全局变量保存截取字符串位置
int sub=0;
private void printText(stringtext, SystemDrawingPrintingPrintPageEventArgs e)
{
//取得Graphics实例
Graphics g = eGraphics;
//获得相关点坐标、长度、宽度
int x = ePageSettingsMarginsLeft;
int y = ePageSettingsMarginsRight;
int width =ePageSettingsPaperSizeWidth-ePageSettingsMarginsLeft-ePageSettingsMarginsRight;
int height =ePageSettingsPaperSizeHeight-ePageSettingsMarginsTop-ePageSettingsMarginsBottom;
//设置字体
Font font=new Font("宋体",15);
//这个方法后面讲
gMeasureString(textSubstring(sub), font, new SizeF(width,height-10), new StringFormat(), out charnum, out line);
//打印string
gDrawString(textSubstring(sub), font, BrushesBlack, newRectangleF(x, y, width, height), newStringFormat());
//设置截取位置
sub += charnum;
//设置HasMorePage属性
if (sub < thistxtTextTextLength)
{
eHasMorePages = true;
}
else
{
eHasMorePages = false;
sub=0;
}
}
注意问题有这么几点,MeasureString方法单独拿出来说,此方法的通俗理解就是,把一个字符串按照指定的矩形区域、字符串格式、字体选取,并在选取后将字符数量,所需行数保存在两个outint变量中,第一个参数,需要 *** 作的字符串;第二个,字体;第三个,区域;第四个,字符串的格式化样式;第五个,字符个数;第六个,所需行数。注意的是两个outint类型的参数,这里跟ref类型差不多,当传递参数的时候,实际传递的是参数的地址,因此在方法内部对参数做了修改之后,会反应到源数据上,因此在执行完这个方法后,你所传递进来的两个参数已经保存了相关信息。DrawString方法也使用了其中一个带有RectangleF参数的重载方法,目的是与MeasureString相吻合,注意我划线几个地方的写法,注意MeasureString中第一个参数string同样需要截取。
两个例子说完了,下面说说怎么调用打印方法:
//打印预览
private voidbutton2_Click(object sender, EventArgs e)
{
//注意指定其Document属性
thisprintPreviewDialog1Document = thisprintDocument1;
thisprintPreviewDialog1ShowDialog();
}
//打印
private voidbutton1_Click(object sender, EventArgs e)
{
//同样注意指定Document属性
thisprintDialog1Document = thisprintDocument1;
if (thisprintDialog1ShowDialog() == DialogResultOK)
{
//触发PrintDocument的PrintPage事件
thisprintDocument1Print();
}
}

ACTIVEX控件和插件的问题,在工具-INTERNET选项-安全-自定义级别中把ACTIVEX控件和插件的选项按需求改为允许或者提示,然后再从启IE ,应该就可以了。或者可以直接打印网页版。

1、打开浏览器后,点击导航上的打印机图标旁边的下箭头,进入“页面设置”,根据实际打印纸张的大小来设置纸张的大小。

2、设置完纸张大小后设置页面打印的方向,可根据自己的需要,选择纵向或是横向。

3、然后设置页面的页眉,根据需要设置,也可以选择空白。

4、设置完页眉后,设置页脚,方法同页眉,可根据自己的需要来设置,也可以设置为空白。

5、再点击下方的“更改字体”按钮,在此可以设置打印出来的文字的字体、颜色和大小进行设置,设置完后点击确定。

6、最后来设置下页面的页边距了,设置好以后在打印之前可以点击打印预览看看效果。

jatoolsPri­nter (杰表打印控件)是一款实现网页套打的专用工具。作为web应用开发者,我们经常会遇到在浏览器中打印报表、票据的需求,这些需求浏览器本身的打印功能一般不能满足, 如精确分页,套打等。这就需要有一种能解决常见的浏览器端打印问题的软件工具,这也是 jatoolsPri­nter 的研发背景。
jatoolsPri­nter 的特点是可以直接对web页面进行精确的分页打印。jatoolsPri­nter 通过在网页中嵌入控件,解决了web客户端精确打印,批量打印,打印配置自动保留等问题。 具体功能有:
1 支持设置打印参数,指定输出打印机、纸张类型,打印方向(横、竖)等 。
2 支持html格式的页脚、页眉设置,也就是说,页脚页眉可设置等,如公司logo。
3 支持程序分页与自动分页。
4 支持打印参数自动保留,待下一次打印同一票据时,自动设置,这使客户端也可以控制打印参数。
5 支持打印预览,支持预览时指定页、指定份数打印。
6 支持直接打印指定票据的URL。
7 支持票据及其附件的批量打印。
8 支持取得本机中的可用打印机,可用纸张类型列表,帮您设计出更友好的参数设置界面。
9 支持回调,可以帮助您在打印后自动处理有关事务,比如打印后自动关闭窗口、自动递交表单数据等。
10 支持票据套打时,底图仅在打印预览时显示,不输出到打印机。
11 小巧,整个控件只有60K。不需要额外的软件包支持。
12 与您项目采用的技术标准无关,J2EE、NET 项目均可。
13 IE 55+ 中适用。
杰表web打印控件,2009518正式更新42,增加套打的可视化设计功能 ,使杰表打印控件成为融设计、打印、预览于一体的web打印工具。
在以前的版本中,如果用户想设计套打模板,必须通过网页设计工具做好网页,然后,放到杰表控件中来打印,如果发现打印内容的位置有偏差,需要再在网页设计工具中调整,然后再放到控件中,如此反复多次,效 率极低。现在有了可视化设计功能,可以使用户在控件中,就能调整位置,不仅如此,由于控件中指定位置,是在真实的、可视化的打印环境中,使用户不必考虑边距的问题,做到完全的所见即所得,可大大提升套打设计的效率。更多内容
另外,我们也发现,即使是同一个套打网页,在不同的打印机中,打印出来的相对位置,也有差别,有的打印机打印出来的内容凑得紧些,有的则离得开些,这种偏差不能通过设置打印机边距的方式进行调整。借助可视化设计功能,使用户可以根据自己的打印机状况,自行调整打印内容的位置,并保存到注册表,下次打印时,自动根据自设的位置进行打印。这对有大量前台打印,并有不同类型打印机打印同一种票据的场合,非常实用。更多内容


欢迎分享,转载请注明来源:内存溢出

原文地址: https://outofmemory.cn/yw/13379707.html

(0)
打赏 微信扫一扫 微信扫一扫 支付宝扫一扫 支付宝扫一扫
上一篇 2023-07-25
下一篇 2023-07-25

发表评论

登录后才能评论

评论列表(0条)

保存