使用Aspose組件轉換圖片
使用Aspose組件的好處是,不需要用戶的機器上安裝Office,也可以完成我們想要的功能。這個優勢實在是太明顯了,所以,我最終選折了這個方案。而且,Aspose完全支持word、ppt、和pdf,甚至excel也沒問題。
首先我們要准備好Aspose的dll 引用到我們項目中,這里是下載鏈接: https://pan.baidu.com/s/11gMa_G05KvQSSrq31Db2Kw
下面的代碼就摘自示范Demo中。
上傳文件js,Form表單提交代碼:
//保存上傳的課件 function Save() { if ($("#txtTitle").val() == "") { layer.msg('課件名稱不能為空', function () { }); return; } if ($("#upfile").val() == "") { layer.msg('上傳文件不能為空', function () { }); return; } if ($("#iid").val()==0) { layer.msg('關聯章節課程不能為空', function () { }); return; } $('#form-horizontalid').ajaxSubmit({ url: "/Resources_Add/Upload", type: "POST", dataType: "json", data: $('#form-horizontalid').serialize(), beforeSend: function (xhr, self) { var index = layer.load(0, { shade: false }); //0代表加載的風格,支持0-2 if ($("#WaitingUp").html() != "") { $("#WaitingUp").html("(正在上傳)"); } if ($("#WaitingUp_img").html() != "") { $("#WaitingUp_img").html("(正在上傳)"); } }, success: function (data) { layer.closeAll(); if (data == "-1") { layer.msg('上傳文件格式錯誤', function () { }); return; } if (data > 0) { if (data == "888") { layer.msg('PPT文件異常,請檢查文件!', { icon: 2 }); return; } if (data == "999") { layer.msg('課件名稱已存在', function () { }); } else if (data == "0") { layer.msg('操作失敗', { icon: 2 }); } else { layer.msg('操作成功!', { icon: 1 }); if ($("#WaitingUp").html() != "") { $("#WaitingUp").html("(上傳成功)"); } if ($("#WaitingUp_img").html() != "") { $("#WaitingUp_img").html("(上傳成功)"); } setTimeout("window.location.href = '/Admin/Resources'", 1000); } return; } else { layer.msg('操作失敗', { icon: 2 }); return; } }, error: function (data) { layer.closeAll(); layer.msg('上傳文件異常!', { icon: 2 }); } }); }
#region 1.0上傳文件時調用轉換圖片的方法 public string Upload() { double FileSize = 0; string imgName = string.Empty; string imgUrl = "/img/Map"; //課程id string Curriculumid = Request["Curriculumid"]; //章id string Chapterid = Request["Chapterid"]; //課程節id string SectionId = Request["iid"]; string url = string.Empty; string filePath = string.Empty; string CourseName = Request["txtTitle"]; HttpPostedFileBase hpFile = Request.Files["upfile"]; //1.0判斷文件是否為空 if (hpFile != null) { //1.1獲取文件后綴名 string FileType = System.IO.Path.GetExtension(hpFile.FileName); //1.2獲取路徑 string FileName = Path.GetFileName(hpFile.FileName).Replace(FileType, "").Replace(".", "") + FileType; url = ResourceConversionURL(FileName); filePath = Server.MapPath(url); hpFile.SaveAs(filePath); //獲取文件大小 System.IO.FileInfo fileinfo = new System.IO.FileInfo(Server.MapPath(url)); FileSize = System.Math.Ceiling(fileinfo.Length/1024.0);
//這里在執行轉換圖片的時候需要調用Aspose類 LicenseHelper.ModifyInMemory.ActivateMemoryPatching(); if (FileType == ".pptx" || FileType == ".ppt") { PictureConversion pc = new PictureConversion(); imgName = pc.ConvertToImage_PPT(filePath, Server.MapPath(imgUrl), 0, 0, 145, FileType, imgUrl); if (imgName=="888") { return "888"; } if (imgName != "" || imgName != null) { int i = 0; i = Add(Curriculumid, Chapterid, SectionId, CourseName, FileType, imgName); if (i > 0) { return "1"; } else if (i==-2) { return "999"; } else { return "0"; } } } else if (FileType == ".mp4") { if (FileSize>0) { int i = 0; i = Add(Curriculumid, Chapterid, SectionId, CourseName, FileType, url); if (i > 0) { return "1"; } else if (i == -2) { return "999"; } else { return "0"; } } } else { return "-1"; } } return ""; } #endregion
ModifyInMemory類代碼:
using System; using System.Collections.Generic; using System.IO; using System.Reflection; using System.Runtime.CompilerServices; using System.Text; using System.Xml; namespace LicenseHelper { public static class ModifyInMemory { private static string AsposeList = "Aspose.3D.dll, Aspose.BarCode.dll, Aspose.BarCode.Compact.dll, Aspose.BarCode.WPF.dll, Aspose.Cells.GridDesktop.dll, Aspose.Cells.GridWeb.dll, Aspose.CAD.dll, Aspose.Cells.dll, Aspose.Diagram.dll, Aspose.Email.dll, Aspose.Imaging.dll, Aspose.Note.dll, Aspose.OCR.dll, Aspose.Pdf.dll, Aspose.Slides.dll, Aspose.Tasks.dll, Aspose.Words.dll"; public static void ActivateMemoryPatching() { Assembly[] arr = AppDomain.CurrentDomain.GetAssemblies(); foreach (Assembly assembly in arr) { if (AsposeList.IndexOf(assembly.FullName.Split(',')[0] + ".dll") != -1) ActivateForAssembly(assembly); } AppDomain.CurrentDomain.AssemblyLoad += new AssemblyLoadEventHandler(ActivateOnLoad); } private static void ActivateOnLoad(object sender, AssemblyLoadEventArgs e) { if (AsposeList.IndexOf(e.LoadedAssembly.FullName.Split(',')[0] + ".dll") != -1) ActivateForAssembly(e.LoadedAssembly); } private static void ActivateForAssembly(Assembly assembly) { MethodInfo miLicensed1 = typeof(ModifyInMemory).GetMethod("InvokeMe1", BindingFlags.NonPublic | BindingFlags.Static); MethodInfo miLicensed2 = typeof(ModifyInMemory).GetMethod("InvokeMe2", BindingFlags.NonPublic | BindingFlags.Static); MethodInfo miEvaluation = null; Dictionary<string, MethodInfo> miDict = new Dictionary<string, MethodInfo>() { {"System.DateTime" , miLicensed1}, {"System.Xml.XmlElement", miLicensed2} }; Type[] arrType = null; bool isFound = false; int nCount = 0; try { arrType = assembly.GetTypes(); } catch (ReflectionTypeLoadException err) { arrType = err.Types; } foreach (Type type in arrType) { if (isFound) break; if (type == null) continue; MethodInfo[] arrMInfo = type.GetMethods(BindingFlags.NonPublic | BindingFlags.Static); foreach (MethodInfo info in arrMInfo) { if (isFound) break; try { string strMethod = info.ToString(); if ((strMethod.IndexOf("(System.Xml.XmlElement, System.String)") > 0) && (miDict.ContainsKey(info.ReturnType.ToString()))) { miEvaluation = info; MemoryPatching(miEvaluation, miDict[miEvaluation.ReturnType.ToString()]); nCount++; if (((assembly.FullName.IndexOf("Aspose.Pdf") == -1) && (nCount == 2)) || ((assembly.FullName.IndexOf("Aspose.Pdf") != -1) && (nCount == 6))) { isFound = true; break; } } } catch { throw new InvalidOperationException("MemoryPatching for \"" + assembly.FullName + "\" failed !"); } } } String[] aParts = assembly.FullName.Split(','); string fName = aParts[0]; if (fName.IndexOf("Aspose.BarCode.") != -1) fName = "Aspose.BarCode"; else if (fName.IndexOf("Aspose.3D") != -1) fName = "Aspose.ThreeD"; try { Type type2 = assembly.GetType(fName + ".License"); MethodInfo mi = type2.GetMethod("SetLicense", new Type[] { typeof(Stream) }); string LData = "PD94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0idXRmLTgiPz4KPExpY2Vuc2U+CiAgPERhdGE+CiAgICA8TGljZW5zZWRUbz5MaWNlbnNlZTwvTGljZW5zZWRUbz4KICAgIDxFbWFpbFRvPmxpY2Vuc2VlQGVtYWlsLmNvbTwvRW1haWxUbz4KICAgIDxMaWNlbnNlVHlwZT5EZXZlbG9wZXIgT0VNPC9MaWNlbnNlVHlwZT4KICAgIDxMaWNlbnNlTm90ZT5MaW1pdGVkIHRvIDEwMDAgZGV2ZWxvcGVyLCB1bmxpbWl0ZWQgcGh5c2ljYWwgbG9jYXRpb25zPC9MaWNlbnNlTm90ZT4KICAgIDxPcmRlcklEPjc4NDM3ODU3Nzg1PC9PcmRlcklEPgogICAgPFVzZXJJRD4xMTk3ODkyNDM3OTwvVXNlcklEPgogICAgPE9FTT5UaGlzIGlzIGEgcmVkaXN0cmlidXRhYmxlIGxpY2Vuc2U8L09FTT4KICAgIDxQcm9kdWN0cz4KICAgICAgPFByb2R1Y3Q+QXNwb3NlLlRvdGFsIFByb2R1Y3QgRmFtaWx5PC9Qcm9kdWN0PgogICAgPC9Qcm9kdWN0cz4KICAgIDxFZGl0aW9uVHlwZT5FbnRlcnByaXNlPC9FZGl0aW9uVHlwZT4KICAgIDxTZXJpYWxOdW1iZXI+e0YyQjk3MDQ1LTFCMjktNEIzRi1CRDUzLTYwMUVGRkExNUFBOX08L1NlcmlhbE51bWJlcj4KICAgIDxTdWJzY3JpcHRpb25FeHBpcnk+MjA5OTEyMzE8L1N1YnNjcmlwdGlvbkV4cGlyeT4KICAgIDxMaWNlbnNlVmVyc2lvbj4zLjA8L0xpY2Vuc2VWZXJzaW9uPgogIDwvRGF0YT4KICA8U2lnbmF0dXJlPlFYTndiM05sTGxSdmRHRnNJRkJ5YjJSMVkzUWdSbUZ0YVd4NTwvU2lnbmF0dXJlPgo8L0xpY2Vuc2U+"; Stream stream = new MemoryStream(Convert.FromBase64String(LData)); stream.Seek(0, SeekOrigin.Begin); mi.Invoke(Activator.CreateInstance(type2, null), new Stream[] { stream }); } catch { //throw new InvalidOperationException("SetLicense for \"" + assembly.FullName + "\" failed !"); } } private static DateTime InvokeMe1(XmlElement element, string name) { return DateTime.MaxValue; } private static XmlElement InvokeMe2(XmlElement element, string name) { if (element.LocalName == "License") { string License64 = "PERhdGE+PExpY2Vuc2VkVG8+R3JvdXBEb2NzPC9MaWNlbnNlZFRvPjxMaWNlbnNlVHlwZT5TaXRlIE9FTTwvTGljZW5zZVR5cGU+PExpY2Vuc2VOb3RlPkxpbWl0ZWQgdG8gMTAgZGV2ZWxvcGVyczwvTGljZW5zZU5vdGU+PE9yZGVySUQ+MTMwNzI0MDQwODQ5PC9PcmRlcklEPjxPRU0+VGhpcyBpcyBhIHJlZGlzdHJpYnV0YWJsZSBsaWNlbnNlPC9PRU0+PFByb2R1Y3RzPjxQcm9kdWN0PkFzcG9zZS5Ub3RhbDwvUHJvZHVjdD48L1Byb2R1Y3RzPjxFZGl0aW9uVHlwZT5FbnRlcnByaXNlPC9FZGl0aW9uVHlwZT48U2VyaWFsTnVtYmVyPjliNTc5NTAxLTUyNjEtNDIyMC04NjcwLWZjMmQ4Y2NkZDkwYzwvU2VyaWFsTnVtYmVyPjxTdWJzY3JpcHRpb25FeHBpcnk+MjAxNDA3MjQ8L1N1YnNjcmlwdGlvbkV4cGlyeT48TGljZW5zZVZlcnNpb24+Mi4yPC9MaWNlbnNlVmVyc2lvbj48L0RhdGE+PFNpZ25hdHVyZT5udFpocmRoL3I0QS81ZFpsU2dWYnhac0hYSFBxSjZ5UVVYa0RvaW4vS2lVZWhUUWZET0lQdHdzUlR2NmRTUVplOVdXekNnV3RGdkdROWpmR2QySmF4YUQvbkx1ZEk2R0VVajhqeVhUMG4vbWRrMEF1WVZNYlBXRjJYd3dSTnFlTmRrblYyQjhrZVFwbDJ2RzZVbnhxS2J6VVFxS2Rhc1pzZ2w1Q0xqSFVEWms9PC9TaWduYXR1cmU+"; element.InnerXml = new UTF8Encoding().GetString(Convert.FromBase64String(License64)); } if (element.LocalName == "BlackList") { string BlackList64 = "PERhdGE+PC9EYXRhPjxTaWduYXR1cmU+cUJwMEx1cEVoM1ZnOWJjeS8vbUVXUk9KRWZmczRlY25iTHQxYlNhanU2NjY5RHlad09FakJ1eEdBdVBxS1hyd0x5bmZ5VWplYUNGQ0QxSkh2RVUxVUl5eXJOTnBSMXc2NXJIOUFyUCtFbE1lVCtIQkZ4NFMzckFVMnd6dkxPZnhGeU9DQ0dGQ2UraTdiSHlGQk44WHp6R1UwdGRPMGR1RTFoRTQ5M1RNY3pRPTwvU2lnbmF0dXJlPg=="; element.InnerXml = new UTF8Encoding().GetString(Convert.FromBase64String(BlackList64)); } XmlNodeList elementsByTagName = element.GetElementsByTagName(name); if (elementsByTagName.Count <= 0) { return null; } return (XmlElement)elementsByTagName[0]; } private static unsafe void MemoryPatching(MethodBase miEvaluation, MethodBase miLicensed) { IntPtr IntPtrEval = GetMemoryAddress(miEvaluation); IntPtr IntPtrLicensed = GetMemoryAddress(miLicensed); if (IntPtr.Size == 8) *((long*)IntPtrEval.ToPointer()) = *((long*)IntPtrLicensed.ToPointer()); else *((int*)IntPtrEval.ToPointer()) = *((int*)IntPtrLicensed.ToPointer()); } private static unsafe IntPtr GetMemoryAddress(MethodBase mb) { RuntimeHelpers.PrepareMethod(mb.MethodHandle); if ((Environment.Version.Major >= 4) || ((Environment.Version.Major == 2) && (Environment.Version.MinorRevision >= 3053))) { return new IntPtr(((int*)mb.MethodHandle.Value.ToPointer() + 2)); } UInt64* location = (UInt64*)(mb.MethodHandle.Value.ToPointer()); int index = (int)(((*location) >> 32) & 0xFF); if (IntPtr.Size == 8) { ulong* classStart = (ulong*)mb.DeclaringType.TypeHandle.Value.ToPointer(); ulong* address = classStart + index + 10; return new IntPtr(address); } else { uint* classStart = (uint*)mb.DeclaringType.TypeHandle.Value.ToPointer(); uint* address = classStart + index + 10; return new IntPtr(address); } } } } //End
PictureConversion代碼:
using Aspose.Cells; using BSI_InsuranceProject_DBUtility.Error; using ESBasic; using System; using System.Collections.Generic; using System.Diagnostics; using System.Drawing; using System.Drawing.Imaging; using System.IO; using System.Linq; using System.Text; using System.Threading.Tasks; namespace BSI_InsuranceProject_DBUtility { /*************************************************************** FileName:文件轉圖片工具類(支持格式:pdf、ppt、word) Author:邵 Create Date:2018-5月15號 ******************************************************************/ public class PictureConversion { /// <summary> /// 將Word文檔轉換為圖片的方法 /// </summary> /// <param name="wordInputPath">Word文件路徑</param> /// <param name="imageOutputDirPath">圖片輸出路徑,如果為空,默認值為Word所在路徑</param> /// <param name="startPageNum">從PDF文檔的第幾頁開始轉換,如果為0,默認值為1</param> /// <param name="endPageNum">從PDF文檔的第幾頁開始停止轉換,如果為0,默認值為Word總頁數</param> /// <param name="imageFormat">設置所需圖片格式,如果為null,默認格式為PNG</param> /// <param name="resolution">設置圖片的像素,數字越大越清晰,如果為0,默認值為128,建議最大值不要超過1024</param> public string ConvertToImage_Words(string wordInputPath, string imageOutputDirPath, int startPageNum, int endPageNum, ImageFormat imageFormat, int resolution, string imgUrl) { try { Aspose.Words.Document doc = new Aspose.Words.Document(wordInputPath); if (doc == null) { throw new Exception("Word文件無效或者Word文件被加密!"); } if (imageOutputDirPath.Trim().Length == 0) { imageOutputDirPath = Path.GetDirectoryName(wordInputPath); } if (!Directory.Exists(imageOutputDirPath)) { Directory.CreateDirectory(imageOutputDirPath); } if (startPageNum <= 0) { startPageNum = 1; } if (endPageNum > doc.PageCount || endPageNum <= 0) { endPageNum = doc.PageCount; } if (startPageNum > endPageNum) { int tempPageNum = startPageNum; startPageNum = endPageNum; endPageNum = startPageNum; } if (imageFormat == null) { imageFormat = ImageFormat.Png; } if (resolution <= 0) { resolution = 128; } string imageName = Path.GetFileNameWithoutExtension(wordInputPath); Aspose.Words.Saving.ImageSaveOptions imageSaveOptions = new Aspose.Words.Saving.ImageSaveOptions(Aspose.Words.SaveFormat.Png); imageSaveOptions.Resolution = resolution; string imgName = string.Empty; for (int i = startPageNum; i <= endPageNum; i++) { MemoryStream stream = new MemoryStream(); imageSaveOptions.PageIndex = i - 1; string imgPath = Path.Combine(imageOutputDirPath, imageName) + "_" + i.ToString("000") + "." + imageFormat.ToString(); imgName += imgUrl + "/" + imageName + "_" + i.ToString("000") + "." + imageFormat.ToString() + "|"; doc.Save(stream, imageSaveOptions); System.Drawing.Image img = System.Drawing.Image.FromStream(stream); System.Drawing.Bitmap bm = ESBasic.Helpers.ImageHelper.Zoom(img, 0.6f); bm.Save(imgPath, imageFormat); img.Dispose(); stream.Dispose(); bm.Dispose(); System.Threading.Thread.Sleep(200); } if (!string.IsNullOrEmpty(imgName)) { imgName = imgName.Substring(0, imgName.Length - 1); } return imgName; } catch (Exception ex) { ErrorHandler.WriteError(ex); throw; } } /// <summary> /// 將PPT、Excel、Txt文檔轉換為圖片的方法 /// </summary> /// <param name="originFilePath">ppt文件路徑</param> /// <param name="imageOutputDirPath">圖片輸出路徑,如果為空,默認值為pdf所在路徑</param> /// <param name="startPageNum">從PDF文檔的第幾頁開始轉換,如果為0,默認值為1</param> /// <param name="endPageNum">從PDF文檔的第幾頁開始停止轉換,如果為0,默認值為pdf總頁數</param> /// <param name="resolution">設置圖片的像素,數字越大越清晰,如果為0,默認值為128,建議最大值不要超過1024</param> public string ConvertToImage_PPT(string originFilePath, string imageOutputDirPath, int startPageNum, int endPageNum, int resolution, string Format, string imgUrl) { try { //先將文件轉換為pdf臨時文件 string tmpPdfPath = originFilePath.Replace(Format, "pdf"); if (Format == ".xls" || Format == ".xlsx" || Format == ".txt") { Workbook wb = new Workbook(originFilePath); wb.Save(tmpPdfPath, SaveFormat.Pdf); } else { Aspose.Slides.Presentation doc = new Aspose.Slides.Presentation(originFilePath); if (doc == null) { throw new Exception("ppt文件無效或者ppt文件被加密!"); } if (imageOutputDirPath.Trim().Length == 0) { imageOutputDirPath = Path.GetDirectoryName(originFilePath); } if (!Directory.Exists(imageOutputDirPath)) { Directory.CreateDirectory(imageOutputDirPath); } if (startPageNum <= 0) { startPageNum = 1; } if (endPageNum > doc.Slides.Count || endPageNum <= 0) { endPageNum = doc.Slides.Count; } if (startPageNum > endPageNum) { int tempPageNum = startPageNum; startPageNum = endPageNum; endPageNum = startPageNum; } if (resolution <= 0) { resolution = 128; } if (doc != null) { doc.Save(tmpPdfPath, Aspose.Slides.Export.SaveFormat.Pdf); } } //再將pdf轉換為圖片 string imgName = ConvertToImage_PDF(tmpPdfPath, imageOutputDirPath, startPageNum, endPageNum, resolution, imgUrl); //刪除pdf臨時文件 File.Delete(tmpPdfPath); return imgName; } catch (Exception ex) { ErrorHandler.WriteError(ex); return "888"; throw; } } /// <summary> /// 將pdf文檔轉換為圖片的方法 /// </summary> /// <param name="originFilePath">pdf文件路徑</param> /// <param name="imageOutputDirPath">圖片輸出路徑,如果為空,默認值為pdf所在路徑</param> /// <param name="startPageNum">從PDF文檔的第幾頁開始轉換,如果為0,默認值為1</param> /// <param name="endPageNum">從PDF文檔的第幾頁開始停止轉換,如果為0,默認值為pdf總頁數</param> /// <param name="resolution">設置圖片的像素,數字越大越清晰,如果為0,默認值為128,建議最大值不要超過1024</param> public string ConvertToImage_PDF(string originFilePath, string imageOutputDirPath, int startPageNum, int endPageNum, int resolution, string imgUrl) { try { Aspose.Pdf.Document doc = new Aspose.Pdf.Document(originFilePath); if (doc == null) { throw new Exception("pdf文件無效或者pdf文件被加密!"); } if (imageOutputDirPath.Trim().Length == 0) { imageOutputDirPath = Path.GetDirectoryName(originFilePath); } if (!Directory.Exists(imageOutputDirPath)) { Directory.CreateDirectory(imageOutputDirPath); } if (startPageNum <= 0) { startPageNum = 1; } if (endPageNum > doc.Pages.Count || endPageNum <= 0) { endPageNum = doc.Pages.Count; } if (startPageNum > endPageNum) { int tempPageNum = startPageNum; startPageNum = endPageNum; endPageNum = startPageNum; } if (resolution <= 0) { resolution = 128; } string imageNamePrefix = Path.GetFileNameWithoutExtension(originFilePath); string imgName = string.Empty; for (int i = startPageNum; i <= endPageNum; i++) { MemoryStream stream = new MemoryStream(); string imgPath = Path.Combine(imageOutputDirPath, imageNamePrefix) + "_" + i.ToString("000") + ".jpg"; imgName += imgUrl + "/" + imageNamePrefix + "_" + i.ToString("000") + ".jpg|"; Aspose.Pdf.Devices.Resolution reso = new Aspose.Pdf.Devices.Resolution(resolution); Aspose.Pdf.Devices.JpegDevice jpegDevice = new Aspose.Pdf.Devices.JpegDevice(reso, 100); jpegDevice.Process(doc.Pages[i], stream); Image img = Image.FromStream(stream); Bitmap bm = ESBasic.Helpers.ImageHelper.Zoom(img, 0.6f); bm.Save(imgPath, ImageFormat.Jpeg); img.Dispose(); stream.Dispose(); bm.Dispose(); System.Threading.Thread.Sleep(200); } if (!string.IsNullOrEmpty(imgName)) { imgName = imgName.Substring(0, imgName.Length - 1); } return imgName; } catch (Exception ex) { ErrorHandler.WriteError(ex); throw; } } } }
到這里就可以完美轉換圖片了.....
