在Perl中通过Win32::OLE使用打印机打印格式化文档
来源:互联网 发布:samba 端口 被屏蔽 编辑:程序博客网 时间:2024/06/05 19:12
不得不说的是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就是布尔值了。
当然了,在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就是布尔值了。
- 在Perl中通过Win32::OLE使用打印机打印格式化文档
- Perl通过WIN32 OLE来操作EXCEL
- win32中使用打印机
- 通过ole打印word文档和excel文档
- perl win32::ole 操作excel
- 在JAVA项目中,使用JasperReports与iReport,直接连接打印机可打印(word excel xml pdf )文档
- 基于C#在WPF中使用斑马打印机进行打印
- android通过蓝牙连接打印机实现格式化打印
- android通过蓝牙连接打印机实现格式化打印(二)
- OLE打印PDF(Perl)
- 在vi中使用perltidy格式化perl代码
- c#通过txt文档利用打印机命令打印条码标签
- 在 .NET 框架程序中通过DllImport使用 Win32 API
- 在 .NET 框架程序中通过DllImport使用 Win32 API
- 在 .NET 框架程序中通过DllImport使用 Win32 API
- 在Lazarus中使用打印机
- 使用XPS打印机不弹保存文件名打印XPS文档
- win32枚举所有打印机和打印文字
- sql2005中一个xml聚合的例子
- 纯汇编NASM源码/显示相关函数/10H中断/纯汇编显示汉字/显示中文
- PHP PEAR 基类程序阅读与注释
- 毕业两年半,反思---工作
- 进程间通信
- 在Perl中通过Win32::OLE使用打印机打印格式化文档
- 拜师学技术,结交同道中人
- 关于覆盖和重写的思考
- 真正完美攻略之星月夜~Seven Tales in Spiral(中国同人文字AVG)
- Effective C# 1:Always Use Properties Instead of Accessible Data Members
- ASP.NET错误处理方法归结(方法1):page_error 事件
- Widget
- 中秋送祝福好方式
- BOOST 线程完全攻略 - 扩展 - 事务线程