精华内容
下载资源
问答
  • Google自动打印

    千次阅读 2018-10-14 15:08:33
    浏览器打印功能,有很多小伙伴可能不太清楚,这里我们可以学习一下。...3.注意事项(这一点得看,否则运行失败还不知道问题喔)   开始: 1.打印机 去很多餐饮店,能看见收银台会有一个机器,打...

    浏览器打印功能,有很多小伙伴可能不太清楚,这里我们可以学习一下。

    情景:开发一个需要打印小票的项目。(在订单页里,给客户添加一个打印的操作)

     

    1.假设打印机已经连接好了

    2.我们这一节用的浏览器是Google Chrome (配置也是针对google的)

    3.注意事项(这一点得看,否则运行失败还不知道问题喔)

     

    开始:

    1.打印机

    去很多餐饮店,能看见收银台会有一个机器,打印出小票出来,但他们用的方法可能和我们的不一样,我们使用的是浏览器。

    但是呢,浏览器也是有浏览器打印功能的,比如在这个页面,你用鼠标点击右键,就能看到一个"打印",点击之后就会弹出一个窗口,里面可能看到我们打印的内容(整个页面)。里面还有"更多设置",你可以根据内容,还有小票的大小尺寸,内容的多少来设置,这一套设置可能会花点时间。记住:这一套配置,是针对google打印的,并且这些操作跟我们编码无关

    这些设置,并不是保存在我们服务器里的,是google浏览器的,所以说我们的开发环境配置好了,测试ok,还要去给客户配置

     

    ---------------------------我是分割线---------------------------

    补充:

    在做Google配置之前,我们先磕一些。。。上面说到,浏览器是有打印功能的,在页面鼠标右键可选择打印。 但是客户如果不太会操作电脑,对这些东西不太懂,那怎么办呢?每次都去培训客户吗,这是不正确的选择。所以我们的处理方案是,在代码里自动启动打印功能。

    JS里的方法,有一个:print();

    <script>
        print(); //启动打印功能
    </script>

    添加这么一句,启动我们这个页面的时候,就会弹出打印窗口了。

    哇,挺简单的嘛,nonono... 接下来才是问题。我们想一下,打印窗口是弹出来了,但是客户每次都要手动去点击左上角的"打印",如果客户打印小票时,他的订单特别多,那就要一直去点击,如果一不小心点击到"取消",他就懵了,因为还要考虑到,他甚至不太懂可以刷新页面,按下F5键(考虑到工作比较忙,可能会着急忘掉了刷新,或者他本就不知道刷新能重启这个功能)

    以上问题,就需去Google里做配置。做了配置之后的效果是什么呢,在这里说明一下:做好配置之后,弹出打印窗口时,客户就不需要去点击"打印",Google浏览器会自动运行"打印"。这样的话,效果就是:弹出打印窗口,自动运行打印并且关闭打印窗口,打印机若连接好,就会打印出小票

    ---------------------------我是分割线---------------------------

     

    2.Google配置

      1).打开google浏览器,在地址栏输入:"chrome://flags/"

      2).进入页面之后,按下"Ctrl+F"搜索关键字:"Enable new Print Preview UI",能看到默认值为 Default,我们需要修改为 Disabled

      3).修改之后,浏览器下方会弹出提示,点击右侧重启浏览器即可

      4).选择google(一般都在桌面上)右键属性,在目标里,最后面添加"--kiosk-printing"

     

    以上,配置好之后,就能成功运行自动打印了。(┭┮﹏┭┮我刚刚亲测了一遍,谁敢说不行站出来)

     

    3.注意事项

    这里再强调一下,以上做的配置,只是针对Google,若其他浏览器不行,是正常的!

    这里会出现一个问题,就是客户也必须使用Google浏览器,其实问题也不会太大,顶多会出现客户对Google不习惯。能不能劝解客户,就看小伙伴们的水平了。。。

    正题:第二点Google配置里,我们是在桌面上找到Google图标,然后在其属性里修改了。这里会出现一个问题,就是:只能用桌面上的这个Google才能实现自动打印。如果你是在Google的目录里,一般是在C盘下,打开程序,是不行的。我们在目录里右键选择属性,能看到,此程序是没有"目标"的,跟桌面上的是不一样的。当然,一般情况下,我们也不会去根目录里打开Google,所以这一点问题不大。     

    但还有一个,就是我们开发人员,或者客户,通常为了方便,可能会把浏览器设置在"任务栏"里,就是电脑屏幕最下面(windows系统通常是这样),如果我们在桌面上的Google属性里修改配置前,任务栏里已经有了Google,那么在任务栏里启动就不能实现自动打印,必须删除任务栏里的Google,重新在桌面上将Google添加在任务栏里。

     

    最后还有一点,是关于功能上的。自动打印成功之后,我们停留的页面,应该是 "订单小票"页面,那么为了客户方便操作,我们就要去代码里实现功能,当自动打印实现后,就关闭此页面,这样 客户就会返回在订单页面,执行下一个订单的小票打印,就不用手动删除 小票打印页面。

     

     

    展开全文
  • 一点通学校收据打印软件是一款主要面向教育系统、中小学校、培训学校,培训中心机构的收款收据单打印一点通学校收据打印软件功能: 1、可设置三联/二联/A4/B5等多种规格的打印纸张 2、只需输入小写金额,系统...
  • 一点通通用收据打印软件是一款方便打印管理统一收款收据和非统一收款收据工具。 一点通通用收据打印软件主要功能 1、可设置三联/二联/A4/B5等多种规格的打印纸张 2、自动合计总金额 3、自动生成人民币大写 4、...
  • 一点通学校收据打印软件是一款针对学校以及教育培训行业的收款收据管理软件,允许用户对收据格式进行修改、查询、删除等操作 功能介绍 1、可设置三联/二联/A4/B5等多种规格的打印纸张2、自动合计总金额3、自动生成...
  • 一点通学校收据打印软件是一个主要面向教育系统、中小学校、培训学校,培训中心机构的收款收据单打印工具。需要的朋友们可以下载试试吧! 一点通学校收据打印软件功能: 1、可设置三联/二联/A4/B5等多种规格的...
  • 一点通通用收据打印软件是一款简单易用,功能丰富的收据打印软件,用户可以通过它更加方便地打印、管理统一收款收据和非统一收款收据,软件内还有各种打印格式供用户选择,多样化的功能解决用户大部分问题。...
  • 打印

    千次阅读 2020-10-23 09:15:00
    通常不同发行版的打印配置各有不同且都会在其安装时自动完成,因此这里我们不讨论打印的配置过程。本章的练习需要一台正确配置的打印机来完成。 我们将讨论一下命令: pr —— 转换需要打印的文本文件 lpr —— ...

    前几章我们学习了如何操控文本,下面要做的是将文本呈于纸上。在这章中,我们将会着手用于打印文件和控制打印选项的命令行工具。通常不同发行版的打印配置各有不同且都会在其安装时自动完成,因此这里我们不讨论打印的配置过程。本章的练习需要一台正确配置的打印机来完成。

    我们将讨论一下命令:

    • pr —— 转换需要打印的文本文件
    • lpr —— 打印文件
    • lp —— 打印文件(System V)
    • a2ps —— 为 PostScript 打印机格式化文件
    • lpstat —— 显示打印机状态信息
    • lpq —— 显示打印机队列状态
    • lprm —— 取消打印任务
    • cancel —— 取消打印任务(System V)

    打印简史

    为了较好的理解类 Unix 操作系统中的打印功能,我们必须先了解一些历史。类 Unix 系统中的打印可追溯到操作系统本身的起源,那时候打印机和它的用法与今天截然不同。

    早期的打印

    和计算机一样,前 PC 时代的打印机都很大、很贵,并且很集中。1980年的计算机用户都是在离电脑很远的地方用一个连接电脑的终端来工作的,而打印机就放在电脑旁并受到计算机管理员的全方位监视。

    由于当时打印机既昂贵又集中,而且都工作在早期的 Unix 环境下,人们从实际考虑通常都会多人共享一台打印机。为了区别不同用户的打印任务,每个打印任务的开头都会打印一张写着用户名字的标题页,然后计算机工作人员会用推车装好当天的打印任务并分发给每个用户。

    基于字符的打印机

    80年代的打印机技术有两方面的不同。首先,那时的打印机基本上都是打击式打印机。打击式打印机使用撞针打击色带的机械结构在纸上形成字符。这种流行的技术造就了当时的菊轮式打印和点阵式打印。

    其次,更重要的是,早期打印机的特点是它使用设备内部固定的一组字符集。比如,一台菊轮式打印机只能打印固定在其菊花轮花瓣上的字符,就这点而言打印机更像是高速打字机。大部分打字机都使用等宽字体,意思是说每个字符的宽度相等,页面上只有固定的区域可供打印,而这些区域只能容纳固定的字符数。大部分打印机采用横向10字符每英寸(CPI)和纵向6行每英寸(LPI)的规格打印,这样一张美式信片纸就有横向85字符宽纵向66行高,加上两侧的页边距,一行的最大宽度可达80字符。据此,使用等宽字体就能提供所见即所得(WYSIWYG,What You See Is What You Get)的打印预览。

    接着,一台类打字机的打印机会收到以简单字节流的形式传送来的数据,其中就包含要打印的字符。例如要打印一个字母a,计算机就会发送 ASCII 码97,如果要移动打印机的滑动架和纸张,就需要使用回车、换行、换页等的小编号 ASCII 控制码。使用控制码,还能实现一些之前受限制的字体效果,比如粗体,就是让打印机先打印一个字符,然后退格再打印一遍来得到颜色较深的效果的。用 nroff 来产生一个手册页然后用 cat -A 检查输出,我们就能亲眼看看这种效果了:

    [me@linuxbox ~]$ zcat /usr/share/man/man1/ls.1.gz | nroff -man | cat -A | head
    LS(1) User Commands LS(1)
    $
    N^HNA^HAM^HME^HE$
    ls - list directory contents$
    $
    S^HSY^HYN^HNO^HOP^HPS^HSI^HIS^HS$
    l^Hls^Hs [_^HO_^HP_^HT_^HI_^HO_^HN]... [_^HF_^HI_^HL_^HE]...$
    

    ^H(ctrl-H)字符是用于打印粗体效果的退格符。同样,我们还可以看到用于打印下划线效果的[退格/下划线]序列。

    图形化打印机

    图形用户界面(GUI)的发展催生了打印机技术中主要的变革。随着计算机的展现步入更多以图形为基础的方式,打印技术也从基于字符走向图形化技术,这一切都是源于激光打印机的到来,它不仅廉价,还可以在打印区域的任意位置打印微小的墨点,而不是使用固定的字符集。这让打印机能够打印成比例的字体(像用排字机那样),甚至是图片和高质量图表。

    然而,从基于字符的方式到转移到图形化的方式提出了一个严峻的技术挑战。原因如下:使用基于字符的打印机时,填满一张纸所用的字节数可以这样计算出来(假设一张纸有60行,每行80个字符):60 × 80 = 4800字节。

    相比之下,用一台300点每英寸(DPI)分辨率的激光打印机(假设一张纸有8乘10英寸的打印区域)打印则需要 (8 × 300) × (10 × 300) / 8 = 900,000字节。

    当时许多慢速的个人电脑网络无法接受激光打印机打印一页需要传输将近1兆的数据这一点,因此,很有必要发明一种更聪明的方法。

    这种发明便是页面描述语言(PDL)。PDL 是一种描述页面内容的编程语言。简单的说就是,“到这个地方,印一个10点大小的黑体字符 a ,到这个地方。。。” 这样直到页面上的所有内容都描述完了。第一种主要的 PDL 是 Adobe 系统开发的 PostScript,直到今天,这种语言仍被广泛使用。PostScript 是专为印刷各类图形和图像设计的完整的编程语言,它内建支持35种标准的高质量字体,在工作是还能够接受其他的字体定义。最早,对 PostScript 的支持是打印机本身内建的。这样传输数据的问题就解决了。相比基于字符打印机的简单字节流,典型的 PostScript 程序更为详细,而且比表示整个页面的字节数要小很多。

    一台 PostScript 打印机接受 PostScript 程序作为输入。打印机有自己的处理器和内存(通常这让打印机比连接它的计算机更为强大),能执行一种叫做 PostScript 解析器的特殊程序用于读取输入的 PostScript 程序并生成结果导入打印机的内存,这样就形成了要转移到纸上的位(点)图。这种将页面渲染成大型位图(bitmap)的过程有个通用名称作光栅图像处理器(raster image processor),又叫 RIP。

    多年之后,电脑和网络都变得更快了。这使得 RIP 技术从打印机转移到了主机上,还让高品质打印机变得更便宜了。

    现在的许多打印机仍能接受基于字符的字节流,但很多廉价的打印机却不支持,因为它们依赖于主机的 RIP 提供的比特流来作为点阵打印。当然也有不少仍旧是 PostScript 打印机。

    在 Linux 下打印

    当前 Linux 系统采用两套软件配合显示和管理打印。第一,CUPS(Common Unix Printing System,一般 Unix 打印系统),用于提供打印驱动和打印任务管理;第二,Ghostscript,一种 PostScript 解析器,作为 RIP 使用。

    CUPS 通过创建并维护打印队列来管理打印机。如前所述,Unix 下的打印原本是设计成多用户共享中央打印机的管理模式的。由于打印机本身比连接到它的电脑要慢,打印系统就需要对打印任务进行调度使其保持顺序。CUPS 还能识别出不同类型的数据(在合理范围内)并转换文件为可打印的格式。

    为打印准备文件

    作为命令行用户,尽管打印各种格式的文本都能实现,不过打印最多的,还是文本。

    pr - 转换需要打印的文本文件

    前面的章节我们也有提到过 pr 命令,现在我们来探讨一下这条命令结合打印使用的一些选项。我们知道,在打印的历史上,基于字符的打印机曾经用过等宽字体,致使每页只能打印固定的行数和字符数,而 pr 命令则能够根据不同的页眉和页边距排列文本使其适应指定的纸张。表23-1总结了最常用的选项。

    表23-1: 常用 pr 选项

    选项描述
    +first[:last]输出从 first 到 last(默认为最后)范围内的页面。
    -columns根据 columns 指定的列数排版页面内容。
    -a默认多列输出为垂直,用 -a (across)可使其水平输出。
    -d双空格输出。
    -D format用 format 指定的格式修改页眉中显示的日期,日期命令中 format 字符串的描述详见参考手册。
    -f改用换页替换默认的回车来分割页面。
    -h header在页眉中部用 header 参数替换打印文件的名字。
    -l length设置页长为 length,默认为66行(每英寸6行的美国信纸)。
    -n输出行号。
    -o offset创建一个宽 offset 字符的左页边。
    -w width设置页宽为 width,默认为72字符。

    我们通常用管道配合 pr 命令来做筛选。下面的例子中我们会列出目录 /usr/bin 并用 pr 将其格式化为3列输出的标题页:

    [me@linuxbox ~]$ ls /usr/bin | pr -3 -w 65 | head
    2012-02-18 14:00                    Page 1
    [                   apturl          bsd-write
    411toppm            ar              bsh
    a2p                 arecord         btcflash
    a2ps                arecordmidi     bug-buddy
    a2ps-lpr-wrapper    ark             buildhash
    

    将打印任务送至打印机

    CUPS 打印体系支持两种曾用于类 Unix 系统的打印方式。一种,叫 Berkeley 或 LPD(用于 Unix 的 Berkeley 软件发行版),使用 lpr 程序;另一种,叫 SysV(源自 System V 版本的 Unix),使用 lp 程序。这两个程序的功能大致相同。具体使用哪个完全根据个人喜好。

    lpr - 打印文件(Berkeley 风格)

    lpr 程序可以用来把文件传送给打印机。由于它能接收标准输入,所以能用管道来协同工作。例如,要打印刚才多列目录列表的结果,我们只需这样:

    [me@linuxbox ~]$ ls /usr/bin | pr -3 | lpr
    

    报告会送到系统默认的打印机,如果要送到别的打印机,可以使用 -P 参数:

    lpr -P printer_name
    

    printer_name 表示这台打印机的名称。若要查看系统已知的打印机列表:

    [me@linuxbox ~]$ lpstat -a
    

    注意:许多 Linux 发行版允许你定义一个输出 PDF 文件但不执行实体打印的“打印机”,这可以用来很方便的检验你的打印命令。看看你的打印机配置程序是否支持这项配置。在某些发行版中,你可能要自己安装额外的软件包(如 cups-pdf)来使用这项功能。

    表23-2显示了 lpr 的一些常用选项

    表23-2: 常用 lpr 选项

    选项描述
    -# number设定打印份数为 number。
    -p使每页页眉标题中带有日期、时间、工作名称和页码。这种所谓的“美化打印”选项可用于打印文本文件。
    -P printer指定输出打印机的名称。未指定则使用系统默认打印机。
    -r打印后删除文件。对程序产生的临时打印文件较为有用。

    lp - 打印文件(System V 风格)

    和 lpr 一样,lp 可以接收文件或标准输入为打印内容。与 lpr 不同的是 lp 支持不同的选项(略为复杂),表23-3列出了其常用选项。

    表23-3: 常用 lp 选项

    选项描述
    -d printer设定目标(打印机)为 printer。若d 选项未指定,则使用系统默认打印机。
    -n number设定的打印份数为 number。
    -o landscape设置输出为横向。
    -o fitplot缩放文件以适应页面。打印图像时较为有用,如 JPEG 文件。
    -o scaling=number缩放文件至 number。100表示填满页面,小于100表示缩小,大于100则会打印在多页上。
    -o cpi=number设定输出为 number 字符每英寸。默认为10。
    -o lpi=number设定输出为 number 行每英寸,默认为6。
    -o page-bottom=points 

    -o page-left=points
    -o page-right=points
    -o page-top=points | 设置页边距,单位为点,一种印刷上的单位。一英寸 =72点。 |
    | -P pages | 指定打印的页面。pages 可以是逗号分隔的列表或范围——例如 1,3,5,7-10。 |

    再次打印我们的目录列表,这次我们设置12 CPI、8 LPI 和一个半英寸的左边距。注意这里我必须调整 pr 选项来适应新的页面大小:

    [me@linuxbox ~]$ ls /usr/bin | pr -4 -w 90 -l 88 | lp -o page-left=36 -o cpi=12 -o lpi=8
    

    这条命令用小于默认的格式产生了一个四列的列表。增加 CPI 可以让我们在页面上打印更多列。

    另一种选择:a2ps

    a2ps 程序很有趣。单从名字上看,这是个格式转换程序,但它的功能不止于此。程序名字的本意为 ASCII to PostScript,它是用来为 PostScript 打印机准备要打印的文本文件的。多年后,程序的功能得到了提升,名字的含义也变成了 Anything to PostScript。尽管名为格式转换程序,但它实际的功能却是打印。它的默认输出不是标准输出,而是系统的默认打印机。程序的默认行为被称为“漂亮的打印机”,这意味着它可以改善输出的外观。我们能用程序在桌面上创建一个 PostScript 文件:

    [me@linuxbox ~]$ ls /usr/bin | pr -3 -t | a2ps -o ~/Desktop/ls.ps -L 66
    [stdin (plain): 11 pages on 6 sheets]
    [Total: 11 pages on 6 sheets] saved into the file `/home/me/Desktop/ls.ps'
    

    这里我们用带 -t 参数(忽略页眉和页脚)的 pr 命令过滤数据流,然后用 a2ps 指定一个输出文件(-o 参数),并设定每页66行(-L 参数)来匹配 pr 的输出分页。用合适的文件查看器查看我们的输出文件,我们就会看到图23-1中显示的结果。

    2015-06-23/55892daddd6c2

    图 23-1: 浏览 a2ps 的输出结果

    可以看到,默认的输出布局是一面两页的,这将导致两页的内容被打印到一张纸上。a2ps 还能利用页眉和页脚。

    a2ps 有很多选项,总结在表23-4中。

    表23-4: a2ps 选项

    选项描述
    --center-title text设置中心页标题为 text。
    --columns number将所有页面排列成 number 列。默认为2。
    --footer text设置页脚为 text。
    --guess报告参数中文件的类型。由于 a2ps 会转换并格式化所有类型的数据,所以当给定文件类型后,这个选项可以很好的用来判断 a2ps 应该做什么。
    --left-footer text设置左页脚为 text。
    --left-title text设置页面左标题为 text。
    --line-numbers=interval每隔 interval 行输出行号。
    --list=defauls显示默认设置。
    --list=topic显示 topic 设置,topic 表示下列之一:代理程序(用来转换数据的外部程序),编码,特征,变量,媒介(页面大小等),ppd(PostScript 打印机描述信息),打印机,起始程序(为常规输出添加前缀的代码部分),样式表,或用户选项。
    --pages range打印 range 范围内的页面。
    --right-footer text设置右页脚为 text。
    --right-title text设置页面右标题为 text。
    --rows number将所有页面排列成 number 排。默认为1。
    -B没有页眉。
    -b text设置页眉为 text。
    -f size使用字体大小为 size 号。
    -l number设置每行字符数为 number。此项和 -L 选项(见下方)可以给文件用其他程序来更准确的分页,如 pr。
    -L number设置每页行数为 number。
    -M name使用打印媒介的名称——例如,A4。
    -n number每页输出 number 份。
    -o file输出到文件 file。如果指定为 - ,则输出到标准输出。
    -P printer使用打印机 printer。如果未指定,则使用系统默认打印机。
    -R纵向打印。
    -r横向打印。
    -T number设置制表位为每 number 字符。
    -u text用 text 作为页面底图(水印)。

    以上只是对 a2ps 的总结,更多的选项尚未列出。

    注意:a2ps 目前仍在不断的开发中。就我的测试而言,不同版本之间都多少有所变化。CentOS 4 中输出总是默认为标准输出。在 CentOS 4 和 Fedora 10 中,尽管程序配置信纸为默认媒介,输出还是默认为 A4纸。我可以明确的指定需要的选项来解决这些问题。Ubuntu 8.04 中,a2ps 表现的正如参考文档中所述。 另外,我们也要注意到另一个转换文本为 PostScript 的输出格式化工具,名叫 enscript。它具有许多相同的格式化和打印功能,但和 a2ps 唯一的不同在于,它只能处理纯文本的输入。

    监视和控制打印任务

    由于 Unix 打印系统的设计是能够处理多用户的多重打印任务,CUPS 也是如此设计的。每台打印机都有一个打印队列,其中的任务直到传送到打印机才停下并进行打印。CUPS 支持一些命令行程序来管理打印机状态和打印队列。想 lpr 和 lp 这样的管理程序都是以 Berkeley 和 System V 打印系统的相应程序为依据进行排列的。

    lpstat - 显示打印系统状态

    lpstat 程序可用于确定系统中打印机的名字和有效性。例如,我们系统中有一台实体打印机(名叫 printer)和一台 PDF 虚拟打印机(名叫 PDF),我们可以像这样查看打印机状态:

    [me@linuxbox ~]$ lpstat -a
    PDF accepting requests since Mon 05 Dec 2011 03:05:59 PM EST
    printer accepting requests since Tue 21 Feb 2012 08:43:22 AM EST
    

    接着,我们可以查看打印系统更具体的配置信息:

    [me@linuxbox ~]$ lpstat -s
    system default destination: printer
    device for PDF: cups-pdf:/
    device for printer: ipp://print-server:631/printers/printer
    

    上例中,我们看到 printer 是系统默认的打印机,其本身是一台网络打印机,使用网络打印协议(ipp://)通过网络连接到名为 print-server 的系统。

    lpstat 的常用选项列于表23-5。

    表23-5: 常用 lpstat 选项

    选项描述
    -a [printer...]显示 printer 打印机的队列。这里显示的状态是打印机队列承受任务的能力,而不是实体打印机的状态。若未指定打印机,则显示所有打印队列。
    -d显示系统默认打印机的名称。
    -p [printer...]显示 printer 指定的打印机的状态。若未指定打印机,则显示所有打印机状态。
    -r显示打印系统的状态。
    -s显示汇总状态。
    -t显示完整状态报告。

    lpq - 显示打印机队列状态

    使用 lpq 程序可以查看打印机队列的状态,从中我们可以看到队列的状态和所包含的打印任务。下面的例子显示了一台名叫 printer 的系统默认打印机包含一个空队列的情况:

    [me@linuxbox ~]$ lpq
    printer is ready
    no entries
    

    如果我们不指定打印机(用 -P 参数),就会显示系统默认打印机。如果给打印机添加一项任务再查看队列,我们就会看到下列结果:

    [me@linuxbox ~]$ ls *.txt | pr -3 | lp
    request id is printer-603 (1 file(s))
    [me@linuxbox ~]$ lpq
    printer is ready and printing
    Rank      Owner   Job     File(s)           Total Size
    active    me      603     (stdin)           1024 bytes
    

    lprm 和 cancel - 取消打印任务

    CUPS 提供两个程序来从打印队列中终止并移除打印任务。一个是 Berkeley 风格的(lprm),另一个是 System V 的(cancel)。在支持的选项上两者有较小的区别但是功能却几乎相同。以上面的打印任务为例,我们可以像这样终止并移除任务:

    [me@linuxbox ~]$ cancel 603
    [me@linuxbox ~]$ lpq
    printer is ready
    no entries
    

    每个命令都有选项可用于移除某用户、某打印机或多个任务号的所有任务,相应的参考手册中都有详细的介绍。

    展开全文
  • 一点通房租物业水电收据打印软件是一款非常实用的房租水电费收据打印工具。这款一点通房租收据打印软件为使用者提供房间信息管理、收据录入打印、收据查询统计等多项特色功能,非常适用于房产中介、物业行业等。 ...
  • WinCC + Excel + VBS = 定时自动打印报表

    万次阅读 2013-10-29 19:49:19
    打印机自动打印 1.3 报表格式 标记说明: (1)AVE:每时DATA的平均值 (2)MAX:每时DATA的最大值 (3)MIN:每时DATA的最小值 (4)每时:每整点的瞬时值 TAG COMMENT Total Flow Gas Flow Air Flow

    转载请注明:http://write.blog.csdn.net/postedit/13044767

    1 任务描述


    1.1 报表生成时间


    0时10分

    1.2 打印时间


    打印机自动打印

    1.3 报表格式


    标记说明:

    (1)AVE:每时DATA的平均值

    (2)MAX:每时DATA的最大值

    (3)MIN:每时DATA的最小值

    (4)每时:每整点的瞬时值
    TAG COMMENTTotal FlowGas FlowAir Flow
    TAG NOFI-123FI-456PIA-789
    UNITNm3/hNm3/hkPa
    06:00999999999999-9.99
    07:00999999999999-9.99
    08:00999999999999-9.99
    09:00999999999999-9.99
    10:00999999999999-9.99
    11:00999999999999-9.99
    12:00999999999999-9.99
    13:00999999999999-9.99
    AVE999999999999-9.99
    MAX999999999999-9.99
    MIN999999999999-9.99


    2 运行环境


    Windows XP Sp3 英文版;WinCC Runtime V7.0 Sp2; Excel 2003


    3 结构说明


    WinCC的OnlineTableControl负责数据采集和导出,Excel负责处理格式和计算,VBS负责自动化。


    4 代码


    4.1 自动定时导出数据,得到csv文件


    不难发现Bill Gates超喜欢Basic。

    Tag的归档周期设为1h,OnlineTableControl的时间范围选2 - Number of measurement points填8个点。控件中Export标签的“Show Dialogue Window”去掉,不然自动过程会被弹出框打断。

    WinCC中写下如下VBS全局脚本,Tigger设定为Cyclic 1s:

    Option Explicit
    Function action
    
    If Hour(Now)= 13 And Minute(Now)= 10 Then
    	Dim objScrWindow
    	Dim objTable
    
    	'shift to wanTest.pdl
    	If Second(Now)= 0 Then
    		Set objScrWindow = HMIRuntime.Screens("main").ScreenItems("workspace")
    		objScrWindow.ScreenName= "wanTest"
    	End If
    
    	'export to csv
    	If Second(Now)= 5 Then
    		Set objTable= HMIRuntime.Screens("main.workspace:wanTest").ScreenItems("Control1")
    		objTable.ExportFilename= Year(Now)&"-"&Month(Now)&"-"&Day(Now)
    		objTable.Export()
    	End If
    
    	'realse OnlineTableControl stop button
    	If Second(Now)= 10 Then
    		Set objTable= HMIRuntime.Screens("main.workspace:wanTest").ScreenItems("Control1")	
    		objTable.StartStopUpdate()
    	End If
    	
    	'run vbs
    	If Second(Now)= 12 Then
    		Dim objWScript
    		Set objWScript = CreateObject("WScript.Shell")
    		objWScript.Run "C:\Export\OnlineTableControl\excelVbs.vbs"	
    	End If
    
    End IfEnd Function


    实际应用后,定时自动切画面这个功能新奇但略显诡异,于是将OnlineTableControl控件窗口缩小到指甲壳大小,藏在main画面的另一个控件之后,实现完全的后台运行,由于脚本并没有调用.Activate方法,所以画面的正常操作与报表后台打印之间并不影响,实际测试也验证了这一点。

    4.1.1 VBS切换WinCC画面


    切换WinCC画面:HMIRuntime.BaseScreenName = "Newpdl"

    切换WinCC画面中某窗口画面:HMIRuntime.Screens(BaseScreenName.ScreenWindow:ScreenName).ScreenName = "Newpdl"

    4.1.2 VBS时间


    Now:2013/10/28 21:47:39

    Hour(Now):21  Minute(Now):47 ...

    4.1.3 VBS操作WinCC控件


    ’wanTest中OnlineTableControl的名称为Control1


    'WinCC的VBS函数和方法可以从其自带的帮助文档中查到


    导出数据:Control1.Export()


    更改导出文件名称:Control.ExportFilename = "string"


    '在导出操作时,stop按钮会自动按钮,若不松开切画面不切换,下次导出的数据仍是老的数据


    启停:Control.StartStopUpdate()


    4.2 VBS操作Excel,不同文件间剪切数据,自动分列,自动打印


    文件间的动作通过VBS来实现,单个文件内的动作通过VBS调用VBA宏来实现。

    录制宏真是一个了不起的创意。其实程序粗浅来理解,不就是人的一连串动作的实现及其自动化吗?

    Excel文件,工具-选项-安全性-个人信息选项:保存时从文件属性中删除个人信息,勾选去掉,不然自动化过程会被弹框打断。VBA使用MS Office中的“VBA项目数字证书”(推荐)或将宏安全级别设为低,不然宏不能执行。

    分列宏:

    Sub Macro3()
    '
    ' Macro3 Macro
    ' Macro recorded 28-10-2013 by admin
    '
    
    '
        Sheets("Sheet1").Select
        Columns("B:F").Select
        Selection.ClearContents
        Columns("A:A").Select
        Application.CutCopyMode = False
        Selection.TextToColumns Destination:=Range("A1"), DataType:=xlDelimited, _
            TextQualifier:=xlDoubleQuote, ConsecutiveDelimiter:=False, Tab:=False, _
            Semicolon:=True, Comma:=False, Space:=False, Other:=False, FieldInfo _
            :=Array(Array(1, 1), Array(2, 1), Array(3, 1), Array(4, 1), Array(5, 1), Array(6, 1)), _
            TrailingMinusNumbers:=True
    End Sub

    打印宏:

    Sub Macro6()
    '
    ' Macro6 Macro
    ' Macro recorded 28-10-2013 by admin
    '
    
    '
        Sheets("Sheet2").Select
        ActiveWindow.SelectedSheets.PrintOut Copies:=1, Collate:=True
        Sheets("Sheet1").Select
        ActiveWorkbook.Save
    End Sub

    VBS源码:

    dim csvPath,csvName
    csvPath = "C:\Export\OnlineTableControl\"
    csvName = Year(now) & "-" & Month(now) & "-" & Day(now) & ".csv"
    
    'copy data from csv
    Dim objExcel 
    Set objExcel = CreateObject("Excel.Application")
    objExcel.WorkBooks.Open(csvPath + csvName)
    objExcel.Windows(csvName).Activate
    objExcel.Range("A1 : A9").Select
    objExcel.Selection.Copy
    objExcel.ActiveWindow.Close
    
    'paste to xls, TextToColumns, print out, save
    objExcel.WorkBooks.Open(csvPath + "wan.xls")
    objExcel.Windows("wan.xls").Activate
    objExcel.Sheets("Sheet1").Select
    objExcel.Range("A1 : A9").Select
    objExcel.ActiveSheet.Paste
    objExcel.Run "Macro3"
    WScript.Sleep 1000
    objExcel.Sheets("Sheet2").Select
    objExcel.Run "Macro6"
    objExcel.ActiveWindow.Close
    
    objExcel.WorkBooks.Close

    分列TextToColumns在VBS下做了几次都不成功,干脆放到excel宏里面做,这样层次也很清晰。

    分列后,wan.csv的sheet1得到便于处理的数据,sheet2中可以任意编辑报表格式,框的大小、字体等等,数据格

    link到sheet1的指定位置,例如:sheet2某个格子需要取sheet1中B2的数据,则填=Sheet1!B2。若link其他excel的格子则:='new.csv'!$B$2。

    最大值的计算对于excel更是轻松了,如=MAX(B4:B11),稍微研究一下,就发现自己以前完全没有真正认识到excel的威力。

    5 小结


    各自做各自擅长的事:WinCC采集原始数据,定时触发,导出到文件;VBS协调一切,在WinCC全局脚本、Windows、Excel中都有其身影;Excel完成各种格式要求、简单的运算、打印;自动定时打印报表就这么实现了。









    展开全文
  • go的原生map删除元素,内存会自动释放吗? 请参照博客:Go的原生map中删除元素,内存会自动释放吗? 先说结论: 如果删除的元素是值类型,如int,float,bool,string以及数组和struct,map的内存不会自动释放 ...

    sync.map是什么?

    请参照博客:Go1.9 sync.Map揭秘

    go的原生map删除元素,内存会自动释放吗?

    请参照博客:Go的原生map中删除元素,内存会自动释放吗?

    先说结论:

    • 如果删除的元素是值类型,如int,float,bool,string以及数组和struct,map的内存不会自动释放

    • 如果删除的元素是引用类型,如指针,slice,map,chan等,map的内存会自动释放,但释放的内存是子元素应用类型的内存占用

    map和sync.map两者区别:

    乍一看除了sync.map不能为nil之外,两者没什么区别。但其实不然
    具体可见如下的实验

    小知识:sync.map开箱即用,不能赋值为nil
    初始值为:sync.Map{mu:sync.Mutex{state:0, sema:0x0}, read:atomic.Value{v:interface {}(nil)}, dirty:map[interface {}]*sync.entry(nil), misses:0}

    重要一点:

    申请一个全局map来保证内存被分配到堆上面

    实验1

    普通的sync.map,保存的是int到int的映射,会执行delete删除每一项,执行垃圾回收,看内存是否被回收,

    package main
    
    import (
    	"fmt"
    	"log"
    	"runtime"
    	"sync"
    )
    
    var lastTotalFreed uint64
    var intMap sync.Map
    var cnt = 80920
    
    func main() {
    	printMemStats()
    
    	initMap()
    	runtime.GC()
    	printMemStats()
    
    	fmt.Printf("%#v", intMap)
    	fmt.Println()
    
    	for i := 0; i < cnt; i++ {
    		intMap.Delete(i)
    	}
    	fmt.Printf("%#v", intMap)
    	fmt.Println()
    
    	runtime.GC()
    	printMemStats()
    
    }
    
    func initMap() {
    
    	for i := 0; i < cnt; i++ {
    		intMap.Store(i, i)
    	}
    }
    
    func printMemStats() {
    	var m runtime.MemStats
    	runtime.ReadMemStats(&m)
    	log.Printf("Alloc = %v TotalAlloc = %v  Just Freed = %v Sys = %v NumGC = %v\n",
    		m.Alloc/1024, m.TotalAlloc/1024, ((m.TotalAlloc-m.Alloc)-lastTotalFreed)/1024, m.Sys/1024, m.NumGC)
    
    	lastTotalFreed = m.TotalAlloc - m.Alloc
    }
    
    

    看结果前,解释下几个字段:

    • Alloc:当前堆上对象占用的内存大小。
    • TotalAlloc:堆上总共分配出的内存大小。
    • Sys:程序从操作系统总共申请的内存大小。
    • NumGC:垃圾回收运行的次数。
    • 中间会以go的语法形式打印出来

    结果如下:

    2019/12/19 15:00:45 Alloc = 89 TotalAlloc = 89  Just Freed = 0 Sys = 1700 NumGC = 0
    2019/12/19 15:00:46 Alloc = 6794 TotalAlloc = 12123  Just Freed = 5328 Sys = 13522 NumGC = 3
    打印结果(太多暂省略)
    打印结果(太多暂省略)
    2019/12/19 15:00:46 Alloc = 3634 TotalAlloc = 29595  Just Freed = 20633 Sys = 29978 NumGC = 6
    

    Alloc代表了map占用的内存大小,这个结果表明,执行完delete后,map占用的内存明显表变小,从6794变到了3634。***!!!!看到这里你可能就会疑惑了***,不是前面说不会进行垃圾回收的吗?怎么就内存占用变小了?

    下面我们把cnt(元素数目)改小,具体看一下打印结果

    2019/12/19 15:38:05 Alloc = 90 TotalAlloc = 90  Just Freed = 0 Sys = 1700 NumGC = 0
    2019/12/19 15:38:06 Alloc = 92 TotalAlloc = 125  Just Freed = 33 Sys = 2084 NumGC = 1
    2019/12/19 15:38:06 Alloc = 92 TotalAlloc = 128  Just Freed = 2 Sys = 2340 NumGC = 2
    sync.Map{mu:sync.Mutex{state:0, sema:0x0}, read:atomic.Value{v:sync.readOnly{m:map[interface {}]*sync.entry(nil), amended:true}}, dirty:map[interface {}]*sync.entry{0:(*sync.entry)(0xc042074020), 2:(*sync.entry)(0xc042074030), 6:(*sync.entry)(0xc042074050), 7:(*sync.entry)(0xc042074058), 8:(*sync.entry)(0xc042074060), 9:(*sync.entry)(0xc042074068), 1:(*sync.entry)(0xc042074028), 3:(*sync.entry)(0xc042074038), 4:(*sync.entry)(0xc042074040), 5:(*sync.entry)(0xc042074048)}, misses:0}
    sync.Map{mu:sync.Mutex{state:0, sema:0x0}, read:atomic.Value{v:sync.readOnly{m:map[interface {}]*sync.entry(nil), amended:true}}, dirty:map[interface {}]*sync.entry{}, misses:0}
    

    我们暂不去关心整体打印顺序的变化,这是由于go自身启用立即回收的原因
    只看两次sync.map的打印结果,可以明显看出sync.map的read部分没有改变,dirty部分在执行完delete操作之后被回收。是的!!!前面看到的内存占用数减少就是dirty这部分被清除的结果。
    关于为何dirty数据会被清除请参照文章开头链接博客

    实验二

    sync.map套子sync.map,顶层sync.map是int到子map的映射,子sync.map是int到int的映射,同样执行delete,看垃圾回收情况。

    给出代码,分析过程同实验一

    package main
    
    import (
    	"fmt"
    	"log"
    	"runtime"
    	"sync"
    )
    
    var intMapMap sync.Map
    
    var cnt = 800
    var lastTotalFreed uint64 // size of last memory has been freed
    
    func main() {
    	// 1
    	printMemStats()
    
    	// 2
    	initMapMap()
    	runtime.GC()
    	printMemStats()
    
    	fmt.Printf("%#v", intMapMap)
    	fmt.Println()
    
    	for i := 0; i < cnt; i++ {
    		intMapMap.Delete(i)
    	}
    
    	fmt.Printf("%#v", intMapMap)
    	fmt.Println()
    
    	runtime.GC()
    	printMemStats()
    
    }
    
    func initMapMap() {
    
    	for i := 0; i < cnt; i++ {
    		intMapMap.Store(i, make(map[int]int, cnt))
    
    	}
    }
    
    func printMemStats() {
    	var m runtime.MemStats
    	runtime.ReadMemStats(&m)
    	log.Printf("Alloc = %v TotalAlloc = %v  Just Freed = %v Sys = %v NumGC = %v\n",
    		m.Alloc/1024, m.TotalAlloc/1024, ((m.TotalAlloc-m.Alloc)-lastTotalFreed)/1024, m.Sys/1024, m.NumGC)
    
    	lastTotalFreed = m.TotalAlloc - m.Alloc
    }
    
    
    展开全文
  • 要想知道那个是我们关注的,这里有个最简单快速的办法,在notepad中点击打印选择打印机确定后,分别删除上面两个文件夹中的fpmvpr_drv.dll文件,这样很快知道C:/WINDOWS/system32/spool/drivers/w32x86/3中的fpmvpr_...
  • 应用内购:自动更新订阅教程

    千次阅读 2017-07-20 10:38:49
    苹果在 WWDC 2016 前推出了一个新特性:可自动更新订阅。没有比什么特性比它更能让你的钱包变厚了。通常的内购中,苹果会拿走 30% 的份额而你获得剩余的 70%。如果用户订阅了 1 年的自动更新订阅,苹果只拿走 15
  • 由于文档获取人数太多,大家如有需求,请关注公众号:【数据分析与统计学之美】,回复关键词:【自动化文档】! 目录   章节一:python使用openpyxl操作excel     1、openpyxl库介绍     2、python怎么...
  • zap 是 uber 开源的 Go 高性能日志库,支持不同的日志级别, 能够打印基本信息等,但不支持日志的分割,这里我们可以使用 lumberjack 也是 zap 官方推荐用于日志分割,结合这两个库我们可以实现以下功能的日志机制...
  • 据说不重启也可以,因为会自动检查,但是还是保险一点 搞定 这样,我们搞定了。 当然,shell脚本你想怎么写怎么写。我只是提供一个简单的事例。 再提供一个备份mysql数据库、本地网站数据,ng...
  • LINUX打印系统

    千次阅读 2017-06-30 13:41:49
    打印系统介绍 一、Linux打印 1.1 Linux打印简介   首先需要了解的是,打印在Unix世界的演化中总是围绕着PostScript页面描述语言展开的。该语言是由Adobe公司开发的,它是一个成熟的、用于描述一个文档每个页面...
  • Web自动化测试(全网最给力自动化教程)

    万次阅读 多人点赞 2017-08-27 19:22:26
    python+selenium自动化软件测试(第2章):WebDriver API 欢迎您来阅读和练手!您将会从本章的详细讲解中,获取很大的收获!开始学习吧! 目录 2.1 操作元素基本方法2.2 常用8种元素定位(Firebug和...
  • 虚拟打印相关

    千次阅读 2012-05-08 17:45:58
    Windows打印体系结构简析与虚拟打印 所谓的迷你驱动和微软统一驱动有啥不同? Windows打印体系和打印机驱动的关系。  不过要澄清的是,一般而言的打印机驱动程序不仅仅包括了打印驱动部分, 还包括了假脱机...
  • Eclipse的LogCat总是自动清空怎么办?

    千次阅读 2015-12-11 22:03:40
    我们经常会遇到这样一种情况,由于Log太多,导致我们的LogCat总是被自动清空,该怎么办?错误信息看不到,How to do?其实,我们通过adb shell来解决这个问题。1.配置环境变量环境变量的配置并不是必需的,但是为了...
  • web页面jsp页面的打印

    万次阅读 2014-09-05 10:47:28
    报表在信息系统中占据了极为重要的位置,广义上讲,报表主要以多样的格式呈现和打印动态数据,动态数据主要指保存在数据库中的数据,也可以是文本中的数据、XML数据、Hibernate数据、EJB数据、自定义数据或则是其他...
  • Linux下项目自动部署脚本

    千次阅读 2018-08-28 10:39:34
    这是本人第一次写shell 脚本,如果有一点错误的地方请谅解 因为平时上线部署项目都是手动进行的,大概分四步: 1:备份正在运行的项目文件 2:关闭Tomcat 3:复制需要部署的项目文件到Tomcat的weapps路径下 4:...
  • github仓库项目自动部署到阿里云

    千次阅读 2019-03-02 13:59:19
    原文链接 前言 我的博客之前一直是手动更新的,需要自己打包,...其实很久之前有想做自动部署的想法了,一直在拖,最近最近两天效率比较高(不怎么懒),于是花了两天时间搞好了自动部署。 A: 什么! 弄个自动...
  • javaWeb项目 打印日志

    千次阅读 2019-06-17 11:09:52
    关于日志打印的几点建议以及非最佳实践 日志的打印在软件开发过程中必不可少,一般分为两个大类: 操作日志 系统日志 操作日志,主要针对的是用户,例如在Photoshop软件中会记录自己操作的步骤,便于用户...
  • 3d打印利器FreeCAD入门教程之一----基础操作篇FreeCAD是什么概要介绍在3D空间中导航在零件设计工作台和素描工作台中工作 FreeCAD是什么 FreeCAD是一种通用的3D CAD建模软件,来自法国Matra Datavision公司,是完全...
  • 记一次redis缓存被莫名删除

    千次阅读 2019-02-12 16:07:08
    用户反馈token总是很快失效,token是由redis保存的,有效期一小时,...然后,检查token什么时候消失,用ttl key的方式一直查询token的有效期,发现有效期是正常的一个小时,但是在很短时间内token删除了   ...
  • CaysnPrinter打印示例程序:CaysnPrinter打印机开发包示例程序_Sample_20170710 CaysnPrinter打印示例程序C#版:CaysnPrinter打印机开发包示例程序_SampleCSharp_20170710 CaysnPrinter打印开发包接口说明文档...
  • Delphi 打印 Tprinter(1)

    万次阅读 2013-04-08 14:35:32
    打印  打印对于许多 Windows 程序员来说是十分...对于更为复杂的打印,仅需了解几个要领和技术,用户可以实现任何类型的自定义打印。 当了解了这些后,打印不那么困难了。 Delphi 的TPrinter对象封装了 W
  • 说明:该篇博客是博主一字一码编写的,实属不易,请...关于unittest框架,早在之前的《Python接口自动化测试框架实战开发(一)》、《Selenium3与Python3实战开发Web自动化测试框架(二)》、《Web自动化测试实战...
  • jsp页面实现打印

    万次阅读 2009-10-20 21:08:00
    报表在信息系统中占据了极为重要的位置,广义上讲,报表主要以多样的格式呈现和打印动态数据,动态数据主要指保存在数据库中的数据,也可以是文本中的数据、XML数据、Hibernate数据、EJB数据、自定义数据或则是其他...
  • 如何在基于 Windows Server 2003 的打印服务器上配置 Internet 打印loadTOCNode(2, summary); 以下各节说明如何在基于 Windows Server 2003 的打印服务器上配置 Internet 打印。安装 IISloadTOCNode(3, summary); ...

空空如也

空空如也

1 2 3 4 5 ... 20
收藏数 78,614
精华内容 31,445
关键字:

一点打印就自动删除