首页 > 系统相关 >在Ubuntu上用cups api实现打印功能

在Ubuntu上用cups api实现打印功能

时间:2023-10-12 17:44:41浏览次数:47  
标签:打印机 num 打印 dests api 上用 Ubuntu cups options

https://blog.csdn.net/weixin_48885322/article/details/127270545

在Ubuntu上用cups api实现打印功能
银离子_kg
已于 2022-10-13 10:00:47 修改 1768
收藏 5
文章标签: ubuntu linux bash
版权


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

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

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

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

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

配置环境

sudo apt install libcups2-dev

1

连接打印机

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

在这里插入图片描述

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

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

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

查看当前的默认打印机

lpstat -t

1
2

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

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

lp fork.pdf

1
2

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

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

为了要先获取当前打印机列表呢?这是因为打印的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.");

endif

    return 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;

}

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25

输出
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);

1
2
3
4
5

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文档
————————————————
版权声明:本文为CSDN博主「银离子_kg」的原创文章,遵循CC 4.0 BY-SA版权协议,转载请附上原文出处链接及本声明。
原文链接:https://blog.csdn.net/weixin_48885322/article/details/127270545

标签:打印机,num,打印,dests,api,上用,Ubuntu,cups,options
From: https://www.cnblogs.com/jiftle/p/17760138.html

相关文章

  • 【Python】FastAPI 使用python3.6+构建API的Web框架
    现代、快速(高性能)的Web框架,用于构建基于Python的 API;基于Starlette和Pydantic库构建而成官网:https://fastapi.tiangolo.com/ 1、安装#对于生产环境,还需要一个ASGI服务器,如Uvicorn或Hypercorn#>pipinstall"uvicorn[standard]"pipinstallfastapipipi......
  • 【前端小技巧】如何使用 Eolink Apilkit 调用 Mock ?
    在开发过程中,进度比较赶的情况下,前端人员当页面写完时,后台的接口还没写完,等要交付的时候后端才把接口给你,这个时候就很尴尬。这个时候Mock就可以很好的解决这个问题,前端团队可以在API还没开发完成的情况下,借助MockAPI实现预对接,加速开发进程。测试团队可以通过MockAPI......
  • ubuntu 修改系统时间
    ubuntu系统给当前系统时间增加4分钟的命令怎么用您可以使用以下命令来将当前系统时间增加4分钟:```shellsudodate-s"$(date-d'+4minutes''+%Y-%m-%d%H:%M:%S')"```解释一下这个命令:-`date-d'+4minutes''+%Y-%m-%d%H:%M:%S'`:这部分命令用于获取当前时间并在原来......
  • ubuntu 安装redis 跟一些相关命令
    一、简介二、操作三、问题 一、简介Redis是一个开源的高速内存对象存储系统,由于储存在内存里,所以运行速度快,但是重启会丢失数据,所以非常时候一些临时数据保存。二、操作在ubuntu装redis,得先安装c依赖sudoaptinstallgcctcl如果有可以先查看下......
  • 让你直呼哇塞的API管理神器
    作为开发者,包括前端、后端、测试人员最离不开的一个工具就是Postman,方便我们用来做API接口进行调试。但Postman并不完全符合我们对API的各种需求,比如维护API文档、APIMock、API自动化测试等等。最近发现一款API一站式服务的工具:Apifox,毫不夸张的说吊打Postman!1.关于ApifoxApifox......
  • C# webapi 跨域
    #region启用跨域访问app.UseCors(builder=>builder.AllowAnyMethod().SetIsOriginAllowed(_=>true).AllowAnyHeader().AllowCredentials());#endregionapp.UseCors(); //允许来自任何来源、使用任何HTTP方法、包含任何HTTP头的跨域请求,......
  • Ubuntu虚拟机-小白安装
    虚拟机的安装,分为三步骤:下载软件(VMware.exe,Ubuntu.iso,环境内部anaconda.sh)装虚拟Ubuntu内部搭建环境下载软件https://customerconnect.vmware.com/downloadshttps://cn.ubuntu.com/download剩下的一个Anaconda在虚拟好的Ubuntu系统内部下载首先安装vmvare首先安装vmva......
  • fastapi手动添加swagger文档描述
    fastapi手动添加swagger文档描述"""在正常开发过程中,fastapi会自动地将正确响应(status=200)和输入校验失败响应(status=422)添加到文档中.当有自定义的响应描述添加到文档中时,就需要我们手动添加到路径函数的:responses参数中.用户可以按照openapi的语法,将响应的描述信息添加......
  • JavaScript Library – YouTube Embedded、YouTube Player API、YouTube Data API
    YouTube EmbedVideo参考: Embedvideos&playlists它和 GoogleMapsEmbed 类似,是通过iframe完成的。<iframewidth="800"style="aspect-ratio:16/9"src="https://www.youtube.com/embed/vEZCoe9GJFk"title="粉色海洋"......
  • 搭建 Kubernetes 集群 —— API 概述
    官网文档:https://kubernetes.io/zh-cn/docs/reference/using-api/RESTAPI是Kubernetes系统的重要部分,组件之间的所有操作和通信均由APIServer处理的RESTAPI调用,大多数情况下,API定义和实现都符合标准的HTTPREST格式,可以通过kubectl命令管理工具或其他命令行工具来......