网上找了很多方法,但都大同小异,可是自己实现起来就有点麻烦,经过多次的修修改改,完成了word-》pdf-》swf,跟swf-》pdf的转换。实现部分需求,希望对大家用帮助,
也希望大神帮忙完善这个在线预览的功能。
<span style="color:#3366FF;">1.下面是Org\Util下的Preview.class.php类代码:</span>
<?php
namespace Org\Util;
/**
*
*1.本预览调用了php内置的Upload类、使用了OpenOffice、pdf2swf软件,php.ini开启了exc、com扩展实现
*
*2.只支持microsoft office2003版本转换为pdf,然后转为swf实现预览.3M以上的文件不支持。
*
*3.文件上传成功后返回一个数组fileinfo,判断其中的error查看是否成功上传,成功上传后,数组中有原始文件上传名称,
* 源文件下载路径、预览swf文件路径.
*
*4.希望有大神帮忙解决word2007转换的问题,小弟诚心感谢
**/
class Preview{
//word转换pdf文档
private function MakePropertyValue($name,$value,$osm){
$oStruct = $osm->Bridge_GetStruct("com.sun.star.beans.PropertyValue");
$oStruct->Name = $name;
$oStruct->Value = $value;
return $oStruct;
}
private function word2pdf($doc_url, $output_url){
$osm = new \COM("com.sun.star.ServiceManager") or die ("确保您安装了OpenOffice软件");
$args = array($this->MakePropertyValue("Hidden",true,$osm));
$oDesktop = $osm->createInstance("com.sun.star.frame.Desktop");
$oWriterDoc = $oDesktop->loadComponentFromURL($doc_url,"_blank", 0, $args);
$export_args = array($this->MakePropertyValue("FilterName","writer_pdf_Export",$osm));
$oWriterDoc->storeToURL($output_url,$export_args);
$oWriterDoc->close(true);
}
private function word($doc_file,$output_file){
$doc_file = "file:///" . $doc_file;
$output_file = "file:///" . $output_file;
$this->word2pdf($doc_file,$output_file);
}
//pdf文档转换swf
private function pdf2swf($sourcePath,$targetPath){
header("Content-type: text/html; charset=utf-8");
$pdf2swf='F:/wamp/www/test/swf/pdf2swf.exe'; //pdf格式转换swf格式的程序所在目录
$argStr=$pdf2swf." -t ".$sourcePath." -s flashversion=9 ".$targetPath;
exec($argStr,$out,$status); //cmd执行命令
}
public function upload(){
header( 'Content-Type:text/html;charset=utf-8 ');
$upload = new \Think\Upload();// 实例化上传类
$upload->maxSize = 3145728 ;// 设置附件上传大小
$upload->exts = array('pdf', 'doc', 'xls');// 设置附件上传类
$upload->savePath = './Public/Uploads/'; // 设置附件上传目录
// 上传文件
$upload->saveName =Date('Y-m-d').'_'.mt_rand();
$info = $upload->upload();
if(!$info){
$error=$upload->getError();
$fileinfo=array('error'=>$error);
}else{
$filename='';
$filepath='';
foreach ($info as $file){
$name=$file['name'];//文件原始名称
$filename=$file['savename'];
$filepath=$file['savepath'];
}
$downloadUrl=$_SERVER['HTTP_CLIENT_IP']."/sky/Uploads".ltrim($filepath,'.').$filename;//文件下载路径
$filepath="F:/wamp/www/sky/Uploads".ltrim($filepath,'.');//源文件所在目录
$sourcepath=$filepath.$filename;//源文件路径,包括文件名
$path_parts= pathinfo($sourcepath);
if ($path_parts['extension']=='pdf'){
$source=$filepath.$path_parts['filename'].'.swf';
$this->pdf2swf( $sourcepath,$source);
}elseif($path_parts['extension']=='doc' or $path_parts['extension']=='docx' or $path_parts['extension']=='xls'){
$output_file=$filepath.$path_parts['filename'].'.pdf';
$this->word($sourcepath,$output_file);
$source=$filepath.$path_parts['filename'].'.swf';
$this->pdf2swf($output_file,$source);
}
$fileinfo=array(
'error'=>'成功',
'name'=>$name, //原文件上传名称
'previewUrl'=>$source, //预览swf文件路径
'downloadUrl'=>$downloadUrl,//原文件下载路径
);
}
return $fileinfo;//文件上传转换为swf所在的路径
}
}
2.下面是控制器中调用上面的预览(Preview.class.php)方法:
public function upload(){
$preview=new \Org\Util\Preview();
$arr=$preview->upload();
if($arr['error']==='成功'){
}else{
$this->error($arr['error']);
}
}
3.下面是flexpaper展示时的方法:
public function flexpaper(){
$path=$_GET['filepath'].$_GET['filename'];
$path_parts=pathinfo($path);
$pathall='/'.ltrim($path_parts['dirname'],'F:/wamp/www/').'/'.$path_parts['filename'].'.swf';
$this->assign('path',$pathall);
$this->display();
}
4.flexpaper的展示页面:
<!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN" "http://www.w3.org/TR/html4/loose.dtd">
<html>
<head>
<meta http-equiv="Content-Type" content="text/html; charset=UTF-8">
<title>Insert title here</title>
<link rel="stylesheet" type="text/css" href="__PUBLIC__/tools/flexpaper/css/flexpaper.css">
<script type="text/javascript" src="__PUBLIC__/tools/flexpaper/js/jquery.min.js"></script>
<script type="text/javascript" src="__PUBLIC__/tools/flexpaper/js/jquery.extensions.min.js"></script>
<script type="text/javascript" src="__PUBLIC__/tools/flexpaper/js/flexpaper.js"></script>
<script type="text/javascript" src="__PUBLIC__/tools/flexpaper/js/lexpaper_handlers.js"></script>
<style>
html, body { height:100%; }
body { margin:0; padding:0; overflow:auto; }
#flashContent { display:none; }
</style>
</head>
<body>
<div id="documentViewer" class="flexpaper_viewer" style="position:absolute;left:10px;top:10px;width:100%;height:100%"></div>
<script type="text/javascript">
function getDocumentUrl(document){
return "__PUBLIC__/tools/flexpaper/view.php?doc={doc}&format={format}&page={page}".replace("{doc}",document);
}
var startDocument = "Paper";
$('#documentViewer').FlexPaperViewer(
{ config : {
SWFFile : '<{$path}>',
Scale :0.6, //初始化缩放比例,参数值应该是大于零的整数
ZoomTransition : 'easeOut',//Flexpaper中缩放样式,默认参数值为easeOut.其他可选值包括: easenone, easeout, linear, easeoutquad
ZoomTime : 0.5,//从一个缩放比例变为另外一个缩放比例需要花费的时间,该参数值应该为0或更大
ZoomInterval : 0.1,//缩放比例之间间隔,默认值为0.1,该值为正数。
FitPageOnLoad : true,//初始化得时候自适应页面,与使用工具栏上的适应页面按钮同样的效果。
FitWidthOnLoad:true,//初始化的时候自适应页面宽度,与工具栏上的适应宽度按钮同样的效果。
FullScreenAsMaxWindow :true,//
ProgressiveLoading : false,
MinZoomSize : 0.2,
MaxZoomSize :1,
SearchMatchAll : false,
InitViewMode : 'Portrait',
RenderingOrder : 'flash,html',
StartAtPage : '',
ViewModeToolsVisible : true,
ZoomToolsVisible : true,
NavToolsVisible : true,
CursorToolsVisible : true,
SearchToolsVisible : false,
WMode : 'transparent',
localeChain: 'zh_CN'//设置地区(语言),目前支持以下语言。默认en_US (English)
}}
);
</script>
</body>
</html>
最后,快要过年了,祝大家新年快乐,明年生活更美好。