在Ubuntu上用cups api實現打印功能

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

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章