lodop打印控件 实现批量打印

Lodop是什么? 官网链接

  • 有人说她是Web打印控件,因为她能打印、在浏览器中以插件的形式出现,用简单一行语句就把整个网页打印出来;
  • 有人说她是打印编程接口,因为她介于浏览器和打印设备之间,是个通道和桥梁,几乎能想到的打印控制事项都能做到;
  • 有人说她是JavaScript的扩展,因为她所有功能就那么几个语句,和JS语法一样,一看就明白个究竟;
  • 有人说她是报表打印工具,因为那个add_print_table语句把报表统计的那点事弄了个明明白白;
  • 有人说她是条码打印工具,因为用了她再也不用后台生成条码图片了,前端一行指令就动态输出清晰准确的条码,一维二维都行;
  • 有人说她是图表打印工具,因为用她能输出几乎能想象的任何图表,虽然没那么豪华,但什么饼图、折线图、柱图甚至复合图等等都不在话下;
  • 有人说她是个小玩意,因为她体积太小了,才2M多,她所包含的其中任何一个对照工具都是她的好几倍(例如条码打印控件、图表控件等);
  • 有人说她是套打教案,因为以Lodop+JS实现套打这种模式,在网上已被吵吵为教科书般的解决方案;
  • 有人说她是Web打印控件的“终结者”,因为接触“她”后再不想别的“她”;
  • 有人说她就是一个Web编程小工具,因为有了她,在BS下的打印终于像cs下那种随意而高效了;
  • 但我们说,她是全国1000多家软件公司的智慧结晶,诞生10年了,几乎每个功能细节都蕴藏着无数开发者的期待和汗水;
  • 她就是Lodop(读音“劳道谱”),没有别的名称,她是web开发的必选伴侣;
  • 现在,她又添了个小兄弟,名叫C-Lodop(可编程的云打印),未来将由他开创.....

官网中有很多例子 不再赘述

Lodop打印控件批量打印的方式:
1.批量打印每页内容相同的:
(1)批量打印相同内容的很多纸张,可以设置打印份数,把该内容打印出多份。
2.批量打印每页不同内容的:
(1)通过在一个任务中分页,循环添加页数,每页添加不同内容,一个任务中打印多页。
(2)一个任务中一页,循环多个任务,每个任务添加不同内容。
(3)多任务与多页相结合,既分页又分任务,循环多任务,每个任务中循环多页。

使用建议:
1.批量打印同样的内容,可用多份,需要多少份打印多少份。
2.批量打印不同内容,页数很少,每页内容也很少,需要预览,可在一个任务中分多页。
3.批量打印不同内容,页数很少,不需要预览,直接打印,可一个任务分页,也可一页分多任务,均可。
4.批量打印大批量不同内容,内容多,页数很多,建议分页分任务,分组打印,提高打印性能。

打印过多页,不拆分任务,打印成百上千复杂页面,会导致需要等待一段时间,例如点语句后可能很久才出现预览界面。
打印上千上万个任务,任务太多,对操作系统负担大,可酌情分页,分页分任务进行折中处理。

简单来说,就是相同内容,可设份数。
不同内容,可多任务,可任务中分页,可多任务+分页进行组合分组。

批量多任务打印的时候,如果都是相同的模版,可以用同一个Lodop任务名,如果担心打印机队列里都是统一名称,无法区分,可用语句控制,为每个任务取不同的打印机队列名,方法可查看本博客的相关博文:

LODOP循环多任务 同模版只设置不同队列任务名

Lodop打印语句最基本结构介绍(什么是一个任务)
Lodop中的一个任务,就是从PRINT_INIT(或PRINT_INITA)初始化到PRINT(或预览等),是一个任务。

方法:
设置打印份数:
LODOP.SET_PRINT_COPIES(4);//设置打印三份
LODOP.SET_PRINT_COPIES(document.getElementById('T6').value);//设置打印名为T6文本框里输入的值的份数。

设置一个任务分多页,没页内容不同:
初始化//任务开始
for (设置循环)
{
分页语句
根据循环添加不同打印项
}
打印(或预览)//任务结束

设置多个任务,循环多任务:
for (设置循环)
{
初始化//任务开始
根据循环添加不同打印项
打印(或预览)//任务结束
}

设置分页分任务,分组打印,
for (设置循环)
{
初始化//任务开始
for (设置循环)
{
分页语句
根据循环添加不同打印项
}
打印(或预览)//任务结束
}

例如,如下四个方法代码,实现打印四张:
第一个把相同的内容打印四份
第二个一个任务打印四页
第三个打印四个任务
第四个,打印两个任务,每个任务两页,共打印四页。

具体演示会代码:

当中的console.log是由于分2页为一个任务,打印两个任务,需要确定数组下标是0,1,2,3,所以加了个console.log查看一下循环中每次i+j的值是否是否正确。

<head>
<meta http-equiv="Content-Type" content="text/html; charset=utf-8" />
<title>WEB打印控件LODOP</title>
<script language="javascript" src="LodopFuncs.js"></script>
</head>
<body><input type="text" id="T6" size="2" value="4" name="copies">
<a href="javascript:prn1_preview()">预览打印多份一样的内容</a><br>
<a href="javascript:prn1_preview2()">预览打印多页</a><br>
<a href="javascript:prn1_preview3()">直接打印多任务</a><br>
<a href="javascript:prn1_preview4()">直接打印分页分任务 分组打印</a>
<script language="javascript" type="text/javascript">   
        var LODOP; //声明为全局变量 
    function prn1_preview() {//批量打印相同内容可以用份数
        LODOP=getLodop(); 
        LODOP.PRINT_INIT("");
        LODOP.SET_PRINT_PAGESIZE(1,300,500,""); 
        LODOP.SET_PRINT_COPIES(document.getElementById('T6').value);
        LODOP.ADD_PRINT_TEXT(75,6,100,20,"一个文本");
        //LODOP.PRINT_DESIGN();
        LODOP.PREVIEW();    
    };
    function prn1_preview2() {    //一个任务中循环多页,每页内容不同
         LODOP=getLodop();  
          var wenben=["一号文本","二号文本","三号文本","四号文本"];
         LODOP.PRINT_INIT("");//初始化在循环外
         LODOP.SET_PRINT_PAGESIZE(1,300,500,"");
         for (i=0;i<wenben.length;i++)
      {  
         LODOP.NewPage();
         LODOP.ADD_PRINT_TEXT(75,6,100,20,wenben[i]);
      }
        //LODOP.PRINT_DESIGN();
        LODOP.PREVIEW();
    };
    function prn1_preview3() {    //循环多个任务,每个任务内容不同
         LODOP=getLodop();  
         var wenben=["一号文本","二号文本","三号文本","四号文本"];
          for (i=0;i<wenben.length;i++)
      {  
        LODOP.PRINT_INIT("");//初始化在循环中
        LODOP.SET_PRINT_PAGESIZE(1,300,500,"");
        LODOP.ADD_PRINT_TEXT(75,6,100,20,wenben[i]);   
        LODOP.PRINT(); 
   }
    };
   function prn1_preview4() {    //循环多个任务,任务中循环页数,分页分任务
         LODOP=getLodop();  
         var wenben=["一号文本","二号文本","三号文本","四号文本"];
          for (i=0;i<4;i=i+2)
      {  
        LODOP.PRINT_INIT("");//初始化在外循环中
        LODOP.SET_PRINT_PAGESIZE(1,300,500,"");
               for (j=0;j<2;j++)
             {   
             console.log(i+j);
             LODOP.ADD_PRINT_TEXT(75,6,100,20,wenben[i+j]);
             LODOP.NewPage();              
             }  
        //LODOP.PRINT_DESIGN(); 
        LODOP.PRINT(); 
   }
    };
</script> 
</body>
image.png

简单点描述,就是循环多页,在任务中循环页数;循环多任务,直接循环多任务。

数据和页数过多,需要分页分任务,分组打印,提高性能。

注意,批量打印建议用直接打印,如果用预览,lodop会弹出多次,c-lodop会提示窗口已打开。

官网给出的事例如下:

<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Strict//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-strict.dtd">
<html>
<head>
<meta http-equiv="Content-Type" content="text/html; charset=utf-8" />
<title>WEB打印控件LODOP的样例二十六:超多页打印演示</title>
 
<script language="javascript" src="LodopFuncs.js"></script>
</head>
<body>
 
<h2><font color="#009999">超多页打印演示:</font></h2>
 
<p>&nbsp;&nbsp;&nbsp; 当打印页数超级多(上千页)时,如果用单页循环打印,会因为在操作系统中产生太多的</p>  
 
<p>打印任务而影响性能;如果用NewPage分页方式打印,则会因为一次性占用太多的系统资源而</p>
<p>需要等待很长时间...</p>
 
<p>&nbsp;&nbsp;&nbsp;   
解决问题的办法是采用折中处理,既分组完成,每组完成一部分,循环执行组打印。</p>
 
<p>下面演示一组打印预览10页,分50组循环实现500页的学位证书套打:</p>
 
<p>(在分组打印模板中,需要用ADD_PRINT_TEXTA函数,为每一个对象起个类名)</p>
 
<p>&nbsp; <font size="2"><input type="button" value="打印维护(模板)" onClick=" MySetup()">   
<input type="button" value="打印预览(10页)" onClick="MyPREVIEW()"> 
<input type="button" value="批量打印500页" onClick="MyPrint()"></font>      
</p>
<p><a href="PrintSampIndex.html">&lt;&lt;回样例目录</a></p>
<script language="javascript" type="text/javascript"> 
    var LODOP; //声明为全局变量
    function MySetup() {    
            LODOP=getLodop();  
            LODOP.PRINT_INIT("中文学位证书打印");
            LODOP.SET_PRINT_PAGESIZE(1,2970,2100,"");
            LODOP.SET_PRINT_STYLE("FontSize",16);
            LODOP.SET_PRINT_STYLE("Bold",1);
            CreateOnePage("姓名","男","");         
            LODOP.PRINT_SETUP();
    };
    function MyPREVIEW() {  
            LODOP=getLodop();  
            LODOP.PRINT_INIT("中文学位证书打印");
            LODOP.SET_PRINT_PAGESIZE(1,2970,2100,"");
            LODOP.SET_PRINT_STYLE("FontSize",16);
            LODOP.SET_PRINT_STYLE("Bold",1);    
            for (j = 1; j <=10; j++) {
                CreateOnePage("姓名"+j,"男",j);            
            };      
            LODOP.SET_PREVIEW_WINDOW(0,0,0,0,0,"");         
            LODOP.PREVIEW();
    };  
    function MyPrint() {    
        LODOP=getLodop();  
        if(!confirm("下面的演示会产生大量的实际打印操作,确定继续吗?")) return;
        for (i = 1; i <=50; i++) {
            LODOP.PRINT_INIT("中文学位证书打印");
            LODOP.SET_PRINT_PAGESIZE(1,2970,2100,"");
            LODOP.SET_PRINT_STYLE("FontSize",16);
            LODOP.SET_PRINT_STYLE("Bold",1);        
            for (j = 1; j <=10; j++) {
                CreateOnePage("姓名"+i+j,"男",""+i+j);         
            };  
            LODOP.SET_PRINT_MODE("CUSTOM_TASK_NAME","中文学位证书打印"+i);//为每个打印单独设置任务名    
            LODOP.PRINT();
        };
    };  
    function CreateOnePage(XM,XB,BH){   
        LODOP.NewPage();
        LODOP.ADD_PRINT_TEXTA("text01",67,132,137,35,XM);
        LODOP.SET_PRINT_STYLEA(0,"Alignment",3);
        LODOP.ADD_PRINT_TEXTA("text02",67,280,40,35,XB);
        LODOP.ADD_PRINT_TEXTA("text03",67,329,70,35,"1979");
        LODOP.SET_PRINT_STYLEA(0,"Alignment",3);
        LODOP.ADD_PRINT_TEXTA("text04",67,421,50,35,"09");
        LODOP.SET_PRINT_STYLEA(0,"Alignment",2);
        LODOP.ADD_PRINT_TEXTA("text05",67,489,40,35,"09");
        LODOP.SET_PRINT_STYLEA(0,"Alignment",2);
        LODOP.ADD_PRINT_TEXTA("text06",223,220,76,35,"理学");
        LODOP.SET_PRINT_STYLEA(0,"Alignment",2);
        LODOP.ADD_PRINT_TEXTA("text07",121,130,332,35,"应用物理与微电子技术");
        LODOP.SET_PRINT_STYLEA(0,"Alignment",2);
        LODOP.ADD_PRINT_TEXTA("text08",271,482,34,35,"校");
        LODOP.ADD_PRINT_TEXTA("text09",271,616,32,35,"长");
        LODOP.SET_PRINT_STYLEA(0,"Alignment",3);
        LODOP.ADD_PRINT_TEXTA("text10",300,131,289,35,"合肥工业大学");
        LODOP.SET_PRINT_STYLEA(0,"Alignment",2);
        LODOP.ADD_PRINT_TEXTA("text11",364,210,261,35,"103700002009000"+BH);
        LODOP.ADD_PRINT_TEXTA("text12",365,753,66,35,"2009");
        LODOP.SET_PRINT_STYLEA(0,"Alignment",2);
        LODOP.ADD_PRINT_TEXTA("text13",365,843,37,35,"12");
        LODOP.ADD_PRINT_TEXTA("text14",365,911,54,35,"31");
        LODOP.SET_PRINT_STYLEA(0,"Alignment",2);
    };  
</script> 
</body>
</html>
©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 206,378评论 6 481
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 88,356评论 2 382
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 152,702评论 0 342
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 55,259评论 1 279
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 64,263评论 5 371
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 49,036评论 1 285
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 38,349评论 3 400
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 36,979评论 0 259
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 43,469评论 1 300
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 35,938评论 2 323
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 38,059评论 1 333
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 33,703评论 4 323
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 39,257评论 3 307
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 30,262评论 0 19
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 31,485评论 1 262
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 45,501评论 2 354
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 42,792评论 2 345