精华内容
下载资源
问答
  • 兼容所有浏览器的Web打印控件的设计方案 ...在需要打印的客户端电脑(操作系统为:Windows系统,XP需要先安装.NET Framework 3.5,其它版本的Windows需要安装下载安装打印的客户端软件。检...

    兼容所有浏览器的Web打印控件的设计方案

     

    设计方案的简单实现网址:http://www.lc-simple.com/PrintTest/

     

    第一章:Web打印控件的原理

      Web打印控件的工作的原理如下:

    1. 在需要打印的客户端电脑(操作系统为:Windows系统,XP需要先安装.NET Framework 3.5,其它版本的Windows不需要安装)上下载安装打印的客户端软件。检测客户端软件是否已经安装,将在第三章进行详细说明。
    2. 服务器组织好报表打印的数据,设计好报表模板文件。打印的数据和报表模板是分开的,如同C/S架构下的报表设计。调用Web打印的相关类和函数,把打印的数据、报表模板文件及打印相关设置转换为一个JSON格式的文本文件保存,然后把此文本文件的URL,进行编码后,输出至网页端。
    3. 网页通过浏览器调用客户端电脑上安装的打印软件,打印软件自动下载此JSON文件,解析后,然后进行打印预览,或直接打印,或在线编辑,或导出PDF文件等。

     

    第二章:Web打印控件的要求

    1. 兼容所有安装在Windows系统上的浏览器,包括:IE、Chrome、火狐、360浏览器、QQ浏览器、搜狗浏览器等国产浏览器。如果有朋友需要在手机APP、小程序、或H5手机网页进行打印,可以直接联系我。
    2. 速度快,打印预览100页,在5秒钟之内就可以完成。这个比那些通过JS控制打印的控件快了好几个数量等级。
    3. 报表设计效率高,因为采用的是通用的C/S架构下的报表设计思想,报表模板文件专门负责报表格式的设计,和报表数据是分离的。准备好报表数据,只需简单的拖放就可以完成一个报表的设计。我还提供有关中国式报表(报表中要划线,线要划准,不能过短,也不能过长)的简便高效设计方法。
    4. 提供在线编辑设计报表功能,有时我们的客户需要能自定义报表,对报表的栏目和样式进行自定义。比如一个采购订单,各客户所要求的格式可能就会稍有差异,控件提供了在线编辑设计和保存客户自定义的报表功能。
    5. 提供直接导出PDF文件,报表可以不需要预览,直接导出PDF文件,所导出的PDF文件既可以默认保存至客户端电脑的某个指定文件夹的某个指定的文件,也可以弹出文件选择窗口进行保存。
    6. 支持二维码的直接编辑和打印。

     

    第三章:服务端代码设计

    服务端的代码是开源的,提供的语言版本有:.NET,Java,PHP。使用控件时,需要引用服务端的一些类和函数,把打印数据、报表模板文件及打印设置产生为一个JSON临时文件,并把此URL传给网页,通过网页去调用客户端打印软件。

    服务端代码主要分为4个部分:网页、和网页相配套的服务端代码、打印类、数据库操作类。服务端代码的核心在于打印类,其他3个只是作为完整的示例应用必不可少的支持(为了示例的简单易懂,我对这3个部分的配置和代码也是尽可能的简单化,尽可能的少用框架)。在实际的开发中,您只需要引用打印类,然后其它根据项目要求去做就可以了。

    我平时工作一般是用.NET,对于Java主要是用于Android系统的开发,对于PHP用得比较少。对于服务端的代码,您可以根据自己的需求,进行自行开发和修改。欢迎各位同行一起来交流,大家共同进步。

    一、网页端的相关代码

    1. 网页端需要引用JQuery,如:

      <script src="./js/jquery-1.10.1.min.js" type="text/javascript"></script>

     

    1. 在HTML代码中,添加一个 iframe,并把src指向打印的URL,如下:

        <iframe id="ifrm" src="" width="0" height="0"></iframe>

        <script type="text/javascript">

            var strPrintData = '<%=strPrintData%>';

            if( strPrintData != '' ) {      

               $("#ifrm")[0].src = "ChuLinPrint:<%=strPrintData%>";

           }

        </script>

       

         其中<%=strPrintData%>是引用服务端的变量,即服务端所产生的临时文件的URL,这个实例是.NET的写法,Java和PHP稍不一样。

     

    1. 在示例中还有一些网页前端代码是有关检测控件是否安装的,这些我们再在检测控件是否安装的那一则再进行详细说明。

     

    1. 网页端的代码核心的只有一句话: ChuLinPrint:<%=strPrintData%>

    把URL作为参数传递给客户端打印软件,并调用客户端打印软件进行操作,其它的代码您可以根据自己的要求去改写。

     

    二、PrintFunction类文件设计

       此源文件在实际开发中必须添加至开发项目中,此源文件一般提供了以下4个静态函数以供开发调用。各语言的写法稍有差异,但功能是一样的。下面以C#的格式简单说明一下这4个函数。

    1. public static string ListToXml<T>(IList<T> DtTable)

    此函数把List类的实例转化为XML字符串,把报表的数据转换为XML字符串。这个函数一般不用去做任何修改,如果数据类型不够用,也请按照现有源代码的严格格式去做调整,否则就会出错的。List类是我们面向对象开发中最常用的类,此函数提供面向对象开发中的数据处理功能。

     

    1. public static  string TableToXml(DataTable pTable)

    此函数把数据表转化为XML字符串,把数据表中的数据和结构转换为XML字符串。对于.NET平台记得在加载数据时,要加载数据表的结构(加上:da.FillSchema(ds, SchemaType.Source);)。若函数中提供的数据类型不够用,可自行按照源代码的格式进行调整。

     

    1. public static string FileToString(string strFileName)

        此函数把报表模板文件和图片文件进行编码,转化为字符串。这个函数一般不用做任何修改。

     

    1. public static string EnBase64(string strValue)

        此函数把字符串转化为base64编码的字符串。这个函数一般不用做任何修改。

     

    三、PrintJson类文件设计

       此源文件在实际开发中必须添加至开发项目中,此源文件是服务端代码的核心,提供了打印控件所有功能调用和属性设置。

    3.1  JSON第三方类库的引用

    系统中采用免费的公开的JSON第三方类库,这些类库都是各语言进行JSON操作最常用的第三方类库。

    对于.NET平台需要引用:Newtonsoft.Json.dll,此文件可以在C#示例中的bin文件夹目录下找到。

    对于Java需要引用:json.jar,此文件也可以在Java示例中的文件夹中找到。

    对于PHP,直接采用的是系统函数:json_encode,无需引用第三方类库。

    3.2  类的初始化,传入报表模板文件

    PrintJson类初始化时,需要提供2个参数:

      1. 报表临时文件所在的文件夹,服务器的报表JSON数据将临时存储在此文件夹,此文件夹要求能通过URL访问,控件通过文件名下载报表打印所需要的数据。要求此文件夹有写入的权限。建议为一个独立的文件夹,此文件夹的内容建议定时清理。
      2. 报表模板文件名称,包括文件的绝对路径。对于预览、直接打印、导出PDF文件请确保此报表模板文件已经存在;对于在线编辑,此文件名可以为空。

    类的初始化时,会对打印控件所需要的数据进行初始化值。

    3.3  打印控件的注册参数

    对应的函数:CheckRegister,需要2个参数:

    1. 对于公司版,填注册的公司名称;对于个人版,填注册的个人姓名
    2. 注册码:根据公司名称或个人姓名、版本(公司版或个人版)、注册月数,加密生成的注册码。

    3.4  报表变量参数的设置

         报表变量参数可以由服务器传递数据至报表模板中显示和打印。报表变量一般只传递一个数据值,是数据集的有效补充。

    1. 在报表模板文件编辑的时候添加好报表参数

    在报表模板的编辑窗口,单击菜单栏上的“报表”,“参数”,如图 ,则打开参数窗口如下图:

    单击参数窗口上的 建立参数类别;

    单击 建立参数;

    单击 可以编辑参数类别和参数的名称。

    参数的名称一般由英文字母加数字组成,和编辑语言中的变量一样。

     

    1. 在报表模板文件中使用报表参数

    在报表模板的编辑窗口,单击最左边的工具箱上的 ,然后在报表编辑区域再单击一下,就会打开窗口如下:

    点击左上角的此图标,打开窗口如下:

    在此窗口选择“变量”选项,在第1步定义的报表变量就会在此显示出来,双击变量名称,然后再点“确认”,就可以使用此报表变量了。

     

    1. 服务端传递报表参数的数据

    服务端的函数:AddPrintParam,需要2个参数:

    报表变量的参数名称:这个参数名称就是在第1步的报表模板编辑时所设置的参数名称,这个参数名称区分大小写,必须和报表模板文件中的参数名称一模一样。

    报表变量的参数值:就是此参数的值,为了简便起见,报表变量的参数值都为字符串,其它类型请先转化为字符串。

     

    3.5  检测打印机控件是否安装

    如果您的开发项目的客户端电脑由您公司或部门的人员直接维护,或在客户使用之前,会对客户进行培训,建议在您的项目中就没有必要对打印控件是否安装进行检测了,这样也省去您不少的代码。

     

    检测打印控件是否安装的解决思路由以下3个部分组成:

    服务端调用控件之前,判断是否有 Cookie(此Cookie为GuId值,保证唯一性,此Cookie的保存时间为10年以上),若有Cookie则在服务端的数据表中查找,判断是否有记录,若有记录,则表示此电脑已经安装过。 若没有记录,或者没有Cookie,则表示未安装过。若没有Cookie则建立一个Cookie。

    调用控件时,把此Cookie值,还有Cookie回传的服务端的URL传给控件。控件在运行时,会自动把此cookie值回传服务器的URL,服务器把此Cookie写入数据表中,并且更新最后一次回调的时间。

        网页在调用控件之后,可以再启动一个延时(比如延时3秒)函数,以Ajax去访问服务端的另一个指定的URL,附带参数:Cookie值,服务端去读取数据表的此Cookie的记录,若不存在记录,或最后访问的时间超过了规定时间,则判断为客户机没有安装,提示下载安装。这一步主要是防止客户自己卸装了报表打印控件,而Cookie还正常存在的情况。打印控件安装之后在开始菜单和桌面不会有任何痕迹,但用户可以在“控制面板”中“程序”找到并进行删除,如果您觉得您的客户不会有这么高的专业水平,那么这一步可以忽略不计。

     

    第1步的处理,因为涉及到Cookie,我们必须在网页对应的服务端代码中进行处理。.NET可参照示例中的 Default.aspx.cs文件中的SetCookieAndURL函数;对于Java可参照示例中的PrintTestDemo.java文件中的SetCookieURL函数。对于Cookie值的存储,需要设计一个独立的数据表,此数据表就2个字段:存储的Cookie值、最后访问时间。

     

    第2步的处理,分为2个部分:

    1. 把Cookie值和回传的URL传给控件,对应的函数:SetCookieAndURL,此函数对应就是这2个参数,其中Cookie值为第1步所取得的Cookie值;服务器回传的URL必须为绝对路径,要加上http://或https://,可以在浏览器直接打开的。
    2. 服务器回传的URL的代码,对于.NET可参照PrintCookie.aspx.cs文件;对于Java可参照PrintCookie.jsp文件

     

    第3步的处理,分为2个部分:

    1. 网页端对服务端进行Ajax访问,.NET和Java可参考相应的JS代码。
    2. 服务端配套的代码,对于.NET可参照PrintCookie.aspx.cs文件;对于Java可参照PrintCookie.jsp文件。

     

    3.6  报表图片文件的处理

    报表图片文件的处理分为两种情况,一种是单个图片文件,比如在报表的标题处显示公司的LOGO;另一种是报表明细记录中的图片,比如产品明细报表中为每一个产品显示图片。

     

    单个图片文件的处理:

    1. 第1步:在报表模板文件建立图片对象,方法如下:在报表文件的编辑窗口,点击左侧工具箱的 图标,然后在报表编辑区域(通常是标题、页头、页尾、总结栏等)再点击一下,在弹出窗口再点击“确认”。然后在“属性”中设置“Name”为图片对象的名称,图片对象的名称通用为字母,注意大小写有差别。
    2. 第2步:服务端调用函数:AddPictureSinglePrint,此函数需要3个参数,第1个参数为第1步在报表模板文件中所设置的图片对象的名称,这个名称一定不能出错;第2个参数为图片的文件名称;第3个参数为图片的绝对路径;图片一定要存在,才有效。图片的大小请注意不要过大,一般不要超过500K,图片的格式支持JPG、BMP等,JPG图片的版本不要太高。

       注意:一个报表模板文件可以有多个独立的单个图片文件。

     

    报表明细记录的图片文件的处理:

    1. 第1步:在报表模板文件建立图片对象,方法如下:在报表文件的编辑窗口,点击左侧工具箱的 图标,然后在报表编辑区域(通常是明细数据栏)再点击一下,在弹出窗口再点击“确认”。然后在“属性”中设置“Name”为图片对象的名称,图片对象的名称通用为字母,注意大小写有差别。
    2. 第2步:服务端调用函数:AddPictureTableToPrint(数据源是Table)或AddPictureIListToPrint(数据源是List<T>),此函数需要5个参数,第1个参数为第1步在报表模板文件中所设置的图片对象的名称,这个名称一定不能出错;第2个参数为图片字段所在的数据集内容;第3个参数为数据集的序号,一般是1,若有多个数据集时,就要注意一下这个数据内容是第几个数据集;第4个参数为图片所在的字段名称;第5个参数为图片在服务器上的绝对路径。

        对于数据表中的图片字段只保存图片的文件名,不保存图片文件的内容,这个也是通用的做法,如果您的图片保存在数据库,建议分离出来作为独立的图片文件存在,因为这样可以大大减轻数据库的压力,也便于有必要的时候可以把图片作为CDN资源,减轻服务器的带宽压力。服务器的图片绝对路径加上数据表的图片字段的值,要可以读取到图片的内容。

    3.7  报表预览窗口的设置

       报表预览窗口上的按钮栏如下图:

    可以通过服务端一系列的函数决定哪一个按钮隐藏不显示出来。

    IsHideButtonPrint:报表打印预览窗口隐藏按钮:打印

    IsHideButtonLoad:报表打印预览窗口隐藏按钮:打开文件

    IsHideButtonSave:报表打印预览窗口隐藏按钮:保存

    IsHideButtonExport:报表打印预览窗口隐藏按钮:导出

    IsHideButtonZoom:报表打印预览窗口隐藏按钮:放大缩小

    IsHideButtonFind:报表打印预览窗口隐藏按钮:查找

    IsHideButtonOutline:报表打印预览窗口隐藏按钮:大纲显示

    IsHideButtonPageSetup:报表打印预览窗口隐藏按钮:页面设置

    IsHideButtonNavigator:报表打印预览窗口隐藏按钮:页面导航

    IsHideButtonExportQuick:报表打印预览窗口隐藏按钮:快速导出

    3.8  页边距的程序设置

       报表的页边距,通常是在报表模板的编辑窗口进行设置。设置的方法,点击左上角的“文件”菜单,再选择“页面设置”,打开窗口如下图:

    在此窗口设置好报表的纸张大小、各页边距。请注意这个设置和打印机相关,所设置的页边距若您的打印机不支持,那么实际打印的时候也不会起作用。

     

    服务端所提供的页边距的设置函数主要是用于EPSON针式打印机的细微调整,用EPSON针式打印机打印各种单据时,特别是那种通过滚动方式在打印机后端进纸的,不同的打印机需要去调整各自的边距,此边距可以在打印机上去调整,也可以在服务端通过函数进行调整。提供了4个函数如下:

    SetLeftMargin(double dbLeftMargin):设置页面设置的左边距,单位为毫米

    SetRightMargin(int dbRightMargin):设置页面设置的右边距,单位为毫米

    SetTopMargin(int dbTopMargin):设置页面设置的上边距,单位为毫米

    SetBottomMargin(int dbBottomMargin):设置页面设置的下边距,单位为毫米

    3.9  在线编辑报表的保存

    本软件的DesignReport方法就可以在线编辑报表,若您只是自己在线编辑报表,客户不需要在线编辑和保存报表,那么您可以在报表编辑好之后,单击右上角的“文件”菜单,选择“另存为”,把报表模板文件保存下来,这样就不需要在线保存。

     

    在线保存是指客户在线编辑好报表,在报表编辑窗口,单击 保存图标,报表文件可以自动上传至服务器,并且提示:保存成功。

    此操作分为2个部分。

    第1个部分是在服务端设置保存的URL,对应的函数:SetPostUrl,参数为服务器保存数据的URL,此URL必须以http://或https://打头,在浏览器能打开。此URL中建议配置相关的参数,如带参数:?FileName=DepsitAmt.fr3,这样以区分不同的文件名,也可以加上其它的参数(比如:UserId等),这些参数在报表保存时都会作为URL的参数完整上传。

      第2个部分为此服务端的URL的代码,此代码中接收报表编辑保存的内容,还有第1个部分所设置的URL参数。报表编辑保存的内容是以POST方式上传的,参数名称为:ReportFileValue;上传的报表内容为字符串,需要经过转码才可以保存为报表模板文件。对于.NET可参考示例中的PostSave.aspx.cs文件;对于Java可参考示例中的PostSave.jsp文件。

    3.10  在线编辑报表的数据集名称的设置

    对于用户在线报表,为了便于用户操作,我们可以把数据集,还有数据集的字段名称设置为中文。对于字段名称设置为中文,对于SQL语句可以用 as 的方式转换为中文。对于数据集的中文设置,本软件提供了以下的函数:

    SetDataSetName1(string strDataSetName):设置数据集1的名称为指定名称(可以是中文)

    SetDataSetName2(string strDataSetName):设置数据集2的名称为指定名称(可以是中文)

    SetDataSetName3(string strDataSetName):设置数据集3的名称为指定名称(可以是中文)

    SetDataSetName4(string strDataSetName):设置数据集4的名称为指定名称(可以是中文)

    SetDataSetName5(string strDataSetName):设置数据集5的名称为指定名称(可以是中文)

    SetDataSetName6(string strDataSetName):设置数据集6的名称为指定名称(可以是中文)

    请注意:报表编辑时的数据集名称必须和此函数所设置的数据集名称保持一致,否则报表模板会报错。

    3.11  实际打印次数、页面设置的回传服务器的设置

    1. 获取实际打印次数的方法:
      1. 调用类中的函数:SetPrintUrl,参数:服务器对应的URL,这个URL需要包含 http://或https://,可以加上URL参数以便区分是哪一份报表哪一个用户等,要能通过浏览器进行访问。URL示例如:http://www.lc-simple.com/PrintTest/PrintNum.asp?FileName=DepsitAmt.fr3&UserID=15
      2. 设计好服务器对应的URL的相关代码。控件以POST方式进行访问,访问时会带上POST字段:PrintCopy,此字段的内容为用户打印的份数,默认为1。在.NET平台,可以用通过 Request.Form["PrintCopy "]获取此字段的值;在JSP可以通过request.getParameter("PrintCopy ")获取此字段的值。
      3. 用户在打印预览之后,选择打印机的窗口,点击“确定”按钮开始打印之后,控件就会访问服务器所设置的URL,并且把打印份数作为参数:PrintCopy上传。如下图:

    注意:此方法不检测打印机的状态,如遇打印机故障或卡纸,也是同样会上传。对于不预览直接打印的,可以在调用控件后就默认为已经打印1份。

     

    1. 保存用户的页面设置的方法
    1. 调用类中的函数:SetPageSetUrl,参数:服务器对应的URL,这个URL需要包含 http://或https://,可以加上URL参数以便区分是哪一份报表哪一个用户等,要能通过浏览器进行访问。URL示例如:http://www.lc-simple.com/PrintTest/PageSet.asp?FileName=DepsitAmt.fr3&UserID=15
    2. 设计好服务器对应的URL的相关代码。控件以POST方式进行访问,访问时会带上POST字段:LeftMargin、RightMargin、TopMargin、BottomMargin,此参数为用户所设置的左边距、右边距、上边距、下边距。怎么读取POST字段的值请参见获取打印份数的方法
    3. 用户在打印预览时,点击预览窗口的工具栏上的 页面设置按钮,打开页面设置窗口,在此窗口设置页边距,点击确认按钮,就可以把设置的页边距上传至服务器。这个主要是用于针式打印机,用户在预览窗口进行页边距的调整,已经调整好之后,需要把这些页边距的参数保存,以便下次再打印时,程序可以按此参数设置好(见3.8 页边距的程序设置)。页面设置的窗口如下图:

    3.12  主从报表的设置

       主从报表是指一个主表和一个从表联合进行打印,最常见的如一次性打印多张采购订单,像订单号、供应商名称、订单金额这些就是主表信息,像各订单所对应的采购物品记录就是从表信息。

     

    主从报表模板的设计:如果您不熟悉,可以先看看示例中的主从报表的设计示例。这其中关键的有以下几点:

    1. 要准备好2个数据集,一个数据集对应主表记录,另一个数据集对应从表记录
    2. 主表的MasterData 栏的DataSet对应frxDBDataset1,在此栏设计主表的字段,然后再放入一个子报表的对象,双击进行编辑
    3. 在子报表编辑时,子报表的MasterData 栏的DataSet对应frxDBDataset2

     

    主从报表数据关联,对应类的函数:MasterOptions(int iMasterDataSeq, string strFieldName, bool bIsNumber),其中第1个参数为主数据集的序号,通常为1;第2个参数为主数据集和从数据集相关联的字段名称,这个字段名称是这2个数据集中都存在的,若相关联需要2个或多个字段,请用SQL语句或类对象中,把这几个字段的值进行转化,转化为一个字段;第3个参数标识此字段的内容是否为数值型。

     

    3.13  直接打印的打印机设置

    直接打印时可以设置从用户的哪一部打印机打印出报表,若未设置,则从用户的默认打印机打印出报表。对应类中的函数:SetPrinter,参数为用户已经安装的打印机名称(见“控件面板”、“打印机和传真”),对于网络打印机的名称,注意“\”,要转化为:“\\”;打印机的名称若错误,则还是从默认打印机打印出来。

    注意:此设置对于先预览后打印的模式不启作用。

     

    3.14  预览、直接打印、在线编辑、导出PDF的方法

    预览:调用控件之后,先显示打印预览的窗口,然后由用户可以查看报表的内容,也可以导出或进行打印。预览的函数名:ShowReport,可以预览List<T>中的数据,也可以预览Table的数据,目前一次最多预览6个数据集。为了方便调用,类中提供了多个ShowReport的函数,各个函数的参数不一样。在调用此函数之前需要数据集、打印参数和打印设置等都做好。

    直接打印:调用控件之后,不进行打印预览,直接从打印机打印出报表的内容;若未设置打印机,则从默认打印机打印出来。直接打印的函数名:PrintReport,此函数的参数和预览完全一样。

    在线编辑:调用控件之后,则显示报表编辑的窗口,可以直接进行在线设计报表,若设置了:在线编辑报表的保存,则点击保存时,则可以把设计好的报表模板文件直接上传至服务器;若没有设置,则可以“另存为”的方式保存报表模板文件。在线编辑的函数名:DesignReport,此函数的参数和预览完全一样。

    导出PDF:调用控件之后,不进行打印预览,直接把报表内容导出PDF文件。若没有传入导出所保存的文件夹及文件名称,则调用之后,会弹出一个保存文件的对话框,在此对话框选择文件夹和文件名,然后再进行保存。若传入了保存的文件夹及文件名称,则会在用户的电脑先建立此文件夹,并产生文件,若文件已经存在,则覆盖旧文件。导出PDF的函数名称:ExportReportPdf,此函数的参数比预览多一个参数:strExportPdfFileName,就是PDF导出之后所保存的文件夹及文件名称。

     

    3.15  报表模板文件的设计

    常见的报表模板的设计也是比较简单的,若您不熟悉,可以上网去查找一下相关报表设计的资料,对于一个程序员来说,学习这个简单的报表设计,很快就可以上手,一般只需1至2个小时就可以学会的。在这里主要是说明一下我在报表模板设计中所增强的几个功能。

     

    1. 报表的二维码设计

      A、单击报表右侧工具箱上的 ,并把它拖放到需要打印的位置,这时显示的是一维码,请接着进行下一步

      B、修改属性BarcodeType的值为:tBARCODE_QRCODE,这时候显示的样式为二维码

      C、二维码的数据设置,若二维码为固定的值,请直接在属性:Data中设置

         若二维码的值为动态变化的,请先修改属性:Name 的值,然后单击“事件”页,双击“OnBeforePrint”事件,如下图:

           写入一行代码,示例如下:

             Qrcode_CashNo.Data := <frxDBDataset1."CashNo">;                                               

         其中 Qrcode_CashNo 为所上面所设置的二维码的Name

              <frxDBDataset1."CashNo"> 为一个数据集以及字段名

      D、二维码的大小:二维码有严格的规范,不能直接设置大小,但通过属性:Zoom 设置二维码的大小的倍数

      E、二维码控件的选择,有时候用鼠标直接点击报表上的二维码没有反应,可以点击左上方的对象查看器的二维码,如下图:

     

    1. 中国式报表的分隔线和对齐

    本报表编辑器增加6个中国式报表的按钮,方便解决了中国式报表中线条对齐问题。

    这6个按钮分别是缩放宽度最小、缩放宽度最大、缩放高度最小、缩放高度最大、水平首尾相连、垂直首尾相连。

    中国式报表的设计方法:拖多个文本对象或数据库字段其报表编辑器,然后选中,单击工具栏上的 按钮,使其加上边框,然后再单击“水平首尾相连”就可以很好的产生水平线条。对于垂直线条,可以选中垂直的报表对象,然后再单击左对齐,相同宽度按钮,这样就可以产生垂直线条,若中间有空白,我们可以选中其文本对象和报表条,然后单击“缩放高度最小”就可以把中间的空白去掉。

     

    1. 数字转为财务大写汉字

    本报表提供了自定义函数:NumToChinese,可以把数字转换为财务大写汉字,比如数字:121.56,引用此函数后,显示的结果为:壹佰贰拾壹元伍角陆分

     

    更详细的使用说明请见:http://www.lc-simple.com/PrintTest/

     

    展开全文
  • 后来分析的N久,发现是打印控件上我加了一个Label,使用了Arial Black字体,如果客户的机器没有这种字体的话,加载就正常。我怀疑是MS的一个Bug...没有这个字体,可以随便找一个字体替代,能导致能加载哦。2...

    1.WEB系统引用windows控件的方式来实现页面打印的功能,一直使用比较正常,有一天更新后部分机器不能正常加载控件。后来分析的N久,发现是打印控件上我加了一个Label,使用了Arial Black字体,如果客户的机器上没有这种字体的话,加载就不正常。
    我怀疑是MS的一个Bug...没有这个字体,可以随便找一个字体替代,不能导致不能加载哦。

    2.VS2003下写的控件,如果客户机器安装的是.NET 2.0则不能加载


    转载于:https://www.cnblogs.com/wormday/archive/2006/07/23/457600.html

    展开全文
  • 功能:1、自动检测lodop是否正常,正常提示安装lodop控件 2、自动获取电脑的所有打印机供选择和一键打印 3、可将打印机设置为默认打印机 4、同页面可选择多台打印机打不同内容,demo中使用的是小票机与标签机...
  • 在此之前,我一般使用比较好用的LODOP来执行打印的操作,这个在我之前有很多文章都有涉及,这个控件是一个ActiveX的控件,需要下载安装后就可以在页面是进行打印的排版设计,预览,打印等操作,还是很方便的一个控件...
  • 点聚weboffice 6.0

    2018-04-25 13:57:23
    WebOffice安装包内包含: 1.Weboffice安装包(仅包含WebOffice控件) 2.WebOffice接口sdK 3.WebOffice网页接口调用例子 4.DES手写及签章系统(Office签章系统)试用版。 5.演示章及证书 6.点聚产品白皮书
  • 在VB,Delphi,C++Builder中均可以很方便的使用控件 V2,3,2,0版本之后,NTKO OFFICE文档控件不仅可以继续与浏览器和各种后台Web服务器无缝集成创建B/S结构的应用,更全面支持C/S方式的编程和其他容器。您可以在VB,...
  • Web浏览器控件为您提供了web上的快速浏览ActiveReports 以及打印功能,并具有ActiveX,Acrobat Reader HTML,EXCEL浏览器类型的属性。 RPX 文件HTTP处理器为您提供了在web服务器轻松的放置报表的功能,并可使您...
  • weboffice示例(PHP版)

    热门讨论 2010-08-11 09:54:01
    点聚会定期更新本控件,并解答论坛的询问,免费代表免服务,每一个使用者都能得到及时服务。 安装包内包含: 1.WebOffice安装包(仅包含WebOffice控件) 2.WebOffice接口SDK 3.WebOffice网页接口调用例子 4.DES...
  • <br>2007/6/1 Version 3.0.9 beta <br>Updates: 1) web.config中新增configfolder、functionfolder、skin三个必须目录的全局路径设置,以往旧版本如果要在不同级别子目录的页面调用控件都要单独设置...
  • vue项目中使用lodop实现打印

    千次阅读 2019-02-21 18:08:46
    Lodop(标音:劳道谱,俗称:露肚皮)是专业WEB控件,用它既可裁剪输出页面内容,又可用程序代码直接实现 复杂打印控件功能强大,却简单易用,所有调用如同JavaScript扩展语句, 废话多说直接代码 ...

    先说一下Lodop 是什么东西吧 官网有详细介绍我就不多说啦

    官网:http://www.lodop.net/

    Lodop(标音:劳道谱,俗称:露肚皮)是专业WEB控件,用它既可裁剪输出页面内容,又可用程序代码直接实现

    复杂打印。控件功能强大,却简单易用,所有调用如同JavaScript扩展语句,

    废话不多说直接上代码

    1.去官网下载lodop并且安装好驱动 这是必要条件!!!一定要先安装好啊 因为都是基于这个实现的

    2.新建一个lodop.js文件

    var CreatedOKLodop7766 = null;
    
    //====判断是否需要安装CLodop云打印服务器:====
    export function needCLodop() {
        try {
            var ua = navigator.userAgent;
            if (ua.match(/Windows\sPhone/i) != null) return true;
            if (ua.match(/iPhone|iPod/i) != null) return true;
            if (ua.match(/Android/i) != null) return true;
            if (ua.match(/Edge\D?\d+/i) != null) return true;
    
            var verTrident = ua.match(/Trident\D?\d+/i);
            var verIE = ua.match(/MSIE\D?\d+/i);
            var verOPR = ua.match(/OPR\D?\d+/i);
            var verFF = ua.match(/Firefox\D?\d+/i);
            var x64 = ua.match(/x64/i);
            if ((verTrident == null) && (verIE == null) && (x64 !== null))
                return true;
            else
            if (verFF !== null) {
                verFF = verFF[0].match(/\d+/);
                if ((verFF[0] >= 42) || (x64 !== null)) return true;
            } else
            if (verOPR !== null) {
                verOPR = verOPR[0].match(/\d+/);
                if (verOPR[0] >= 32) return true;
            } else
            if ((verTrident == null) && (verIE == null)) {
                var verChrome = ua.match(/Chrome\D?\d+/i);
                if (verChrome !== null) {
                    verChrome = verChrome[0].match(/\d+/);
                    if (verChrome[0] >= 42) return true;
                };
            };
            return false;
        } catch (err) {
            return true;
        };
    };
    
    //====页面引用CLodop云打印必须的JS文件:====
    if (needCLodop()) {
        var head = document.head || document.getElementsByTagName("head")[0] || document.documentElement;
        var oscript = document.createElement("script");
        oscript.src = "http://localhost:8000/CLodopfuncs.js?priority=1";
        head.insertBefore(oscript, head.firstChild);
    
        //引用双端口(8000和18000)避免其中某个被占用:
        oscript = document.createElement("script");
        oscript.src = "http://localhost:18000/CLodopfuncs.js?priority=0";
        head.insertBefore(oscript, head.firstChild);
    };
    
    //====获取LODOP对象的主过程:====
    export function getLodop(oOBJECT, oEMBED) {
        var strHtmInstall = "<br><font color='#FF00FF'>打印控件未安装!点击这里<a href='install_lodop32.exe' target='_self'>执行安装</a>,安装后请刷新页面或重新进入。</font>";
        var strHtmUpdate = "<br><font color='#FF00FF'>打印控件需要升级!点击这里<a href='install_lodop32.exe' target='_self'>执行升级</a>,升级后请重新进入。</font>";
        var strHtm64_Install = "<br><font color='#FF00FF'>打印控件未安装!点击这里<a href='install_lodop64.exe' target='_self'>执行安装</a>,安装后请刷新页面或重新进入。</font>";
        var strHtm64_Update = "<br><font color='#FF00FF'>打印控件需要升级!点击这里<a href='install_lodop64.exe' target='_self'>执行升级</a>,升级后请重新进入。</font>";
        var strHtmFireFox = "<br><br><font color='#FF00FF'>(注意:如曾安装过Lodop旧版附件npActiveXPLugin,请在【工具】->【附加组件】->【扩展】中先卸它)</font>";
        var strHtmChrome = "<br><br><font color='#FF00FF'>(如果此前正常,仅因浏览器升级或重安装而出问题,需重新执行以上安装)</font>";
        var strCLodopInstall = "<br><font color='#FF00FF'>CLodop云打印服务(localhost本地)未安装启动!点击这里<a href='http://www.c-lodop.com/download/CLodop_Setup_for_Win32NT_https_3.008Extend.zip' target='_self'>执行安装</a>,安装后请刷新页面。</font>";
        var strCLodopUpdate = "<br><font color='#FF00FF'>CLodop云打印服务需升级!点击这里<a href='CLodop_Setup_for_Win32NT.exe' target='_self'>执行升级</a>,升级后请刷新页面。</font>";
        var LODOP;
        try {
            var isIE = (navigator.userAgent.indexOf('MSIE') >= 0) || (navigator.userAgent.indexOf('Trident') >= 0);
            if (needCLodop()) {
                try {
                    LODOP = getCLodop();
                } catch (err) {};
                if (!LODOP && document.readyState !== "complete") {
                    alert("C-Lodop没准备好,请稍后再试!");
                    return;
                };
                if (!LODOP) {
                    // if (isIE) document.write(strCLodopInstall); else
                    // document.documentElement.innerHTML=strCLodopInstall+document.documentElement.innerHTML;
                    // return;
                } else {
    
                    if (CLODOP.CVERSION < "3.0.0.2") {
                        if (isIE) document.write(strCLodopUpdate);
                        else
                            document.documentElement.innerHTML = strCLodopUpdate + document.documentElement.innerHTML;
                    };
                    if (oEMBED && oEMBED.parentNode) oEMBED.parentNode.removeChild(oEMBED);
                    if (oOBJECT && oOBJECT.parentNode) oOBJECT.parentNode.removeChild(oOBJECT);
                };
            } else {
                var is64IE = isIE && (navigator.userAgent.indexOf('x64') >= 0);
                //=====如果页面有Lodop就直接使用,没有则新建:==========
                if (oOBJECT != undefined || oEMBED != undefined) {
                    if (isIE) LODOP = oOBJECT;
                    else LODOP = oEMBED;
                } else if (CreatedOKLodop7766 == null) {
                    LODOP = document.createElement("object");
                    LODOP.setAttribute("width", 0);
                    LODOP.setAttribute("height", 0);
                    LODOP.setAttribute("style", "position:absolute;left:0px;top:-100px;width:0px;height:0px;");
                    if (isIE) LODOP.setAttribute("classid", "clsid:2105C259-1E0C-4534-8141-A753534CB4CA");
                    else LODOP.setAttribute("type", "application/x-print-lodop");
                    document.documentElement.appendChild(LODOP);
                    CreatedOKLodop7766 = LODOP;
                } else LODOP = CreatedOKLodop7766;
                //=====Lodop插件未安装时提示下载地址:==========
                if ((LODOP == null) || (typeof (LODOP.VERSION) == "undefined")) {
                    if (navigator.userAgent.indexOf('Chrome') >= 0)
                        document.documentElement.innerHTML = strHtmChrome + document.documentElement.innerHTML;
                    if (navigator.userAgent.indexOf('Firefox') >= 0)
                        document.documentElement.innerHTML = strHtmFireFox + document.documentElement.innerHTML;
                    if (is64IE) document.write(strHtm64_Install);
                    else
                    if (isIE) document.write(strHtmInstall);
                    else
                        document.documentElement.innerHTML = strHtmInstall + document.documentElement.innerHTML;
                    return LODOP;
                };
            };
            if (LODOP.VERSION < "6.0") {
                if (!needCLodop()) {
                    if (is64IE) document.write(strHtm64_Update);
                    else
                    if (isIE) document.write(strHtmUpdate);
                    else
                        document.documentElement.innerHTML = strHtmUpdate + document.documentElement.innerHTML;
                };
                return LODOP;
            };
            //===如下空白位置适合调用统一功能(如注册语句、语言选择等):===
            //LODOP.SET_LICENSES("北京XXXXX公司","8xxxxxxxxxxxxx5","","");
    
            //===========================================================
            return LODOP;
        } catch (err) {
            alert("getLodop出错:" + err);
        };
    };

    3.页面中使用

    先要引入你这个lodop.js哦

    <template>
        <div class="demo">
            <button @click="printPdf">打印</button>
    
            <form id="form1" v-show="isshow">
                <table border="1" width="300" id="tb01">
                    <tr>
                        <td width="133" id="mtb001">
                            <h2 style="background:pink;">我是表头</h2>
                        </td>
                    </tr>
                </table>
                <table border="1" width="300" height="106" cellspacing="0">
                    <tr>
                        <td>姓名</td>
                        <td>年龄</td>
                        <td>性别</td>
                    </tr>
                    <tr>
                        <td>张三</td>
                        <td>22</td>
                        <td>女</td>
                    </tr>
                </table>
            </form>
        </div>
    </template>
     
    <script>
    import { getLodop } from "../common/Lodop";
    
    export default {
        data() {
            return {
                isshow: true
            };
        },
        methods: {
            // 查询数据
            printPdf() {
                let LODOP = getLodop();
                LODOP.PRINT_INIT("采购单");
                LODOP.SET_PRINT_STYLE("FontSize", 18);
                LODOP.SET_PRINT_STYLE("Bold", 1);
                LODOP.ADD_PRINT_TEXT(50, 300, 260, 39, "采购单");
                LODOP.ADD_PRINT_HTM(
                    88,
                    200,
                    350,
                    600,
                    document.getElementById("form1").innerHTML
                );
                LODOP.PREVIEW();
            }
        }
    };
    </script>
    

     

    展开全文
  • NTKO OFFICE文档控件能够在浏览器窗口中直接编辑Word,Excel等Office文档并保存到任意Web服务器。实现文档和电子表格的统一管理。同时支持强制痕迹保留,手写签名,电子印章,版本控制等办公自动化系统必备的功能。是...
  • 点聚会定期更新本控件,并解答论坛的询问,免费代表免服务,每一个使用者都能得到及时服务。 安装包内包含: 1.WebOffice安装包(仅包含WebOffice控件) 2.WebOffice接口SDK 3.WebOffice网页接口调用例子 4.DES...
  • 7.4 使用WebParts控件实现个性化网站 实例139 创建简单的WebParts页 实例140 在WebPart控件中加入用户控件 实例141 修改WebPart控件的外观和行为 实例142 用户动态添加WebPart控件 7.5 用户控件 实例143 站内查询、...
  • 温馨提示:当前DoKit的所有功能都只针对Debug环境,Release环境未经过实际验证,所以请大家严格按照官方文档来集成,也建议大家在Release环境使用DoKit的任何功能。如果大家一定要在Release环境使用,请自行...
  • JAVA百实例源码以及开源项目

    千次下载 热门讨论 2016-01-03 17:37:40
    5个目标文件,演示Address EJB的实现,创建一个EJB测试客户端,得到名字下文,查询jndi名,通过强制转型得到Home接口,getInitialContext()函数返回一个经过初始化的下文,用client的getHome()函数调用Home接口...
  • Java日期选择控件完整源代码 14个目标文件 内容索引:JAVA源码,系统相关,日历,日期选择 Java语言开发的简洁实用的日期选择控件,源码文件功能说明: [DateChooser.java] Java 日期选择控件(主体类) [public] ...
  • 主要包括ASP.NET技术基础、VS 2008环境搭建,还详细讲解了C#语言设计入门,然后从常用Web服务器控件、ASP.NET安全验证控件、数据绑定控件Web用户控件和ASP.NET导航控件全面介绍了几乎所有ASP.NET控件应用,接着以...
  • 主要包括ASP.NET技术基础、VS 2008环境搭建,还详细讲解了C#语言设计入门,然后从常用Web服务器控件、ASP.NET安全验证控件、数据绑定控件Web用户控件和ASP.NET导航控件全面介绍了几乎所有ASP.NET控件应用,接着以...
  • 主要包括ASP.NET技术基础、VS 2008环境搭建,还详细讲解了C#语言设计入门,然后从常用Web服务器控件、ASP.NET安全验证控件、数据绑定控件Web用户控件和ASP.NET导航控件全面介绍了几乎所有ASP.NET控件应用,接着以...
  • 1.9.2 visual studio 2008安装不上 29 1.10 精彩回顾 30 第2章 asp.net必修课——c#语言基础入门 ] 20个编程技术要点 ] 11个编程技巧说明 ] 3个编程注意事项 ] 12个实例应用详解 2.1 本章学习任务...
  • 实例142 如何在web页中使用多选列表框控件 实例143 如何在web页中使用正则表达式控件 实例144 如何在web页中获取浏览器信息 实例145 如何在web页中浏览图像 实例146 如何在web页中绘制图形 实例147 如何在web页...
  • 1.9.2 visual studio 2008安装不上 29 1.10 精彩回顾 30 第2章 asp.net必修课——c#语言基础入门 ] 20个编程技术要点 ] 11个编程技巧说明 ] 3个编程注意事项 ] 12个实例应用详解 2.1 本章学习任务...
  • 7.4 使用WebParts控件实现个性化网站 实例139 创建简单的WebParts页 实例140 在WebPart控件中加入用户控件 实例141 修改WebPart控件的外观和行为 实例142 用户动态添加WebPart控件 7.5 用户控件 实例143 站内查询、...
  • 7.4 使用WebParts控件实现个性化网站 实例139 创建简单的WebParts页 实例140 在WebPart控件中加入用户控件 实例141 修改WebPart控件的外观和行为 实例142 用户动态添加WebPart控件 7.5 用户控件 实例143 站内查询、...
  • Visual C# .NET精彩编程实例集锦

    热门讨论 2011-12-20 22:57:18
    实例142 如何在Web页中使用多选列表框控件 实例143 如何在Web页中使用正则表达式控件 实例144 如何在Web页中获取浏览器信息 实例145 如何在Web页中浏览图像 实例146 如何在Web页中绘制图形 实例147 如何在Web页间...
  • 6.5 使用WebParts控件实现个性化网站 207 实例116 创建简单的WebParts页 207 实例117 在WebPart控件中加入用户控件 209 实例118 修改WebPart控件的外观和行为 209 实例119 用户动态添加WebPart控件 211 ...
  • 6.5 使用WebParts控件实现个性化网站 207 实例116 创建简单的WebParts页 207 实例117 在WebPart控件中加入用户控件 209 实例118 修改WebPart控件的外观和行为 209 实例119 用户动态添加WebPart控件 211 ...
  • 6.5 使用WebParts控件实现个性化网站 207 实例116 创建简单的WebParts页 207 实例117 在WebPart控件中加入用户控件 209 实例118 修改WebPart控件的外观和行为 209 实例119 用户动态添加WebPart控件 211 ...

空空如也

空空如也

1 2 3 4 5 ... 12
收藏数 231
精华内容 92
关键字:

web打印控件安装不上