• PHP控制连接打印机


    一、需求

    1. 使用PHP控制连接打印机
    2. 现场实时连续打印动态数据

    二、配置

    1. php运行环境正确安装(Apache|Nginx + PHP)
    2. 下载与php版本对应的php_printer.dll扩展
    3. 扩展文件添加到ext目录
    4. 编辑php.ini 添加extension=php_printer.dll;

    三、使用

    1.基本的代码结构:
    <?php
    $handle = printer_open('printer name');
    
    printer_start_doc($handle, "doc name");
    printer_start_page($handle);
    printer_set_option($handle, PRINTER_MODE, "RAW");
    
    //具体的打印部分
    
    printer_end_page($handle);
    printer_end_doc($handle);
    printer_close($handle);
    ?>
    

    以上为基本的代码结构,如果不指定printer_start_docprinter_start_page,打印机是不会进行打印的。

    2.具体文字与图形的打印方法介绍
    • 对打印机的初始设定:printer_set_option,可以设定打印模式、doc标题、打印份数、纸张格式等,参考printer_set_option文档
    • 创建一个字体:$font = printer_create_font('simsun',字体高度,字体宽度,字体粗细, 是否斜体, 是否加下划线, 是否加删除线, 方向);具体参见
    • 在打印文字之前首先要选择字体printer_select_font($handle, $font);
    • 使用printer_draw_text($handle,'要打印的文字',起始x,起始y);

    四、遇到的坑

    使用一个服务器端的弱类型的脚本语言去跟硬件打交道,本来就是一件略扯得事情,过程中磨难多多啊。

    1. 在windows上开始配置的服务器是Apache,在打印的时候总是无法打印出正常的尺寸,总是连续打三页。后来,在直接在命令行使用php 命令运行脚本,可以正常的打印,最终究其原因,是Apache服务运行的权限为普通用户,改为超级管理员,或者以超级管理员的身份登录即可
    2. 字体,一些打印机都附带了相应的客户端软件。但是使用php去控制打印机软件这些东西就没卵用了,所以创建字体就是个坑,字体的名称,首先是在windows font 文件夹中找到相应的文字,然后右键属性查看名称,就是需要填在printer_create_font的第一个参数了。但是:
    • 部分类型的字体中文是无法正常显示。至今无解,可能是打印机内存有限,无法装下全部的字体文件。
    • 创建字体需要指定宽高,但是宽高的单位不知道是什么鬼,只能自己尝试
    • 同样指定问题的位置需要x y的位置坐标值,方法是printer_draw_line 画一条对角线,自己根据宽高比计算。
    1. 打印中文乱码,原因:使用表单提交过了的数据为UTF-8编码,而打印机不一定是UTF-8编码的,需要查阅说明书,进行编码格式转换。
    2. 连续打印几十几百windows直接被干死,蓝屏思密达。最终是Apache进程的问题,每一次打印都会创建一个进程,但是,Apache的进程回收貌似总是不及时,最终系统直接死掉,尝试进行最大连接数等的配置更改,并无作用。最终解决办法:更换Nginx服务器,问题解决。

    遗留问题:
    对于宽度高度单位与标签纸的尺寸的关系和单位换算,现在没弄清楚。
    对于为什么只有部分的Windows字体可以使用的原因,现在没弄清楚。


    2016.11.10更新

    一、遗留问题宽高尺寸单位换算

    通过当前使用的打印机Godex ez1105指令文档,打印机中的单位为dot,1mm=8dot,所以对于单位需查阅相应打印机型号的打印机文档。

    二、使用printer_write打印条码

    最开始打印条码的方案是使用php生成条码图片,然后使用printer_draw_bmp来打印图片,但是这样效率比较低,通过查阅决定使用printer_write方法直接打印指令

    1.找到打印机指令文档,ez1105这款打印机使用的是EZPL指令
    2.查看语法,找到条码打印指令Bt,x,y,narrow,wide,height,rotation,readable,data
    3.php代码示例

    $handle = printer_open('打印机名');
    printer_set_option($handle, PRINTER_MODE, "RAW");//printer mode必须设定为RAW
    $ZPL = "
    ^L
    Dy2-me-dd
    Th:m:s
    AZ3,86,66,4,4,0,0E,{$name}
    BA,42,158,2,5,50,0,3,99922959
    E
    "
    printer_write($handle, $ZPL);
    printer_close($handle);
    
    三、遇到的新坑

    1.在原有代码结构的基础上使用printer_write会打印两份出来,一份是基本的打印名字,另一个是指令打印的,所以使用指令打印,就不到将代码放到printer_start_doc printer_start_page中,会被视为两个不同的文档

    2.打印指令不执行

    //使用这种EZPL指令字符串
    $ZPL = "^L".PHP_EOL;
    $ZPL .= "Dy2-me-dd".PHP_EOL;
    ...
    //这种格式生成的指令无法执行,需要把指令直接放到双引号之间
    

    3.打印机总是延迟打印一个(第一次执行代码,打印机没有执行,好像缓存了)
    最终发现问题的所在是最后一个指令后面没有换行直接跟双引号

    $ZPL = "
    ^L
    Dy2-me-dd
    Th:m:s
    AZ3,86,66,4,4,0,0E,{$name}
    BA,42,158,2,5,50,0,3,99922959
    E"//这里这样是不可以的,必须换行,同样起始位置也一样,双引号后必须换行
    

    2017.01.18更新

    对新发现的内容补充一下。

    一、指令打印文字不清晰问题

    由于打印机的分辨率问题,普通的打印机(如我这使用的EZ1105)直接使用打印机指令打印中文字体,会出现锯齿,但是指令打印方式与printer_draw_text又不可以同时使用。所以既要清晰的文字还要条码信息,只能更换条码打印方式。

    之前顾虑的图片打印条码方式可能产生的效率问题,其实是多虑了,经过实践,每次生成的图片就几KB,完全不影响速度。

    所以使用了github上的一个开源库来生成条码的png图片,然后再将png的图片转为1位的bmp图片(因为php_printer 只提供了打印bmp格式的图片的方法)。具体可参考示例代码IMGGenerator.php

    注:因为printer_draw_text方法使用的字体是通过printer_create_font方法,所以每次就是生成要打印的文字的矢量数据,然后再传递给打印机,所以才清晰。

    二、打印字体宽高数值与真实的打印字号关系

    因为我们熟悉的是office中选择的一号、二号等字体打印出来的大小,但是打印机并不是一一对应,虽然知道了1mm=8dot这个公式,还是必须经过多次的尝试才能得出结论,经查文档有一个字号转换公式:

    当TTF字型的宽度与高度设为相同时,印出的字型即可与Windows字型相同,TTF字型的运算公式为: TTF字型高度 = Windows字型号数 * dpi /72. dpi即打印机的分辨率。(此部分内容打印机不同可能公式不同,请查阅相关型号打印机文档)

    部分相关实例代码已更新到github!

    附Github:连接打印机示例代码

    原文地址博客园

  • 相关阅读:
    地三鲜
    在linux下使用am335x的DMA
    通过tarball形式安装HBASE Cluster(CDH5.0.2)——集群安装总览
    通过tarball形式安装HBASE Cluster(CDH5.0.2)——如何配置分布式集群中的zookeeper
    如何通过SSH及其Client 批量分发文件和执行管理命令
    解决ESXi有虚拟机模版部署的CentOS虚拟机,网卡eth0找不到问题
    CentOS 65 安装vmware tools 杂记
    安装vmware vCenter Appliance
    使用FileZilla解决从Windows上传文件到Linux vsftpd的乱码问题!
    不关闭seLinux解决vsftpd服务本地用户不能登录问题(500 OOPS: cannot change directory:/home/***)
  • 原文地址:https://www.cnblogs.com/skyfynn/p/5895703.html
Copyright © 2020-2023  润新知