WEB套打可选方案不多,理想的更少,利用免费控件Lodop+JavaScript实现精确套打,算是较为经典的选择。这种方案其实比较简单,利用一个htm文件就可以实现模板设计过程,几乎是“空手套”式的开发,但理解这几个步骤还是需要点时间,下面一步步详细演示说明:

第一步:建立一个空白的模板设计文件

把以下超文本代码复制到一个本地htm文件中:

<html>
<body>
<object id="LODOP" classid="clsid:2105C259-1E0C-4534-8141-A753534CB4CA" width=0 height=0></object>
<script language="javascript" type="text/javascript">
function CreatePrintPage() {
LODOP.PRINT_INIT("套打EMS的模板");
};
</script>
进入<a href="javascript:;" onclick="javascript:CreatePrintPage();LODOP.PRINT_DESIGN();">模板设计</a><br><br>
进入<a href="javascript:;" onclick="javascript:CreatePrintPage();LODOP.PREVIEW();">模板的打印预览</a>
</body>
</html>

本文模拟EMS特快专递单的程序开发,文件起名为printEMS.htm,权且称它为模板设计文件

第二步:用浏览器打开该文件

在本地文件夹中双击该文件就可以打开,但在进入设计之前,你的机器需要安装Lodop,如果还没安装过,

请在如下地址下载安装文件(解压rar后运行那个exe文件,Lodop是一个1M左右的小文件):

http://mt.runon.cn/samples/install_lodop.rar

或 http://mtsoftware.v053.gokao.net/samples/install_lodop.rar

第三步:准备设计

成功安装Lodop之后再次打开模板设计文件printEMS.htm,点击其中“模板设计”链接,就弹出如下空白的打印设计窗口:

为了尽快定位模板中的数据位置,你需要做一张票据扫描图作为背景,当然没有扫描图也能完成,只是需要多摸索几次,费点时间而已。

下面是我做的EMS扫描图,你把该图另存成一个jpg文件,以便我们一起完成后面的演示步骤。

第四步:装载背景图并调整图片大小

打印设计窗口,点下图所示的“装载背景图...”菜单,调入以上保存的EMS图片文件。

装载背景图后,点上图所示的“调整背景图...”菜单,弹出下图“背景图调整”窗口,设定其中的图片宽度为209mm,高度113mm会自动变化。

这个宽度值是我测量实际票据得来的。如果扫描图是按1:1比例获得的,那么调整背景图这一步就免了。

第五步:添加数据内容,开始打印测试

点下图所示“插入文本项”菜单,添加打印内容,内容项可以拖拉或精细调整,基本对准之后,点击“预览”按钮(注意旁边的“打印”按钮是收费功能,纸上会有水印,而“预览时的打印”按钮是完全免费的,我们用后者)。

把内容打印到薄一点的白纸上,然后在阳光下与真实票据透亮对比,以最左最上的某个内容为基准,其它内容远近调整,如此反复测试直到所有内容相互位置都对准。

这一步先做到内容之间的相互位置对准,等下一步处理整体位置。

第六步:整体对准

由于打印机左边距或上边距不一定是零或票据边缘有误差,所以尽管第五步打印出来的内容相互之间位置是准确的,但打印到真实票据上仍会整体偏离一些,需要进行整体位置调整。

点击下图红圈所示的“纸钉”按钮,“纸钉”弹起后,整个设计版面就可以上下左右调整了,然后按上一步的办法打印测试,直到整体对准成功。为了避免浪费票据,打印时仍可用薄白纸测试,注意此时透光对照时,纸张的左边沿和上边沿要与票据对齐,通过观察内容的位置来判断是否整体对准。

第七步:生成打印模板的程序代码

套打测试成功后,点击第五步图中所示的“生成程序代码”菜单,出现下图结果,这些代码就是我们需要的模板程序代码,把他们复制出来,准备融合到你的页面程序中使用。

第八步:完成打印模板设计文件

想不想知道WEB套打有啥感觉?好,我们先做一个静态WEB页面爽一下:把第七步生成的程序代码,

插入替换第一步的空白设计文件CreatePrintPage函数内,变成如下内容:

<html>
<body>
<object id="LODOP" classid="clsid:2105C259-1E0C-4534-8141-A753534CB4CA" width=0 height=0></object>
<script language="javascript" type="text/javascript">
function CreatePrintPage() {
LODOP.PRINT_INITA(14,11,800,600,"套打EMS的模板");
LODOP.ADD_PRINT_TEXT(95,95,75,20,"寄件人姓名");
LODOP.ADD_PRINT_TEXT(123,148,194,20,"寄件人单位名称");
LODOP.ADD_PRINT_TEXT(158,101,238,35,"寄件人的详细地址");
LODOP.ADD_PRINT_TEXT(92,446,75,20,"收件人姓名");
LODOP.ADD_PRINT_TEXT(122,496,208,20,"收件人单位名称");
LODOP.ADD_PRINT_TEXT(160,460,244,35,"收件人详细地址");
LODOP.ADD_PRINT_TEXT(289,47,178,22,"内件品名");
LODOP.ADD_PRINT_TEXT(290,258,100,20,"内件数量");
LODOP.ADD_PRINT_TEXT(92,245,100,20,"寄件人电话");
LODOP.ADD_PRINT_TEXT(90,608,75,20,"收件人电话");
};
</script>
进入<a href="javascript:;" onclick="javascript:CreatePrintPage();LODOP.PRINT_DESIGN();">模板设计</a><br><br>
进入<a href="javascript:;" onclick="javascript:CreatePrintPage();LODOP.PREVIEW();">模板的打印预览</a>
</body>
</html>

把以上内容复制到另外一个htm文件printEMS_OK.htm中,双击打开它,点其中的打印预览,就可以实现简单的WEB套打了。

以上八步基本完成了模板设计,并实现静态页面套打,但要把模板代码融合到实际的WEB程序中,还需要做些工作。

第九步:模板程序代码的使用

把以上CreatePrintPage函数进行简单改造,原函数如下:

function CreatePrintPage() {
LODOP.PRINT_INITA(14,11,800,600,"套打EMS的模板");
LODOP.ADD_PRINT_TEXT(95,95,75,20,"寄件人姓名");
LODOP.ADD_PRINT_TEXT(123,148,194,20,"寄件人单位名称");
LODOP.ADD_PRINT_TEXT(158,101,238,35,"寄件人的详细地址");
LODOP.ADD_PRINT_TEXT(92,446,75,20,"收件人姓名");
LODOP.ADD_PRINT_TEXT(122,496,208,20,"收件人单位名称");
LODOP.ADD_PRINT_TEXT(160,460,244,35,"收件人详细地址");
LODOP.ADD_PRINT_TEXT(289,47,178,22,"内件品名");
LODOP.ADD_PRINT_TEXT(290,258,100,20,"内件数量");
LODOP.ADD_PRINT_TEXT(92,245,100,20,"寄件人电话");
LODOP.ADD_PRINT_TEXT(90,608,75,20,"收件人电话");
};

把其中的打印内容提出来做为变量参数,函数改成如下样式:

function CreatePrintPage(strPName,strJJRXM,strJJRDW,strJJRDZ,strSJRXM,strSJRDW,strSJRDZ,strNJPM,strNJSL,strJJRDH,strSJRDH) {
LODOP.PRINT_INITA(14,11,800,600,strPName); //打印任务名
LODOP.ADD_PRINT_TEXT(95,95,75,20,strJJRXM); //寄件人姓名
LODOP.ADD_PRINT_TEXT(123,148,194,20,strJJRDW); //寄件人单位名称
LODOP.ADD_PRINT_TEXT(158,101,238,35,strJJRDZ); //寄件人的详细地址
LODOP.ADD_PRINT_TEXT(92,446,75,20,strSJRXM); //收件人姓名
LODOP.ADD_PRINT_TEXT(122,496,208,20,strSJRDW); //收件人单位名称
LODOP.ADD_PRINT_TEXT(160,460,244,35,strSJRDZ); //收件人详细地址
LODOP.ADD_PRINT_TEXT(289,47,178,22,strNJPM); //内件品名
LODOP.ADD_PRINT_TEXT(290,258,100,20,strNJSL); //内件数量
LODOP.ADD_PRINT_TEXT(92,245,100,20,strJJRDH); //寄件人电话
LODOP.ADD_PRINT_TEXT(90,608,75,20,strSJRDH); //收件人电话
};

这个改造后的JS函数还是很好理解的,无论写入js文件还是直接嵌在页面内都简单易用。

如果你改变了内容的字体、大小、粗斜体等格式,代码还会多一些,但总体来说比较简洁。

第十步:设置纸张高度,实现连续套打

多数套打业务的票据是连续纸,需要精确地分页,从而保证连续多页打印不偏移,

为此以上代码还要在PRINT_INITA之后加一行SET_PRINT_PAGESIZE语句:

function CreatePrintPage() {
LODOP.PRINT_INITA(14,11,800,600,"套打EMS的模板");
LODOP.SET_PRINT_PAGESIZE(1,"209mm","113mm","");//设置纸张高度
LODOP.ADD_PRINT_TEXT(95,95,75,20,"寄件人姓名");
LODOP.ADD_PRINT_TEXT(123,148,194,20,"寄件人单位名称");
LODOP.ADD_PRINT_TEXT(158,101,238,35,"寄件人的详细地址");
LODOP.ADD_PRINT_TEXT(92,446,75,20,"收件人姓名");
LODOP.ADD_PRINT_TEXT(122,496,208,20,"收件人单位名称");
LODOP.ADD_PRINT_TEXT(160,460,244,35,"收件人详细地址");
LODOP.ADD_PRINT_TEXT(289,47,178,22,"内件品名");
LODOP.ADD_PRINT_TEXT(290,258,100,20,"内件数量");
LODOP.ADD_PRINT_TEXT(92,245,100,20,"寄件人电话");
LODOP.ADD_PRINT_TEXT(90,608,75,20,"收件人电话");
};

其中209mm这个纸宽参数意义不大,主要是113mm这个高度参数,它决定了每页的走纸距离,对连续打印影响很大。这个值是我测量实际票据高度得来的,包含纸张之间的撕孔间隙。理想的测量方式,是若干页连起来一起测量取其平均高。

加入纸高控制后的打印预览如下,你可以连续打印两页内容到同一张长一点的白纸上,测试对照一下看看。把以上加入SET_PRINT_PAGESIZE语句的代码复制进第三个htm文件printEMS_OKM.htm试试。假如从第二页开始,内容向下偏移,说明纸张高度设置比实际票据大,就减小113mm这个参数值,否则增大它,这个参数可以精确到0.1mm。

第十一步:让操作者自己调整位置

以上十步实现的套打可以很精确,但都是以当前打印机为前提。如果你的打印程序要面对许多种类型的打印机,甚至一些未知的打印机类型,那么“打印维护”功能会很有用处。你可以根据情况在程序中把该功能授权给最终操作者或现场技术维护人员,让使用者自己来调整打印位置,以适应各种类型的打印机。

打印维护的指令语句是PRINT_SETUP,进入包含该功能的在线文件PrintEMS_OKMSetup.htm,先在打印维护中调整一下打印内容或整体位置,点“应用”按钮。关闭浏览器后重新打开,进入“打印预览”,看看是否有关联变化。下图是打印维护界面,其中能看到“应用”按钮和“恢复整体缺省”按钮的位置。

转:http://blog.sina.com.cn/s/blog_721e77e50100ng1o.html

今天帮朋友使用LODOP实现一个套打程序时,发现LODOP打印插件在chrome下始终无法使用。分析后发现是自己才升级了chrome,chrome新版默认是禁用npapi的,因此需要手动启用一下,启用方法如下:

 在谷歌浏览器地址栏输入:
chrome://flags/#enable-npapi
然后找到“启用NPAPI”,点击启用,根据提示重启chrome即可。

手把手教你WEB套打程序开发的更多相关文章

  1. 手把手教你写Kafka Streams程序

    本文从以下四个方面手把手教你写Kafka Streams程序: 一. 设置Maven项目 二. 编写第一个Streams应用程序:Pipe 三. 编写第二个Streams应用程序:Line Split ...

  2. 手把手教你用Vue2+webpack+node开发一个H5 app

    手把手教你用Vue2+webpack+node开发一个H5 app ​前一篇vue2 + webpack + node 开发一个小demo说到了用vue的一些基本用法,这一篇就讲一个复杂一点的更完整的 ...

  3. 手把手教你使用 Spring Boot 3 开发上线一个前后端分离的生产级系统(一) - 介绍

    项目简介 novel 是一套基于时下最新 Java 技术栈 Spring Boot 3 + Vue 3 开发的前后端分离的学习型小说项目,配备详细的项目教程手把手教你从零开始开发上线一个生产级别的 J ...

  4. 手把手教你玩微信小程序跳一跳

    最近微信小程序火的半边天都红了,虽然不会写,但是至少也可以仿照网上大神开发外挂吧!下面手把手教妹纸们(汉纸们请自觉的眼观耳听)怎么愉快的在微信小游戏中获得高分. 废话不多说,咱们这就发车了!呸!咱们这 ...

  5. 手把手教你写Kconfig---基于tiny4412开发板

    转自:http://blog.csdn.net/morixinguan/article/details/54744237 今天,我就来教大家写写最简单的Kconfig,什么是Kconfig? 我们配置 ...

  6. 最香远程开发解决方案!手把手教你配置VS Code远程开发工具,工作效率提升N倍

    文章每周持续更新,原创不易,「三连」让更多人看到是对我最大的肯定.可以微信搜索公众号「 后端技术学堂 」第一时间阅读(一般比博客早更新一到两篇) 今天和大家分享远程开发工具,分享一下我平常是如何用 V ...

  7. 手把手教你制作微信小程序,开源、免费、快速搞定

    最近做了个"罗孚传车"的小程序 一时兴起,做了一个小程序,将个人收集的同汽车相关的行业资讯和学习资料,分享到小程序中,既作为历史资料保存,又提供给更多的人学习和了解,还能装一下:) ...

  8. Electron与WEB桌面应用程序开发及其它

    这几天在构思项目,研究了一下Electron,记录下来. 说起WEB桌面程序,当前最火的就是Electron了. Electron的架构用一句话总结,就是一个main.js进程加上一个或数个chrom ...

  9. 【Bugly干货分享】手把手教你逆向分析 Android 程序

    很多人写文章,喜欢把什么行业现状啊,研究现状啊什么的写了一大通,感觉好像在写毕业论文似的,我这不废话,先直接上几个图,感受一下. 第一张图是在把代码注入到地图里面,启动首页的时候弹出个浮窗,下载网络的 ...

随机推荐

  1. Perl中的特殊内置变量详解

    #!/usr/bin/perl -w @array = qw(a b c d); foreach (@array) { print $_," "; } 例子的作用就是定义一个数组并 ...

  2. 九、mysql触发器的概念

    .所谓触发器,就是指设置好某个表的某个操作(insert ,update ,delete)时候,同时触发的一个操作: 一般用来,比如说删除文章主栏目,那么可以利用触发器删除这个文章栏目下的所有文章 . ...

  3. 【BZOJ 1189】[HNOI2007]紧急疏散evacuate

    Description 发生了火警,所有人员需要紧急疏散!假设每个房间是一个N M的矩形区域.每个格子如果是'.',那么表示这是一块空地:如果是'X',那么表示这是一面墙,如果是'D',那么表示这是一 ...

  4. javascript高级编程笔记04(基本概念)

    Function类型 Es5中规范了另一个函数对象的属性:caller,这个属性中保存着调用当前函数的函数的引用,如果是在全局作用域中调用当前函数,这它的值为null function outer() ...

  5. Jetty 与 Tomcat 比较,及性能分析

    主流java的web容器,主要是Tomcat, jboss, jetty, resin.由于以前我们主要用的是jboss4.0.5,但jbosse用的servlet容器是tomcat5.5,所以只进行 ...

  6. Binary search for the first element greater than target

    We all know how to search through an array for an element whose value equals the target value, but h ...

  7. DLL远程注入与卸载

    以下提供两个函数,分别用于向其它进程注入和卸载指定DLL模块.支持Unicode编码. #include <windows.h>#include <tchar.h>#inclu ...

  8. 破解之API断点法

    上回给大家做的破解教程,地址是http://www.52pojie.net/thread-52719-1-1.html,用的是“调用堆栈”方法.今天给新手提供另一种方法“API函数断点”,这种方法要求 ...

  9. __builtin_popcount()

    计算一个 32 位无符号整数有多少个位为1 Counting out the bits     可以很容易的判断一个数是不是2的幂次:清除最低的1位(见上面)并且检查结果是不是0.尽管如此,有的时候需 ...

  10. APP 上传之后出现"invalid binary" 问题解决汇总

    背景 5.1 号开始 App 审核开始强制支持 iPhone5,并禁止使用 UDID. 问题 上传 app 后一直处于 Invalid Binary 状态,并且收到一封邮件说 Non-public A ...