当前位置: 首页 > news >正文

【Perl】批量word和PPT文档转pdf

由于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

 

转载于:https://www.cnblogs.com/xesam/archive/2012/11/06/2756222.html

相关文章:

  • mysql 5.7.20解压版安装配置
  • coredump简介与coredump原因总结
  • 使用paramiko模块批量修改Linux主机的密码
  • 《经济学人 —— 人工智能专题报告》
  • 五大常用算法简述
  • 如何用数学课件制作工具画角平分线
  • 自己define size_t编译出错
  • sed
  • 1月22日学习内容整理:中间件补充,model模型foreignkey参数补充
  • 提高PHP编程效率的53个要点
  • BufferedStream的性能
  • zabbix 触发器表达式详解
  • 一套海量在线用户的移动端IM架构设计实践分享(含详细图文)
  • MyEclipse设置JAVA选中高亮显示
  • CG, DCG, NDCG
  • 【Leetcode】101. 对称二叉树
  • 345-反转字符串中的元音字母
  • gops —— Go 程序诊断分析工具
  • Nacos系列:Nacos的Java SDK使用
  • PyCharm搭建GO开发环境(GO语言学习第1课)
  • vue-cli在webpack的配置文件探究
  • 基于组件的设计工作流与界面抽象
  • 前端学习笔记之原型——一张图说明`prototype`和`__proto__`的区别
  • 如何优雅的使用vue+Dcloud(Hbuild)开发混合app
  • 使用docker-compose进行多节点部署
  • 与 ConTeXt MkIV 官方文档的接驳
  • Java性能优化之JVM GC(垃圾回收机制)
  • RDS-Mysql 物理备份恢复到本地数据库上
  • zabbix3.2监控linux磁盘IO
  • 整理一些计算机基础知识!
  • ​什么是bug?bug的源头在哪里?
  • #13 yum、编译安装与sed命令的使用
  • ${factoryList }后面有空格不影响
  • (1)(1.8) MSP(MultiWii 串行协议)(4.1 版)
  • (32位汇编 五)mov/add/sub/and/or/xor/not
  • (Matalb回归预测)PSO-BP粒子群算法优化BP神经网络的多维回归预测
  • (Redis使用系列) Springboot 实现Redis消息的订阅与分布 四
  • (二)JAVA使用POI操作excel
  • (附源码)springboot家庭财务分析系统 毕业设计641323
  • (附源码)计算机毕业设计ssm基于B_S的汽车售后服务管理系统
  • (论文阅读笔记)Network planning with deep reinforcement learning
  • (十一)手动添加用户和文件的特殊权限
  • (一)认识微服务
  • .NET / MSBuild 扩展编译时什么时候用 BeforeTargets / AfterTargets 什么时候用 DependsOnTargets?
  • .NET : 在VS2008中计算代码度量值
  • .NET Core SkiaSharp 替代 System.Drawing.Common 的一些用法
  • .net 托管代码与非托管代码
  • .NET 药厂业务系统 CPU爆高分析
  • .NET构架之我见
  • @configuration注解_2w字长文给你讲透了配置类为什么要添加 @Configuration注解
  • @reference注解_Dubbo配置参考手册之dubbo:reference
  • [Android Studio 权威教程]断点调试和高级调试
  • [Android] Implementation vs API dependency
  • [Angularjs]ng-select和ng-options
  • [Arduino学习] ESP8266读取DHT11数字温湿度传感器数据