快捷搜索:

Windows 打印选项在Linux 上移植

移植是实现传统高层利用法度榜样跨平台运行的一项核心技巧。打印子系统移植是利用法度榜样移植的紧张组成部分。实现打印选项设置模块在不合平台上的用户接口UI(User Interface)转换是实现打印子系统移植历程中的一项核心技巧。本文将重点阐述一种应用GNOME Print在Linux平台上实现Windows打印选项设置的移植措施。

本文第一节将简要先容Windows平台上的打印设置和相关数据布局;第二节先容Linux平台上GNOME Print的打印设置和相关数据布局;第三节先容GNOME Print打印设置的移植架构;第四节先容移植的细节;第五节则进一步评论争论Linux平台上GNOME Print以外的打印设置措施;本文的简要总结在第六节中给出。

1. Windows打印选项设置

图1 Windows系统打印设置对话框

在Windows平台上,用户可以经由过程Windows系统打印设置对话框(如图1所示)来完成对打印选项的设置。法度榜样员可以经由过程调用Windows API DocumentProperties() 来得到该系统打印设置对话框。图1为一款EPSON打印机的打印设置对话框,用户可以经由过程该对话框来设置打印属性,如打印纸张的大年夜小和纸张的偏向等等。该对话框是Windows为用户供给的一个友好的前台UI界面;与之相对应的后台核心数据则被存储在Windows标准数据布局DEVMODE中。 DEVMODE布局的原形定义如下:

typedef struct _devicemode {

BCHAR dmDeviceName[CCHDEVICENAME];

WORD  dmSpecVersion;

WORD  dmDriverVersion;

WORD  dmSize;

WORD  dmDriverExtra;

DWORD dmFields;

union {

struct {

short dmOrientation; //打印纸张偏向

short dmPaperSize;  //打印纸张名称

short dmPaperLength; //打印纸张长度

short dmPaperWidth; //打印纸张宽度

short dmScale;

short dmCopies;

short dmDefaultSource;

short dmPrintQuality;

};

POINTL dmPosition;

DWORD dmDisplayOrientation;

DWORD dmDisplayFixedOutput;

};

}

在此简要先容DEVMODE布局的三个紧张参数:打印纸张名称,打印纸张偏向,和打印纸张大年夜小(长度和宽度)。其他参数因为篇幅限定,在此不作一一解析,有兴趣的读者请参考MSDN。以下以n_DevMode为例进行阐明:

DEVMODE n_DevMode;

(1) 打印纸张名称在Windows中被定义为:

n_DevMode.dmPaperSize

Windows将纸张名称预定义为一系列整数宏,如DMPAPER_LETTER,DMPAPER_A4等等。

(2) 打印纸张偏向在Windows中被定义为:

n_DevMode.dmOrientation

该参数可以取如下两个值:DMORIENT_PORTRAIT表示纸张偏向为纵向;DMORIENT_LANDSCAPE表示纸张偏向为横向。

(3) 打印纸张的长度和宽度在Windows中被定义为:

n_DevMode.dmPaperLength

n_DevMode. dmPaperWidth

这两个参数的单位为0.1毫米。

2. Linux GNOME Print打印选项设置

在Linux平台上,可以应用GNOME Print来实现打印设置功能。GNOME Print是GNOME支持Linux打印的模块。GNMOE Print涵盖了打印实现的各个方面,比如设置打印功能,天生打印文档,设置打印字体等等。以下仅针对GNOME Print中和设置打印选项相关的功能进行阐述。

图2 Linux GNOME Print系统打印设置对话框

Linux GNOME Print系统打印设置对话框如图2所示。该对话框是GNOME Print打印设置的前台UI界面。在GNOME Print中,打印设置的后台数据被封装在布局GnomePrintConfig中。同时,GNOME Print还供给了一系列函数,如gnome_print_config_set()和gnome_print_config_get(),来造访该布局。具体内容请参考第四小节。

GnomePrintJob * pJob;

GnomePrintConfig *pConfig;

pJob = gnome_print_job_new(NULL);

if (!pJob)

return 0;

GnomePrintConfig的默认值可以经由过程接下来的调用gnome_print_job_get_config() 来得到:

pConfig = gnome_print_job_get_config(pJob);

if (!pConfig)

return 0;

4.2 设置GNOME Print打印参数

获得GnomePrintConfig后,用户可以根据必要改动打印功课设置。如下代码设置了三个紧张的打印参数:

1. 打印纸张名称:A4。

2. 打印纸张偏向:R0。在GNOME Print中,R0和R180表示打印纸张偏向为纵向;R90和R270则表示打印纸张偏向为横向。

3. 打印纸张长度单位表示:cm(厘米)。长度可以应用厘米或英寸(inch)等单位来表示。在此时应用cm以方便移植。

//设置参数变量

const char *pPaperName   = "A4";

const char *pPaperOrientation = "R0";

const char *pPreferedUnit  = "cm";

//设置纸张名称

gnome_print_config_set( pConfig,

(const guchar*)GNOME_PRINT_KEY_PAPER_SIZE,

(const guchar*)pPaperName );

//设置打印纸张偏向

gnome_print_config_set( pConfig,

(const guchar*)GNOME_PRINT_KEY_PAPER_ORIENTATION,

(const guchar*)pPaperOrientation )

//设置纸张大年夜小

gnome_print_config_set( pConfig,

(const guchar*)GNOME_PRINT_KEY_PREFERED_UNIT,

(const guchar*)pPreferedUnit) );

留意:以上代码是经由过程函数gnome_print_config_set()来改变GnomePrintConfig设置的。事实上,每个 GNMOE Print系统打印设置对话框(图2)都邑和一个GnomePrintConfig布局相关联。用户对该对话框选项的改变都有可能影响到后台 GnomePrintConfig布局的相关数值。更为详细的说,当用户点击图2中"确定"按钮后,与之相连的GnomePrintConfig布局的相关数值就会根据用户的选择被自动更新。

n_DevMode.dmPaperWidth =(short)(PaperWidth_pt*2.54*100/72+0.5);

n_DevMode.dmPaperLength = (short)(PaperLength_pt*2.54*100/72+0.5);

在此,代码(short)(x+0.5)的含义是返回浮点数x的四舍五入整数值。

4.3.3 读取打印纸张偏向

移植法度榜样可以经由过程函数gnome_print_config_get()来获取当前的打印纸张的偏向。鄙人面的代码中,打印纸张偏向称被存储在字符串变量pPaperName中。

char *pPageOrientation = (char*)gnome_print_config_get(

pConfig,

(const guchar*)GNOME_PRINT_KEY_ORIENTATION);

if (!pPageOrientation)

return 0;

Windows将打印纸张偏向存储在布局DEVMODE.dmOrientation中。移植法度榜样必要进行如下转换:

if ((0 == strcmp(pPageOrientation, "R0"))||(0 == strcmp(pPageOrientation, "R180")))

n_DevMode.dmOrientation = DMORIENT_PORTRAIT;

else if ((0 == strcmp(pPageOrientation, "R90"))||(0 == strcmp(pPageOrientation, "R270")))

|-------- XML error: The previous line is longer than the max of 90 characters ---------|

n_DevMode.dmOrientation = DMORIENT_LANDSCAPE;

4.4 GNOME Print清理事情

在应用完GNOME Print打印设置后,必要手动开释分配的内存。

gnome_print_config_unref(pConfig);

gnome_print_job_close(pJob);

5.GNOME Print打印设置措施与自定义打印设置措施

应用GNOME Print就要遵照GNOME Print的数据接口。当然应用GNOME Print并不是在Linux平台上完成打印选项设置的独一选择。不少Linux利用法度榜样,无论是移植利用法度榜样照样在Linux平台上直接开拓的利用法度榜样,经由过程自定义打印前台(即打印设置对话框)和打印后台(即打印数据布局)来完成打印设置功能。在此将这种实现要领称为自定义打印设置措施。

自定义打印设置措施为利用法度榜样的开拓供给了很多机动性。应用这种要领可以使开拓者不必局限于GNOME Print的数据接口,而按照自己的意愿设计打印设置接口。然而这种自定义打印设置措施会大年夜大年夜增添开拓的事情量,由于今世利用法度榜样都要对多说话和国际化进行支持。在这种条件下,自定义打印设置措施就意味着开拓者要自行支持各类说话情况(即locale)下的打印设置事情。

应用GNOME Print就可以避免这些事情。这是由于GNOME Print本身已经供给了对各类说话情况的支持。比如说,GNOME Print系统打印对话框会自动根据当前locale变换显示说话。图2中的对话框便是GNOME Print对话框在"zh_CN"(简体中文)locale下的显示效果。假如把Linux当前locale设置成"en_US"(美国英语),那么图2 的对话框将会变玉成英文的显示效果。

6.停止语

本文概述了一种应用GNOME Print实现Windows打印选项设置在Linux平台上的移植措施。本文以设置打印纸张名称、打印纸张偏向和打印纸张大年夜小为例阐述了该移植措施的实现细节。有了上述移植实现,Windows利用法度榜样就可以无裂缝地在Linux平台上实现对打印选项的设置操作。此外,本文还比较阐发了Gnome Print打印设置措施和自定义打印设置措施。读者可以经由过程这部分内容进一步懂得不合移植措施的上风与局限。

您可能还会对下面的文章感兴趣: