PDF转换成Word,ppt转换成word
pdf与word我没找到直接转换的方式,不过可以用间接方式嘛!
pdf ==》picture ==》word!ppt转word的原理也是先把ppt转成图片,再把图片插入word!
先准备好几个程序集:fontbox-0.1.0-dev.dll,IKVM.GNU.Classpath.dll,IKVM.Runtime.dll,Interop.Microsoft.Office.Core.dll,PDFBox-0.7.3.dll,Spire.Doc.dll,Spire.License.dll,Spire.Pdf.dll
一个小工具:gswin32.exe
pdf转word主要代码:
/// <summary> /// 将PDF文档转换成图片 /// </summary> /// <param name="pdfFile">PDF文档物理路径</param> /// <param name="imgPath">转换成的图片文件的存放物理路径</param> /// <param name="isDeletePDF">转换成图片文件以后是否删除原PDF文档</param> /// <returns>返回转换成的图片文件物理路径的集合</returns> public List<string> PdfToImages(string pdfFile, string imgPath, bool isDeletePDF) { List<string> imgList = new List<string>(); PDDocument doc = PDDocument.load(pdfFile); int pageCount = doc.getDocumentCatalog().getAllPages().size();//计算pdf文档的总页数 string pdfFileName = Path.GetFileName(""); int index = pdfFileName.LastIndexOf('.'); if (index != -1) pdfFileName = pdfFileName.Substring(0, index); string imgFile = Path.Combine(imgPath, pdfFileName);//转换成的图片文件 if (pageCount == 0) return null; if (pageCount == 1) { imgFile += ".jpg"; imgList.Add(imgFile); if (File.Exists(imgFile)) File.Delete(imgFile); } else { for (int i = 0; i < pageCount; i++) { string _imgFile = imgFile + (i + 1).ToString() + ".jpg"; imgList.Add(_imgFile); if (File.Exists(_imgFile)) File.Delete(_imgFile); } imgFile += "%d.jpg"; } //此调用方法有命令框出现 // System.Diagnostics.Process.Start(System.Configuration.ConfigurationManager.AppSettings["GhostScriptView"] +"\\gswin32.exe", System.Configuration.ConfigurationManager.AppSettings["GhostScriptArguments"] + @" -sOutputFile=" + imgFile + " " + pdfFile); ProcessStartInfo startinfo = new ProcessStartInfo(); startinfo.CreateNoWindow = true; startinfo.FileName = System.Configuration.ConfigurationManager.AppSettings["GhostScriptView"] + "\\gswin32.exe"; startinfo.Arguments = System.Configuration.ConfigurationManager.AppSettings["GhostScriptArguments"] + @" -sOutputFile=" + imgFile + " " + pdfFile; startinfo.WindowStyle = ProcessWindowStyle.Hidden; startinfo.CreateNoWindow = true; startinfo.UseShellExecute = true; Process p = new Process(); p.StartInfo = startinfo; p.Start(); if (p.WaitForExit(60*1000*10)) { Thread.Sleep(1000); p.Close(); } if (isDeletePDF) { File.Delete(pdfFile); } return imgList; }
/// <summary> /// 图片插入word /// </summary> /// <param name="ImagesURL">图片路径集合</param> public void PicToWord(List<string> ImagesURL) { //Thread.Sleep(1000); //Process[] thepro = Process.GetProcessesByName("gswin32"); //if (thepro.Length > 0) ////如果进程曾在或者不止一个 //{ // //逐个结束 // for (int i = 0; i < thepro.Length; i++) // { // //如果还没有结束就关闭他 // if (!thepro[i].CloseMainWindow()) thepro[i].Kill(); // } //} for (int i = 0; i < ImagesURL.Count; i++) { if (File.Exists(ImagesURL[i].ToString() + ".jpg")) { File.Delete(ImagesURL[i].ToString() + ".jpg"); } if (File.Exists(ImagesURL[i].ToString())) { File.Copy(ImagesURL[i].ToString(), ImagesURL[i].ToString() + ".jpg"); } } //ThreadPool.QueueUserWorkItem( //使用线程池 //(P_temp) => //使用lambda表达式 //{ word.Application newapp = new word.Application(); //创建Word应用程序对象 object nothing = System.Reflection.Missing.Value; word.Document newdoc = newapp.Documents.Add(ref nothing, ref nothing, ref nothing, ref nothing);//生成一个word文档 if (newdoc != null) { try { for (int i = (ImagesURL.Count - 1); i >= 0; i--) { string a = ImagesURL[i].ToString() + ".jpg"; newdoc.InlineShapes.AddPicture(a); File.Delete(ImagesURL[i].ToString()); File.Delete(ImagesURL[i].ToString() + ".jpg"); } } catch (Exception ex) { this.TextBox1.Text = ex.Message; } // newdoc.Close(); newdoc.SaveAs("F:\\Test.docx"); newapp.Quit(); }
// });
}
ppt转word主要代码:
/// <summary> /// PPT转Word /// </summary> /// <param name="pptPath">ppt文件路径</param> /// <param name="imgPath">图片路径</param> /// <param name="WordPath">存放word文档路径</param> /// <returns></returns> public bool PPTToWord(string pptPath,string imgPath,string WordPath) { bool bo=true; List<string> image = new List<string>(); try { var app = new PowerPoint.Application(); var ppt = app.Presentations.Open(pptPath, Core.MsoTriState.msoFalse, Core.MsoTriState.msoFalse, Core.MsoTriState.msoFalse); var index = 0; var fileName = System.IO.Path.GetFileNameWithoutExtension(pptPath); foreach (PowerPoint.Slide slid in ppt.Slides) { ++index; //设置图片大小 slid.Export(imgPath + string.Format("page{0}.png", index.ToString()), "png", 1024, 768); image.Add(imgPath + string.Format("page{0}.png", index.ToString())); } //释放资源 ppt.Close(); app.Quit(); GC.Collect(); } catch (Exception ex) { bo = false ; } Word.Application newapp = new Word.Application(); //创建Word应用程序对象 object nothing = System.Reflection.Missing.Value; Word.Document newdoc = newapp.Documents.Add(ref nothing, ref nothing, ref nothing, ref nothing);//生成一个word文档 if (newdoc != null) { try { for (int i = (image.Count - 1); i >= 0; i--) { string a = image[i].ToString(); newdoc.InlineShapes.AddPicture(a); File.Delete(image[i].ToString()); } } catch (Exception ex) { bo = false; } newdoc.SaveAs(WordPath); newapp.Quit(); } return bo; }
这就ok了!
但是!当小女子放到服务器(win2008)上发现,天呐!bug!bug!bug!pdf能转成图片,但是在插入图片的时候报错,未将对象引用到实例!再看看ppt转word。Oh my god!ppt不能open!
奇怪,在我的电脑上没问题呀,这是怎么回事呢!仔细看看规律。pdf与office不是同一回事,出问题的都是office!抱着试试的心态,给office赋予权限去!
comexp.msc -32,打开32位的组件服务。"组件服务"->"计算机"->"我的电脑"->"DCOM配置"。找到office,给每一个office配置都赋予权限。
1、右键==》属性==》安全==》启动和激活权限==》自定义==》编辑==》添加Everyone==》本地启动、本地激活。
2、右键==》属性==》安全==》访问权限==》自定义==》编辑==》添加Everyone==》本地访问。
3、右键==》属性==》安全==》配置权限==》自定义==》编辑==》添加Everyone==》完全控制。
4、右键==》属性==》标识==》交互使用户。
看看我们的程序,这个时候已经完全成功了!!!!