设为首页 收藏本站
查看: 609|回复: 0

[经验分享] 【Perl】批量word和PPT文档转pdf

[复制链接]
发表于 2015-12-27 13:18:02 | 显示全部楼层 |阅读模式
  由于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
  

运维网声明 1、欢迎大家加入本站运维交流群:群②:261659950 群⑤:202807635 群⑦870801961 群⑧679858003
2、本站所有主题由该帖子作者发表,该帖子作者与运维网享有帖子相关版权
3、所有作品的著作权均归原作者享有,请您和我们一样尊重他人的著作权等合法权益。如果您对作品感到满意,请购买正版
4、禁止制作、复制、发布和传播具有反动、淫秽、色情、暴力、凶杀等内容的信息,一经发现立即删除。若您因此触犯法律,一切后果自负,我们对此不承担任何责任
5、所有资源均系网友上传或者通过网络收集,我们仅提供一个展示、介绍、观摩学习的平台,我们不对其内容的准确性、可靠性、正当性、安全性、合法性等负责,亦不承担任何法律责任
6、所有作品仅供您个人学习、研究或欣赏,不得用于商业或者其他用途,否则,一切后果均由您自己承担,我们对此不承担任何法律责任
7、如涉及侵犯版权等问题,请您及时通知我们,我们将立即采取措施予以解决
8、联系人Email:admin@iyunv.com 网址:www.yunweiku.com

所有资源均系网友上传或者通过网络收集,我们仅提供一个展示、介绍、观摩学习的平台,我们不对其承担任何法律责任,如涉及侵犯版权等问题,请您及时通知我们,我们将立即处理,联系人Email:kefu@iyunv.com,QQ:1061981298 本贴地址:https://www.yunweiku.com/thread-156965-1-1.html 上篇帖子: perl 哈希 连接符 下篇帖子: Perl 旁站查询(站长工具提取)
您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

扫码加入运维网微信交流群X

扫码加入运维网微信交流群

扫描二维码加入运维网微信交流群,最新一手资源尽在官方微信交流群!快快加入我们吧...

扫描微信二维码查看详情

客服E-mail:kefu@iyunv.com 客服QQ:1061981298


QQ群⑦:运维网交流群⑦ QQ群⑧:运维网交流群⑧ k8s群:运维网kubernetes交流群


提醒:禁止发布任何违反国家法律、法规的言论与图片等内容;本站内容均来自个人观点与网络等信息,非本站认同之观点.


本站大部分资源是网友从网上搜集分享而来,其版权均归原作者及其网站所有,我们尊重他人的合法权益,如有内容侵犯您的合法权益,请及时与我们联系进行核实删除!



合作伙伴: 青云cloud

快速回复 返回顶部 返回列表