最近由于工作需要,要写一套打印相关的接口。

Linux上一般自带一套管理打印机的通用工具,叫cups。

它提供了打印机的连接,配置,打印等等功能,因此我这次选择用cups的api来实现打印相关的内容。

cups本身提供了一系列命令行工具方便用户使用,我们接下来会使用一些命令行来测试。

文章目录

  • @[toc]
    • 配置环境
    • 连接打印机
    • 获取当前打印机列表
    • 设置打印参数
    • 打印

配置环境

sudo apt install libcups2-dev

连接打印机

当我们将打印机开机并正确连接到电脑上之后,进入设置->打印机页面会看到当前连接的打印机。

比如我现在连接的是惠普的501dn打印机。

Ubuntu预装了cups相关的内容,打印机连接不需要手动配置,系统会自动进行配置。

当只连接一台打印机的时候,Ubuntu会将当前打印机自动设置为默认打印机。

#查看当前的默认打印机
lpstat -t

我们这个时候还需要打印一次文件,来测试一下打印机的连接无误,以及打印机本身可以正常使用。

#打印文件,我这里打印的是之前准备好的pdf
lp fork.pdf

如果打印成功,那就可以进行接下来的步骤啦!

如果打印的有问题,请根据打印机的提示解决问题后再进行下一步操作。

获取当前打印机列表

为了要先获取当前打印机列表呢?这是因为打印的api的入参需要打印机名,因此需要获取打印机列表,来获取打印机名。

打印机名是可以修改的,但是一般系统都会自动配置,因此我们下需要获取一下才能知道就具体的打印机名是什么。

int get_printer_list()
{printf("[%s] Start\n", __FUNCTION__);cups_dest_t *dests = NULL;int num_dests = 0;int i = 0;num_dests = cupsGetDests(&dests);if (num_dests == 0 &&(cupsLastError() == IPP_STATUS_ERROR_BAD_REQUEST ||cupsLastError() == IPP_STATUS_ERROR_VERSION_NOT_SUPPORTED)){#ifdef PRT_DEBUG_cupsLangPrintf(stderr, "Printer: Error - add '/version=1.1' to server name.");
#endifreturn NULL;}for (i = 0; i < num_dests; i++){printf("[%s] printer name is %s \n", __FUNCTION__, dests[i].name);}cupsFreeDests(num_dests, dests);return num_dests;
}

输出
printer name is HP-LaserJet-Pro-M501dn

解析:

上面用到了一个结构体cups_dest_t,这个结构体用于表示cups的目的地(destinations)。

typedef struct cups_dest_s       /**** Destination ****/
{char       *name,          /* 打印机名*/*instance;     /* Local instance name or NULL */int        is_default;     /* 是默认打印机? */int        num_options;        /* 打印机设置的数量 */cups_option_t *options;       /* 打印机设置 */
} cups_dest_t;

其中的name就是我们需要的打印机名。

在打印机已经配置好了的情况下,可以直接通过cupsGetDests来获取cups_dest_t。

// @brief   获取当前的destinations列表// @return  destinations的数量即当前打印机的数量int cupsGetDests(cups_dest_t ** dests);

cupsGetDests返回当前的打印机数量,因此只要返回值不大于0,我们就可以遍历当前的cups_dest_t变量,获取对应的打印机名。

设置打印参数

我们在打印的时候有时会选择单面打印,有时会选择双面打印,这些都需要额外设置,因此我们需要先设置才能进行打印。

不设置也可以打印,此时使用默认的打印参数,一般是单页单面打印。

//这里先设置两个全局变量
cups_option_t *cups_options; // cups设置
int num_options; //入参是想要设置的打印参数值,如2, "A4", "lrtb", "two-sided-short-edge"等
//可以设置的参数不止这些,我只是挑了一些常用的做示范
void set_printer_options(int number_up,char *media,char *number_up_layout, char *sides)
{cups_options = NULL;num_options = 0;char NumberUp[2] = {0};snprintf(NumberUp, 2, "%d", number_up);/* 设置打印参数 */num_options = cupsAddOption("number-up", NumberUp, num_options, &cups_options);num_options = cupsAddOption("media", media, num_options, &cups_options);num_options = cupsAddOption("number-up-layout", number_up_layout, num_options, &cups_options);num_options = cupsAddOption("sides", sides, num_options, &cups_options);
}

这里用到了cups_option_s这个结构体,它也是cups_dest_s的成员,结构体的内容如下:

typedef struct cups_option_s     /**** Printer Options ****/
{char       *name;          /* Name of option */char        *value;         /* Value of option */
} cups_option_t;

执行cupsAddOption会将对应的参数加入参数数组(cups_option_t)。

cupsAddOption会返回当前的参数个数,因此如果在每次执行之后都将num_options打印出来会发现num_options的数值是1,2,3,4,这样就是设置成功了。

打印

知道了打印机名并获取了参数之后,就可以进行正式打印啦!

int printer_print_file(char *printername, char *filepath)
{printf("[%s] Start\n", __FUNCTION__);printf("[%s] printer_name: %s, file_path: %s\n", __FUNCTION__,printername,filepath);//"Print report"是打印的标题,这个可以随意换// num_options和cups_options都用设置参数那一节的全局变量,不然之前设置的打印参数不生效int jobid = cupsPrintFile(printername, filepath, "Print report", num_options, cups_options);return jobid;
}

进行打印的函数是cupsPrintFile,这个函数会返回当前打印任务的id。

经过测试可以打印文本,pdf,图片等内容,但是建议打pdf类型的,因为其他类型打印出来格式经常会有问题。

参考资料:
cups api文档

在Ubuntu上用cups api实现打印功能相关推荐

  1. 在该系统上全局禁用了虚拟打印功能,不会为该虚拟机启用此功能--解决办法

    问题描述:在开启此虚拟机时,提示在该系统上全局禁用了虚拟打印功能,不会为该虚拟机启用此功能. 解决办法:在VMware workstation页面依次点击 编辑--首选项--设备--启用虚拟机打印-- ...

  2. 在该系统上全局禁用了虚拟打印功能,不会为该虚拟机启用此功能。虚拟设备“serial0“”将开始断开连接。

    VMware Workstation安装Ubuntu时,出现 解决方法: 点击"编辑",选择"首选项" 喜欢技术的,一起进群交流学习吧!!!

  3. VMware虚拟机提示在该系统上全局禁用了虚拟机打印功能

    问题: 解决步骤:

  4. 如何在 Ubuntu Linux 上安装 CUPS 打印服务器?

    1.什么是cups? CUPS(common unix printer system)是一种供Unix以及类Unix操作系统使用的打印系统,提供打印及打印服务机制. 在具有多台打印机的环境中,可以使用 ...

  5. QT中QPrinter打印功能

    这两天处理了一下QT程序连接网络打印机执行打印的功能 描述:QT程序运行在Linux.Windows平台,软件运行过程中可根据用户的需要生成一系列的报表,现在需要将这些数据自动布局成报表的格式,并实现 ...

  6. Vue实现PDF导出和打印功能

    在Vue页面上实现PDF导出和打印功能依赖于两个npm插件,分别为vue-to-pdf和vue-easy-printer. 安装命令: npm i vue-to-pdf --save npm i vu ...

  7. 入门系列之在Ubuntu上使用MySQL设置远程数据库优化站点性能

    欢迎大家前往腾讯云+社区,获取更多腾讯海量技术实践干货哦~ 本文由苏子晨 发表于云+社区专栏 介绍 随着您的应用程序或网站的增长,您可能已经超出了当前的服务器设置.如果您在同一台计算机上托管Web服务 ...

  8. 如何在Ubuntu上安装OnlyOffice Docs 7.1?

    如何在Ubuntu上安装OnlyOffice Docs 7.1? 什么是OnlyOffice Docs? OnlyOffice Docs是一套在线办公软件,可以打开阅读并编辑文档.表格和幻灯片文件,完 ...

  9. linux安装无线打印机,Unraid 安装CUPS实现共享打印和无线打印

    Unraid 安装CUPS实现共享打印和无线打印 2020-11-29 16:08:34 51点赞 486收藏 51评论 创作立场声明:个人瞎折腾,文中部分内容来自网络,本人并非专业人士,只是将个人的 ...

最新文章

  1. pytest+allure环境别人电脑运行正常,自己运行不正常几种情况
  2. 【原创】Kakfa utils源代码分析(三)
  3. APUE-文件和目录(二)函数access,mask,chmod和粘着位
  4. jQuery中append、insertBefore、after与insertAfter方法注意事项
  5. Python 技术篇-百度语音API鉴权认证获取Access Token实例演示
  6. Android开发之EditText输入框限制输入数字和字母的实现方式
  7. Insider Dev Tour 2019 全球巡演 苏州站
  8. 希尔排序--Java
  9. Cow Picnic(POJ-3256)
  10. 不用背景图片,只用css代码实现面包屑样式
  11. 嵌入式工程师开发工作主要做些什么,以后收入怎样
  12. 6个好用的Web开发工具
  13. Linux selinux关闭方法和防火墙关闭方法
  14. ASoC Machine驱动代码框架图
  15. 磁盘工具无法修复磁盘怎么办
  16. struts 框架介绍 原理透析 struts概念说明
  17. 霍尼韦尔发力中国互联市场
  18. 数据结构与算法训练:第十八弹
  19. ins图片视频批量下载
  20. 2014年5月份第1周51Aspx源码发布详情

热门文章

  1. ubuntu tmp目录overflow的解决方案
  2. 去AV片马赛克,开发者被抓了
  3. 手机和电脑基于java的socket简单通信
  4. 【python】24点游戏算法
  5. layui的轮播图片自适应大小_解决Layui 表格自适应高度的问题
  6. css 长度单位的理解
  7. 科普:长度单位“米”是怎么得来的
  8. SQL中while语句求1到100的和
  9. 怎样在视频流媒体服务器里实现RTSP h265转RTMP?
  10. vs code上配置tcl/tk语言开发环境