由於linux上處理word和ppt比較麻煩,而且有檔案格式專利的問題,所以以下操作全部在Windows下面進行。
首先需要安裝Microsoft Save as PDF附加元件,官方:http://www.microsoft.com/zh-cn/download/details.aspx?id=7
安裝成功後可以手工將文檔另存新檔pdf。
需要引用“Win32::OLE”模組
use Win32::OLE;use Win32::OLE::Const 'Microsoft Word';use Win32::OLE::Const 'Microsoft PowerPoint';
word轉pdf:
sub word2pdf{ my $word_file = $_[0]; my $word = CreateObject Win32::OLE 'Word.Application' or die $!; $word->{'Visible'} = 0; my $document = $word->Documents->Open($word_file) || die("Unable to open document ") ; my $pdffile = $word_file.".pdf"; $document->saveas({FileName=>$pdffile,FileFormat=>wdExportFormatPDF}); $document -> close ({SaveChanges=>wdDoNotSaveChanges}); $word->quit();}
ppt轉pdf
sub ppt2pdf{ my $word_file = $_[0]; my $word = CreateObject Win32::OLE 'PowerPoint.Application' or die $!; $word->{'Visible'} = 1; my $document = $word->Presentations->Open($word_file) || die("Unable to open document ") ; my $pdffile = $word_file.".pdf"; $document->saveas($pdffile,32); $document -> close ({SaveChanges=>wdDoNotSaveChanges}); $word->quit();}
注意事項:
1、PPT轉換中如果設定powerpoint不顯示,即$word->{'Visible'} = 0,會導致轉換失敗。
2、如果使用完整的路徑,路徑名中不能有空格以及“%”等特殊符號,不然無法開啟文檔。
轉換當前檔案夾下的檔案:
use Cwd;my $dirname = getcwd();@files = glob "*.doc";foreach (@files){ print $dirname.'/'.$_, "\n"; word2pdf($dirname.'/'.$_);}
如果要同時轉換子檔案夾的檔案,可以先遍曆,然後再轉換:
use File::Find;find(sub { word2pdf($File::Find::name) if /\.(doc|docx)/; ppt2pdf($File::Find::name) if /\.(ppt|pptx)/;}, "D:/test");
為了避免多次重複開啟word,可以先擷取所有需要轉換的文檔,集中轉換:
find(sub { push(@file_word, $File::Find::name) if /\.(doc|docx)/;}, "D:/test");word2pdf(@file_word);sub deleteSpace{ my $filename = $_[0]; my @temp = split(/\//, $filename); my $filename_without_path = pop(@temp); $filename_without_path =~ s/\s+//g; join('/', @temp).'/'.$filename_without_path;}sub word2pdf{ my @files = @_; my $word = CreateObject Win32::OLE 'Word.Application' or die $!; $word->{'Visible'} = 0; foreach (@files){ my $new_name = deleteSpace($_); rename($_, $new_name); print $new_name, "\n"; my $document = $word->Documents->Open($new_name) || die "can not open document"; my $pdffile = $new_name.".pdf"; $document->saveas({FileName=>$pdffile,FileFormat=>wdExportFormatPDF}); $document -> close ({SaveChanges=>wdDoNotSaveChanges}); } $word->quit();}
也可以換一種實現,先調用chdir到子目錄中,然後在子目錄中進行轉換,可以避免目錄有不合法字元導致的轉換失敗,不過檔案名稱的不合法字元導致的失敗也不可避免,所以以上的各種轉換,都需要先提出空格以及特殊字元才行,deleteSpace僅僅替換了空格,還需要改進。
轉載請註明來自小西山子【http://www.cnblogs.com/xesam/】
本文地址:http://www.cnblogs.com/xesam/archive/2012/11/06/2756222.html