在嵌入式Linux系统上安装打印机

2023-05-16

.简介:
  在Linux环境中安装打印机,通常是cups, ghostscript等,但体积通常很大,几十兆
在我应用的环境,要求打印模块不大于5M,在网上搜索的方案是将cups的一部分提取出来,
即 imagetoraster,  rastertohp, rastertoepson.  经过精简,最后我把后两者合并,
去掉其他图片格式支持,只保留BMP,并静态编译,生成两个文件imagetoraster, rastertoany,
总计1M,并在HP-1010上测试成功。由于我的任务比较简单,所以没有考虑打印任务管理的问题。
由于HP-Deskjet需要ijs驱动,用此方法失败,用ghostscript测试成功,但比较大,15M左右,
所以不在这里介绍了。

2.打印流程
  export PPD=/sa_user_data/up/laserjet.ppd
  /root/imagetoraster 10 "" "" 1 "" "/root/1.bmp" | /root/rastertoany hp 10 "" "" 1 "" | cat > /dev/usb/lp0

  执行上述语句,可以将1.bmp打印到我的打印机HP-1010 USB激光打印机上,其中
  laserjet.ppd  打印机的驱动,可以从 linuxprinting.org上下载,不一定是1010,也许通用的就可以,比如我这里就
                用的HP激光通用驱动程序
  imagetoraster 负责将图片转换为 raster数据
  rastertoany   负责将raster数据转换为打印机认识的数据
  cat           负责将打印数据输出给打印机, 如果没有设备,就建立一个主设备好180,从设备号0的lp0
  
  imagetoraster 后面的参数分别为
                1:job_id
                2:user
                3:title
                4:Copies
                5:num_options
                6:filename
                前几个都没什么用,就按我写的就可以了
   rastertoepson 第一个参数为 hp 或  epson,表示用哪种打印机,后面的参数和imagetoraster一样

3. CUPS裁剪
   平台 Linux-2.4 + gcc3.2.2 + cups-1.1.23
   
 3.1 编译选项,需要的是静态编译,并且把没用的去掉,可以写一个脚本:
   ./configure --prefix=/root/mycupsinstall /
               LDFLAGS=--static /
               --enable-static /
               --disable-shared /
               --disable-debug /
               --disable-mallinfo /
               --disable-slp /
               --disable-ssl /
               --disable-openssl /
               --disable-gnutls /
               --disable-cdsassl /
               --disable-pam /
               --without-cups-user /
               --without-cup-group /
               --without-fontpath /
               --without-docdir /
               --without-rcdir /
               --without-openslp-libs /
               --without-openslp-includes /
               --without-openssl-libs /
               --without-openssl-includes /
               --without-java /
               --without-perl /
               --without-php /
               --without-python

     要看全部选项,./configure --help 执行完后就会生成相应的Makefile了,先不着急Make,
   先修改cups目录下config.h将#define HAVE_LIBZ 1 注掉,然后就开始修改源代码了

 3.2 删除打印信息
     默认情况下,打印时输出一堆信息,诸如检测到的图片大小等信息,我把他去掉。
   将filter下的文件common.c, rastertohp, rastertoepson.c, image.c imagetoraster.c, image-bmp.c 
   中的有stderr的地方都注掉。
 3.3 去除其他图片格式,只保留BMP  
     删除 filter/image.c中 ImageOpen函数中,文件打开部分,除bmp的东西都删除,仅保留
     if (memcmp(header, "BM", 2) == 0)
         status = ImageReadBMP(img, fp, primary, secondary, saturation, hue, lut);
     else
     {
        fclose(fp);
        status = -1;
     }
     
     修改filter/Makefile
     在IMAGEOBJS = 中删除 image-gif.o image-jpeg.o image-photocd.o image-pix.o image-png.o image-pnm.o /
                          image-sgi.o image-sgilib.o image-sun.o image-tiff.o /
 
 3.4 合并rastertohp  rastertoepson
      这两个文件打开看看差不多,由于是静态编译,若写成两个文件,每个都占用400K,合并后大约还是400K。
    合并思路如下:
        将rastertohp和rastertoepson的main函数更名为普通函数
        建立一个rastertoany.c,里面只有main函数,根据输入的参数调用rastertohp或toepson
    filter/rastertoany.c:
       #include <string.h>
       extern int rastertohp ( int argc, char *argv[] );
       extern int rastertoepson ( int argc, char *argv[] );

       int main(int  argc, char *argv[])
       { 
        if ( strcmp ( argv[1], "hp" ) == 0 )
            return rastertohp ( argc-1, &argv[1] );
        else if ( strcmp ( argv[1], "epson" ) == 0 )
         return rastertoepson ( argc-1, &argv[1] );
        else
         return 0;
       }
    filter/rastertohp.c   
      将main函数更名rastertohp
      将下列函数更名,更名的目的是rastertoepson的这些函数同名,同一个工程不能有两个同样的函数
         Setup        -->  SetupHP
         StartPage    -->  StartPageHP
         EndPage      -->  EndPageHP
         Shutdown     -->  ShutdownHP
         CancelJob    -->  CancelJobHP
         CompressData -->  CompressDataHP
         OutputLine   -->  OutputLineHP

    filter/rastertoepson.c   
       将main函数更名rastertoepson
       由于rastertohp已经更名了,这里就可以不改了。
       
    filter/Makefile
     FILTERS = 增加 rastertoany,删除 rastertohp rastertoepson
     OBJS  = 增加 rastertoany.o
     增加一个输出文件,模仿rastertohp
     rastertoany: rastertoany.o rastertohp.o rastertoepson.o ../Makedefs ../cups/$(LIBCUPS) $(LIBCUPSIMAGE)
        echo Linking $@...
        $(CC) $(LDFLAGS) -o $@ rastertoany rastertohp.o rastertoepson.o $(LINKCUPSIMAGE) $(IMGLIBS) $(LIBS)

 3.5
   编译,在cups目录下make即可,

4. 结束语
  此方法可以解决部分打印机在linux下的简单打印问题,本人只验证了 HP-1010, 打印效果达到要求,试验HP DeskJet 3420失败。修改的源代码,将来会上传到csdn资源里面。
  参考资料:
      www.linuxprinting.org               找ppd驱动
      www.cups.org                        bbs挺好的 
      google + 嵌入式linux + 打印 + B超,  这是本文思路的发源地
     http://www.gccgle.com/book/samba/CUPS-printing.html

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

在嵌入式Linux系统上安装打印机 的相关文章

随机推荐

  • ubuntu18在docker下运行kalibr

    一些命令 docker images sudo docker run it kalibr latest sudo docker run it v local path docker path respository bin bash sud
  • 机器人避障规划算法之VFH系列算法研究现状

    机器人路径规划算法可以分为全局路径规划与局部路径规划 xff0c 全局规划算法一般需要地图信息作为先验知识 xff0c 而局部规划算法利用传感器探测环境信息避开障碍物 常用的全局算法算法有可视图法 xff0c 栅格地图法 xff0c 智能算
  • Windows配置ArUco

    windows10 vs2019 opencv3 4 6 注意 xff0c 一定要选择与opencv版本一样的opencv contrib 进行编译 xff0c 否则将会出现错误 xff0c 有很多的工程不能编译通过 xff0c 不能产生相
  • ArUco估计位姿原理

    ArUco使用 PnP OpenCV aruco 校准相机 Camera Calibration Demo 使用opencv的aruco库进行位姿估计 include lt opencv2 core core hpp gt include
  • 传递函数极点与微分方程的解

    如何解微分方程 setting y 61 e rx xff0c 点睛之笔
  • MPC控制

    基于状态空间模型的控制 模型预测控制 xff08 MPC xff09 简介 对基于状态空间模型的控制理解得很到位 在这里我重点讲解一下状态空间 模型 那么什么是状态 xff1f 输出是不是也是状态的一种 xff1f 对的 xff0c 输出也
  • @卡尔曼滤波理解

    Kalman Filter For Dummies 翻译 如何用卡尔曼滤波算法求解电池SOC xff08 基础篇 xff09 转载留存 卡尔曼滤波算法详细推导 这一篇对预备知识的介绍还是很好的 xff0c 过程与原理讲解也很到位 xff0c
  • 全景避障、VIO

    VINS Mono代码分析与总结 完整版 单目与IMU的融合可以有效解决单目尺度不可观测的问题 鱼眼摄像头SLAM xff1a PAN SLAM 全景相机SLAM 原论文 xff1a Panoramic SLAM from a multip
  • CAN总线-ACK应答机制分析

    1 xff1a 应答场定义 应答场长度为 2 个位 xff0c 包含应答间隙 xff08 ACK SLOT xff09 和应答界定符 xff08 ACK DELIMITER xff09 在应答场里 xff0c 发送站发送两个 隐性 位 当接
  • 树莓派4b 引脚图

    树莓派 4B 详细资料
  • 控制~线性系统~的能控性和能观性

    现控笔记 xff08 四 xff09 xff1a 能控性和能观性 能控性 xff1a 是控制作用u t 支配系统的状态向量x t 的能力 xff1b 回答u t 能否使x t 作任意转移的问题 能观性 xff1a 是系统的输出y t 反映系
  • 创建功能包

    创建功能包 xff1a catkin create pkg 在Amos WS src路径下 xff0c 打开控制台输入catkin create pkg my package std msgs rospy roscpp 创建一个名为my p
  • SLAM算法

    一 概述 Simultaneous Localization and Mapping SLAM 原本是Robotics领域用来做机器人定位的 xff0c 最早的SLAM算法其实是没有用视觉camera的 xff08 Robotics领域一般
  • 激光雷达入门

    转载自 xff1a https zhuanlan zhihu com p 33792450 前言 上一次的分享里 xff0c 我介绍了一个重要的感知传感器 摄像机 摄像机作为视觉传感器 xff0c 能为无人车提供丰富的感知信息 但是由于本身
  • 【超详细】韦东山:史上最全嵌入式Linux学习路线图

    我是1999年上的大学 xff0c 物理专业 在大一时 xff0c 我们班里普遍弥漫着对未来的不安 xff0c 不知道学习了物理后出去能做什么 你当下的经历 当下的学习 xff0c 在未来的一天肯定会影响到你 毕业后我们也各自找到了自己的职
  • ArUco码辅助定位——计算机视觉

    使用USB网络摄像头和ROS跟踪ArUco Markers
  • 基于D435i的点云重建

    Task 采用D435i采集深度图和RGB图像 xff0c 进行点云重建和聚类 1 xff09 解析Bag数据 xff1a import os import cv2 import numpy as np import rosbag from
  • vncviewer黑屏问题解决

    最近在重启服务器后 xff0c 用vnc进行远程桌面连接时 xff0c vnc能够连上 xff0c 或有提示错误 xff0c 或无提示错误 xff0c 但显示黑屏 在网上搜索了甚久 xff0c 各种google xff0c 各种baidu
  • Unbuntu 系统及VNC Viewer显示中文

    一行命令搞定 xff1a apt get install ttf wqy zenhei
  • 在嵌入式Linux系统上安装打印机

    简介 xff1a 在Linux环境中安装打印机 xff0c 通常是cups ghostscript等 xff0c 但体积通常很大 xff0c 几十兆 在我应用的环境 xff0c 要求打印模块不大于5M xff0c 在网上搜索的方案是将cup