不得不说的是google上搜索出来的竟然都是《perl在win32平台上直接操作打印机》,这是非常令人抱歉的文章。很显然是初学者写的,如果连这个都不知道,我还真是佩服他怎么学perl的了,这不是单指win32下的打印办法,哪里都一样。但是这太简陋了,不是我想要的。
当然了,在avtivePerl中你可以使用ppm下载Printer来打印,但是当你看见那可怜的文档后,也许会打消这个念头,或者打印一些text是再好不过了。或者使用cpan安装Win32::Word::Writer来打印,我想它是非常好的,但前提是你能装的上它,而我在win32下装不上。
这个问题事实上困扰了我很久,因为很多时候你写的tk界面脚本,需要将分析的数据打印出来,如果不将这个功能集成进脚本,便不得不求助于其他的工具,比方说先生成一个文档,然后用openoffice或者其他打开它,最后在其中实现打印,这非常麻烦,而且也不容易让使用者接受。
既然没有特别好的针对性工具,我变依照上面的流程模拟这个过程,但这一切都是在内存中实现的,因此对于用户,不会知道里面的实现细节,这样很好。首先我用Win32::OLE打开一个文档,要保证它是不被visiable。之后将需要打印的文档按照其中的格式,打入到这个文档中。最后打印出来。不过可能是OLE的bug,这样做会在内存中保留一个到该文档的句柄,在关机的时候不有提示出错,而且如果在程序中直接使用close的话,会弹出对话框询问是否保存,这就做不到隔离使用者的效果了。所以,使用saveas将文档存到disk里,这算是一个无奈的妥协。下面是我在集群文档编辑系统中的用于打印的一个函数:
sub
file_print {
my
$cur_style
=
'
a
'
;
my
$word
=
Win32
::
OLE
->
new(
'
Word.Application
'
,
'
Quit
'
) or
die
$
!
;
$word
->
{
'
Visible
'
}
=
0
;
my
$document
=
$word
->
Documents
->
Add;
my
$selection
=
$word
->
Selection;
my
$style
=
$document
->
Styles
->
Add(
$cur_style
);
my
$style_font
=
$style
->
{Font};
$style_font
->
{Name}
=
$family
;
$style_font
->
{Size}
=
$size
;
$style_font
->
{Bold}
=
$weight
;
$style_font
->
{Italic}
=
$slant
eq
'
italic
'
?
1
:
0
;
$style_font
->
{Underline}
=
$underline
;
$document
->
ActiveWindow
->
Selection
->
{Style}
=
$cur_style
;
$selection
->
TypeText(
$textundo
->
get(
'
1.0
'
,
'
end
'
) );
$word
->
ActiveDocument
->
PrintOut;
$document
->
SaveAs(
'
printout.doc
'
);
$document
->
Close
;
$word
->
Quit;
}
因为tk下的font和word中的有些不兼容,所以做了一些变换,比如说对于slant,tk是用‘italic’和‘roman’的,相对于word就是布尔值了。