我在写一个web site , 里面有一个需求是将上传的ppt,pptx 转换为pdf 。
我写了一个简单的命令行程序,c#的,可以通过cmd来调用 完成ppt 到pdf 的转换。
但是我在php中使用system(xxxx)却不能成功执行。
现在:
1. 在php 中调用 ping 或者 ipconfig 之类的是没有问题的。
2. 在php 在调用c#命令行程序的时候,一些原本的是能够成功执行的,我看到了console.writeLine输出的内容。只是无法执行office.dll的一些方法。
我大胆猜测问题是在于我的c# 调用了office.dll的一些方法,但是这样php system 或者exec 却无法执行....
有高手能告诉我解决方案,如果不行,有替代方法完成我这个需求么? 谢谢啦~
难道是权限不够吗
您好,好像权限是没问题的,因为是可以调用到那个c#命令行的
但是好像没有执行office相关的代码,不知道为什么,问题是也不报错啊
在php代码中你是如何调用的?
$run = 'C:\xampp\htdocs\sailisan\swftools\ppt2pdf.exe C:\xampp\htdocs\sailisan\uploads\ppt\190.ppt C:\xampp\htdocs\sailisan\treated_files\13423392245.pdf';
system($run);
是这样调用的,我估计这样用没问题 ,因为我使用了swftools 来转换pdf 为swf 是成功的
我估计问题是出在c#那边office的地方,您知道c#这种命令行如果引用dll是不是需要设置什么才能被php 类似system函数调用呢?
@binchen: 不通过php,直接在命令行中可以正常运行吗?
@dudu: 可以的
@binchen: 我可以把那个给您,需要.net framework 4.0
@binchen: 操作office的那部分代码可以贴出来吗?
@dudu: 额 格式
static void convert(string originalPath , string outputPath) { Microsoft.Office.Interop.PowerPoint.ApplicationClass ac = new Microsoft.Office.Interop.PowerPoint.ApplicationClass(); Presentation p = null; Regex r_ppt = new Regex("^*\\.ppt$"); Match isPpt = r_ppt.Match(originalPath); if (isPpt.Success) { p = ac.Presentations.Open(originalPath, MsoTriState.msoCTrue, MsoTriState.msoCTrue, MsoTriState.msoFalse); } Regex r_pptx = new Regex("^*\\.pptx$"); Match isPptx = r_pptx.Match(originalPath); if (isPptx.Success) { p = ac.Presentations.Open2007(originalPath, MsoTriState.msoCTrue, MsoTriState.msoCTrue, MsoTriState.msoFalse, MsoTriState.msoFalse); } if (p == null) { Console.WriteLine("the input file is not a powerpoint file"); return; } p.SaveAs(outputPath, PpSaveAsFileType.ppSaveAsPDF, MsoTriState.msoCTrue); }
这个比较清楚, 就是这样的
@binchen: outputPath的文件系统权限检查过了吗
@dudu: 我是在apache下跑的,好像默认的用户是system ,所以这样的话 权限都是够的
我使用system('pdf2swf xxxxx')这样是能够在那个路径下生产的,我今天同事提点了下说可能是环境变量的问题,您觉得呢?
@binchen: 试试用passthru()
@dudu: 555 还是不行啊
@binchen: 会出现什么错误信息吗?
@dudu: 没有...
@binchen: 如果不调用Office,有没有问题?
@dudu: 没有的,就是如果不用 office.dll 的东西话,就是c#里面那些什么输出,if else都能执行到的