网页WEB打印控件制作-开放源码-创新互联

在WEB系统中,打印的确是比较烦人的问题,如果我们能制作一个属于自己的自定义的打印插件,那么我们在后续自定义打印的时候能随心所欲的控制打印,这样的效果对于程序员来说是非常开心的一件事件,本文将自己开发编写的C# 制作的HTML打印插件分享出来,让有同样需求的朋友提供一个参考;此插件是基于Microsoft .NET Framework 2.0 开发的,缺点是每台客户端在安装插件时,必须要安装Microsoft .NET Framework 2.0 ;本插件能实现 页眉、页脚、表头、标题、表尾的分页打印;支持纸张类型、自动补充空行等功能;由于技术有限,肯定有很多不足的地方,请批评指正!

成都创新互联是一家专注于网站建设、网站制作与策划设计,兴庆网站建设哪家好?成都创新互联做网站,专注于网站建设十年,网设计领域的专业建站公司;建站业务涵盖:兴庆等地区。兴庆做网站价格咨询:18982081108

由于本打印插件是基于我们开发平台的报表基础来开发设计的,所以打印控件的原理:通过JS将页面表格数据生成固定格式的XML字符串(图片通过64base图片格式)传送给打印插件,有打印插件自主绘图生成打印页面。E_Print插件可以在WEB或WinForm中使用:

打印插件完整源码:E_Print.rar (包含插件源码、打包程序、winform调试DEMO)

下面贴出源码:(在源码中有详细的注释说明)

 using System;
using System.Collections.Generic;
using System.Text;
using System.Drawing;
namespace E_Print
{
    /// 
    /// 分页计算
    /// 
    public class PagingCalc
    {
        #region 私有变量
        /// 
        /// 表格区域
        /// 
        private RectangleF _tableRect;
        /// 
        /// 报表行集
        /// 
        private List _rowsList;
        /// 
        /// 是否每页打印标题
        /// 
        private bool _isAllPrintTitle;
        /// 
        /// 是否每页打印表头
        /// 
        private bool _isAllPrintHead;
        /// 
        /// 是否每页打印表尾
        /// 
        private bool _isAllPrintFoot;
        /// 
        /// 标题行集
        /// 
        private List TitleList;
        /// 
        /// 表头前行集
        /// 
        private List HForeList;
        /// 
        /// 表头行集
        /// 
        private List HeadList;
        /// 
        /// 数据行集
        /// 
        private List DataList;
        /// 
        /// 表尾行集
        /// 
        private List FootList;
        /// 
        /// 每页打印标题+表头高度
        /// 
        private float _myHeadPix;
        /// 
        /// 每页打印表尾高度
        /// 
        private float _myFootPix;
        #endregion
        #region 构造方法
        /// 
        /// 构造函数
        /// 
        public PagingCalc()
        {
            _tableRect = new RectangleF();
            _rowsList = new List();
            _isAllPrintTitle = false;
            _isAllPrintHead = false;
            _isAllPrintFoot = false;
            TitleList = new List();
            HForeList = new List();
            HeadList = new List();
            DataList = new List();
            FootList = new List();
            _myHeadPix = 0;
            _myFootPix = 0;
        }
        #endregion
        #region 属性方法
        /// 
        /// 获取--设置--表格区域
        /// 
        public RectangleF TableRect
        {
            get { return _tableRect; }
            set { _tableRect = value; }
        }
        /// 
        /// 获取--设置--表格行集
        /// 
        public List RowsList
        {
            get { return _rowsList; }
            set { _rowsList = value; }
        }
        /// 
        /// 获取--设置--是否每页打印标题
        /// 
        public bool IsAllPrintTitle
        {
            get { return _isAllPrintTitle; }
            set { _isAllPrintTitle = value; }
        }
        /// 
        /// 获取--设置--是否每页打印表头
        /// 
        public bool IsAllPrintHead
        {
            get { return _isAllPrintHead; }
            set { _isAllPrintHead = value; }
        }
        /// 
        /// 获取--设置--是否每页打印表尾
        /// 
        public bool IsAllPrintFoot
        {
            get { return _isAllPrintFoot; }
            set { _isAllPrintFoot = value; }
        }
        /// 
        /// 获取--设置--每页打印标题+表头高度
        /// 
        public float MyHeadPix
        {
            get { return _myHeadPix; }
            set { _myHeadPix = value; }
        }
        /// 
        /// 获取--设置--每页打印表尾巴高度
        /// 
        public float MyFootPix
        {
            get { return _myFootPix; }
            set { _myFootPix = value; }
        }
        #endregion
        #region 计算方法
        /// 
        /// 分页计算
        /// 
        /// 
        public List CalcPages()
        {
            List retPages = new List();
            // 无需分页
            if (Get_TableAllHeight() <= TableRect.Height)
            {
                PagingItem tmItem0 = new PagingItem();
                tmItem0.PageNum = 1;
                for (int y = 0; y < RowsList.Count; y++)
                {
                    tmItem0.IndexList.Add(y);
                }
                retPages.Add(tmItem0);
            }
            else  // 需要分页
            {
                // 有设置了 每页打印标题、表头、表位 其中的任意一个
                if (Get_IsCusSet_THDF())  // 则执行每页相对分页
                {
                    Paging_Relative(0, ref retPages);
                    // 计算每页打印头尾高度
                    MyHeadPix = 0;
                    if (IsAllPrintTitle)
                    {
                        MyHeadPix += Get_TableTileHeight();
                    }
                    if (IsAllPrintHead)
                    {
                        MyHeadPix += Get_TableHeadHeight();
                    }
                    if (IsAllPrintFoot)
                    {
                        MyFootPix = Get_TableFootHeight();
                    }
                }
                else  // 执行直接数据分页
                {
                    Paging_Direct(0, ref retPages);
                }
            }
            return retPages;
        }
        /// 
        /// 直接分页
        /// 
        /// 开始行号
        /// 页面数组
        private void Paging_Direct(int startR, ref  List pages)
        {
            float p_Height = TableRect.Height;
            PagingItem p_Item = new PagingItem();
            p_Item.PageNum = pages.Count + 1;
            for (int t = startR; t < RowsList.Count; t++)
            {
                // 检查行内单元格是否不允许分页两种情况:条形码,图片
                if (Paging_CheckCell(RowsList[t], p_Height))
                {
                    startR = t;
                    pages.Add(p_Item);
                    Paging_Direct(startR, ref pages);
                    break;
                }
                else
                {
                    p_Height -= RowsList[t].RowHeight;
                    if (p_Height <= 0)
                    {
                        startR = t;
                        pages.Add(p_Item);
                        Paging_Direct(startR, ref pages);
                        break;
                    }
                    else
                    {
                        p_Item.IndexList.Add(t);
                        if (t == RowsList.Count - 1)
                        {
                            pages.Add(p_Item);
                        }
                    }
                }
            }
        }
        /// 
        /// 相对分页
        /// 
        /// 开始序号
        /// 页面数组
        private void Paging_Relative(int startR, ref  List pages)
        {
            SplitReportArea();                     // 拆分表行
            float p_Height = TableRect.Height;     // 页面总高
            PagingItem p_Item = new PagingItem();  // 分页页面
            p_Item.PageNum = pages.Count + 1;      // 分页页码
            bool runNext = false;                  // 继续分页
            #region 每页打印标题
            // 每页打印标题
            if (IsAllPrintTitle)
            {
                p_Height -= Get_TableTileHeight();
                foreach (Row p_Row in TitleList)
                    p_Item.IndexList.Add(p_Row.RowIndex);
            }
            else
            {
                if (p_Item.PageNum == 1)  // 第一页特殊处理
                {
                    p_Height -= Get_TableTileHeight();
                    foreach (Row p_Row in TitleList)
                        p_Item.IndexList.Add(p_Row.RowIndex);
                }
            }
            #endregion
            #region 每页打印表头
            // 每页打印表头
            if (IsAllPrintHead)
            {
                if (p_Item.PageNum == 1)  // 第一页特殊处理
                {
                    // 计算表头前的行高
                    p_Height -= Get_TableHForHeight();
                    foreach (Row p_Row in HForeList)
                        p_Item.IndexList.Add(p_Row.RowIndex);
                }
                // 计算表头行的高度
                p_Height -= Get_TableHeadHeight();
                foreach (Row p_Row in HeadList)
                    p_Item.IndexList.Add(p_Row.RowIndex);
            }
            else
            {
                if (p_Item.PageNum == 1)  // 第一页特殊处理
                {
                    // 计算表头前的行高
                    p_Height -= Get_TableHForHeight();
                    foreach (Row p_Row in HForeList)
                        p_Item.IndexList.Add(p_Row.RowIndex);
                    // 计算表头行的高度
                    p_Height -= Get_TableHeadHeight();
                    foreach (Row p_Row in HeadList)
                        p_Item.IndexList.Add(p_Row.RowIndex);
                }
            }
            #endregion
            #region 每页数据区域
            // 每页数据划分
            if (IsAllPrintFoot)
            {
                p_Height -= Get_TableFootHeight();             // 表格高度 先减去表尾的高度
            }
            for (int t = startR; t < DataList.Count; t++)
            {
                // 检查行内单元格是否不允许分页两种情况:条形码,图片
                if (Paging_CheckCell(DataList[t], p_Height))  // 此情况下,单元格不能分割,并且高度超过页面剩余高度,所以要启动新的一页
                {
                    startR = t;
                    runNext = true;
                    break;
                }
                else
                {
                    p_Height -= DataList[t].RowHeight;
                    if (p_Height <= 0)
                    {
                        startR = t;
                        runNext = true;
                        break;
                    }
                    else
                    {
                        p_Item.IndexList.Add(DataList[t].RowIndex);
                    }
                }
            }
            #endregion
            #region 每页打印表尾
            // 每页打印表尾
            if (IsAllPrintFoot)
            {
                foreach (Row p_Row in FootList)
                    p_Item.IndexList.Add(p_Row.RowIndex);
            }
            #endregion
            #region 添加分页页面
            pages.Add(p_Item);
            if (runNext)
            {
                Paging_Relative(startR, ref pages);
            }
            #endregion
        }
        /// 
        /// 检查行内单元格如果是图片
        /// 并且合并行数大于1
        /// 
        /// 
        /// 
        /// 
        private bool Paging_CheckCell(Row cRow, float cHeight)
        {
            foreach (Cell cCell in cRow.RowCells)
            {
                if (cCell.IsImage == true)
                {
                    if (cCell.RectH > cHeight)
                        return true;
                }
            }
            return false;
        }
        #endregion
        #region 辅助方法
        /// 
        /// 获取--报表全部高度
        /// 
        /// 
        private float Get_TableAllHeight()
        {
            float retHight = 0;
            for (int k = 0; k < RowsList.Count; k++)
            {
                Row t_Row = RowsList[k];
                retHight += t_Row.RowHeight;
            }
            return retHight;
        }
        /// 
        /// 获取是否设置了标题、表头、表尾 中的任意一个
        /// 
        /// 
        private bool Get_IsCusSet_THDF()
        {
            string tmType = "";
            foreach (Row cusRow in this.RowsList)
            {
                tmType = cusRow.RowType.ToLower().Trim();
                if (tmType == "t" || tmType == "h" || tmType == "f")
                    return true;
            }
            return false;
        }
        /// 
        /// 获取--报表标题高度
        /// 
        /// 
        private float Get_TableTileHeight()
        {
            float retHight = 0;
            for (int k = 0; k < TitleList.Count; k++)
                retHight += TitleList[k].RowHeight;
            return retHight;
        }
        /// 
        /// 获取--报表表头前高度
        /// 
        /// 
        private float Get_TableHForHeight()
        {
            float retHight = 0;
            for (int k = 0; k < HForeList.Count; k++)
                retHight += HForeList[k].RowHeight;
            return retHight;
        }
        /// 
        /// 获取--报表表头高度
        /// 
        /// 
        private float Get_TableHeadHeight()
        {
            float retHight = 0;
            for (int k = 0; k < HeadList.Count; k++)
                retHight += HeadList[k].RowHeight;
            return retHight;
        }
        /// 
        /// 获取--报表表尾高度
        /// 
        /// 
        private float Get_TableFootHeight()
        {
            float retHight = 0;
            for (int k = 0; k < FootList.Count; k++)
                retHight += FootList[k].RowHeight;
            return retHight;
        }
        /// 
        /// 拆分报表区域
        /// 
        public void SplitReportArea()
        {
            TitleList = new List();
            HForeList = new List();
            HeadList = new List();
            DataList = new List();
            FootList = new List();
            for (int m = 0; m < RowsList.Count; m++)
            {
                Row mmRow = RowsList[m];
                switch (mmRow.RowType.ToLower())
                {
                    case "t": // 标题
                        TitleList.Add(mmRow);
                        break;
                    case "h": // 表头
                        HeadList.Add(mmRow);
                        break;
                    case "f": // 表尾
                        FootList.Add(mmRow);
                        break;
                    case "d": // 数据
                    default:
                        DataList.Add(mmRow);
                        break;
                }
            }

            // 设置表头前行集
            if (TitleList.Count == 0 && HeadList.Count > 0)
            {
                List tmpList = new List();
                for (int n = 0; n < DataList.Count; n++)
                {
                    if (DataList[n].RowIndex < HeadList[0].RowIndex)
                    {
                        HForeList.Add(DataList[n]);
                        tmpList.Add(DataList[n]);
                    }
                }
                for (int n = 0; n < tmpList.Count; n++)
                {
                    DataList.Remove(tmpList[n]);
                }
                tmpList.Clear();
            }
            // 重设表尾  不是每页打印表尾情况下,那么表位就去掉
            if (!IsAllPrintFoot)
            {
                foreach (Row tRow in FootList)
                    DataList.Add(tRow);
                FootList.Clear();
            }
        }
        #endregion
    }
}

创新互联www.cdcxhl.cn,专业提供香港、美国云服务器,动态BGP最优骨干路由自动选择,持续稳定高效的网络助力业务部署。公司持有工信部办法的idc、isp许可证, 机房独有T级流量清洗系统配攻击溯源,准确进行流量调度,确保服务器高可用性。佳节活动现已开启,新人活动云服务器买多久送多久。


标题名称:网页WEB打印控件制作-开放源码-创新互联
分享URL:http://myzitong.com/article/jgcsd.html