不得不说的是
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
就是布尔值了。