using System; using System.Collections.Generic; using System.Drawing.Imaging; using System.IO; using System.Drawing; using Image = System.Drawing.Image; namespace APT.Utility { public class ConvertImageFile { public string FileName { get; set; } public string FileType { get; set; } public byte[] FileData { get; set; } } public class ConvertImageFileParam { public ConvertImageFileParam() { Files = new List(); } public string FileName { get; set; } public byte[] FileData { get; set; } public List Files { get; set; } } public interface IAsposeConvert { bool ConvertToImage(string inFileName, Stream inStream, List list); } /* * * 将pdf、ppf、word转换给图片的组件有很多,这里仅使用Aspose组件(试用版)作为示例。 * * Aspose官网:www.aspose.com, 请支持和购买正版Aspose组件。 * */ #region 图片转换器工厂 -> 将被注入到OMCS的多媒体管理器IMultimediaManager的ImageConverterFactory属性 /// /// 图片转换器工厂。 /// public class ImageConverterFactory { public IAsposeConvert CreateImageConverter(string fileName) { var pos = fileName.LastIndexOf("."); var extendName = fileName.Substring(pos); if (extendName == ".doc" || extendName == ".docx") { return new Word2ImageConverter(); } //小树增加xls文件类型上传20170329 if (extendName == ".xls" || extendName == ".xlsx") { return new Xls2ImageConverter(); } if (extendName == ".pdf") { return new Pdf2ImageConverter(); } if (extendName == ".ppt" || extendName == ".pptx") { return new Ppt2ImageConverter(); } return null; } public bool Support(string extendName) { //return extendName == ".doc" || extendName == ".docx" || extendName == ".pdf" || extendName == ".ppt" || // extendName == ".pptx" || extendName == ".xls" || extendName == ".xlsx"; return false; } } #endregion #region 将word文档转换为图片 public class Word2ImageConverter : IAsposeConvert { private bool cancelled = false; public void Cancel() { if (this.cancelled) { return; } this.cancelled = true; } public bool ConvertToImage(string inFileName, Stream inStream, List list) { this.cancelled = false; return WordConvertToImage(inFileName, inStream, list, 0, 0, null, 200); } public bool WordConvertToImage(string inFileName, Stream inStream, List list, int startPageNum, int endPageNum, ImageFormat imageFormat, int resolution) { try { //Aspose.Words.Document doc = new Aspose.Words.Document(inStream); //if (doc == null) //{ // return false; // //throw new Exception("Word文件无效或者Word文件被加密!"); //} //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(inFileName); //Aspose.Words.Saving.ImageSaveOptions imageSaveOptions = // new Aspose.Words.Saving.ImageSaveOptions(Aspose.Words.SaveFormat.Png); //imageSaveOptions.Resolution = resolution; //for (int i = startPageNum; i <= endPageNum; i++) //{ // if (this.cancelled) // { // break; // } // MemoryStream stream = new MemoryStream(); // imageSaveOptions.PageIndex = i - 1; // string imgFileName = imageName + "_" + i.ToString("000") + "." + imageFormat.ToString(); // doc.Save(stream, imageSaveOptions); // Image img = Image.FromStream(stream); // Bitmap bm = ImageHelper.Zoom(img, 0.6f); // MemoryStream imgStream = new MemoryStream(); // bm.Save(imgStream, imageFormat); // imgStream.Position = 0;//重置为开始位置 // byte[] bytes = new byte[imgStream.Length]; // imgStream.Read(bytes, 0, bytes.Length); // ConvertImageFile tmpFile = new ConvertImageFile(); // tmpFile.FileName = imgFileName; // tmpFile.FileType = "image/" + imageFormat.ToString().ToLower(); // tmpFile.FileData = bytes; // list.Add(tmpFile); // img.Dispose(); // stream.Dispose(); // bm.Dispose(); // imgStream.Dispose(); // System.Threading.Thread.Sleep(200); //} //if (this.cancelled) //{ // return false; //} return true; } catch (Exception ex) { throw new Exception("Word转换失败,详情:" + ex.ToString()); } } } #endregion #region 将pdf文档转换为图片 public class Pdf2ImageConverter : IAsposeConvert { private bool cancelled = false; public void Cancel() { if (this.cancelled) { return; } this.cancelled = true; } public bool ConvertToImage(string inFileName, Stream inStream, List list) { this.cancelled = false; return ConvertToImage(inFileName, inStream, list, 0, 0, 200); } /// /// 将pdf文档转换为图片的方法 /// /// pdf文件路径 /// 图片输出路径,如果为空,默认值为pdf所在路径 /// 从PDF文档的第几页开始转换,如果为0,默认值为1 /// 从PDF文档的第几页开始停止转换,如果为0,默认值为pdf总页数 /// 设置图片的像素,数字越大越清晰,如果为0,默认值为128,建议最大值不要超过1024 private bool ConvertToImage(string inFileName, Stream inStream, List list, int startPageNum, int endPageNum, int resolution) { try { //Aspose.Pdf.Document doc = new Aspose.Pdf.Document(inStream); //if (doc == null) //{ // return false; // //throw new Exception("pdf文件无效或者pdf文件被加密!"); //} //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 imageName = Path.GetFileNameWithoutExtension(inFileName); //for (int i = startPageNum; i <= endPageNum; i++) //{ // if (this.cancelled) // { // break; // } // MemoryStream stream = new MemoryStream(); // string imgFileName = imageName + "_" + 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 = ImageHelper.Zoom(img, 0.6f); // MemoryStream imgStream = new MemoryStream(); // bm.Save(imgStream, ImageFormat.Jpeg); // imgStream.Position = 0;//重置为开始位置 // byte[] bytes = new byte[imgStream.Length]; // imgStream.Read(bytes, 0, bytes.Length); // ConvertImageFile tmpFile = new ConvertImageFile(); // tmpFile.FileName = imgFileName; // tmpFile.FileType = "image/" + ImageFormat.Jpeg.ToString().ToLower(); // tmpFile.FileData = bytes; // list.Add(tmpFile); // img.Dispose(); // stream.Dispose(); // bm.Dispose(); // imgStream.Dispose(); // System.Threading.Thread.Sleep(200); //} //if (this.cancelled) //{ // return false; //} } catch (Exception ex) { throw new Exception("PDF转换失败,详情:" + ex.ToString()); } return true; } } #endregion #region 将ppt文档转换为图片 public class Ppt2ImageConverter : IAsposeConvert { private Pdf2ImageConverter pdf2ImageConverter; public void Cancel() { if (this.pdf2ImageConverter != null) { this.pdf2ImageConverter.Cancel(); } } public bool ConvertToImage(string inFileName, Stream inStream, List list) { return ConvertToImage(inFileName, inStream, list, 0, 0, 200); } private bool ConvertToImage(string inFileName, Stream inStream, List list, int startPageNum, int endPageNum, int resolution) { try { //Aspose.Slides.Presentation doc = new Aspose.Slides.Presentation(inStream); //if (doc == null) //{ // return false; // //throw new Exception("ppt文件无效或者ppt文件被加密!"); //} //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; //} //string imageName = Path.GetFileNameWithoutExtension(inFileName); ////先将ppt转换为pdf临时文件 //MemoryStream pdfStream = new MemoryStream(); //doc.Save(pdfStream, Aspose.Slides.Export.SaveFormat.Pdf); ////再将pdf转换为图片 //var converter = new Pdf2ImageConverter(); //converter.ConvertToImage(imageName + ".pdf", pdfStream, list); } catch (Exception ex) { throw new Exception("PPT转换失败,详情:" + ex.ToString()); } this.pdf2ImageConverter = null; return true; } private void converter_ProgressChanged(int done, int total) { } private void converter_ConvertSucceed() { } private void converter_ConvertFailed(string msg) { } } #endregion //小树增加Excel文档格式 #region 将Excel文档转换为图片 public class Xls2ImageConverter : IAsposeConvert { private Pdf2ImageConverter pdf2ImageConverter; public void Cancel() { if (this.pdf2ImageConverter != null) { this.pdf2ImageConverter.Cancel(); } } public bool ConvertToImage(string inFileName, Stream inStream, List list) { return ConvertToImage(inFileName, inStream, list, 0, 0, 200); } private bool ConvertToImage(string inFileName, Stream inStream, List list, int startPageNum, int endPageNum, int resolution) { try { //Workbook wb = new Workbook(inStream); //if (wb == null) return false; //MemoryStream pdfStream = new MemoryStream(); //wb.Save(pdfStream, Aspose.Cells.SaveFormat.Pdf); ////先将excel转换为pdf临时文件 //string imageName = Path.GetFileNameWithoutExtension(inFileName); ////再将pdf转换为图片 //var converter = new Pdf2ImageConverter(); //converter.ConvertToImage(imageName + ".pdf", pdfStream, list); } catch (Exception ex) { throw new Exception("Excel转换失败,详情:" + ex.ToString()); } this.pdf2ImageConverter = null; return true; } private void converter_ProgressChanged(int done, int total) { } private void converter_ConvertSucceed() { } private void converter_ConvertFailed(string msg) { } } #endregion #region public static class ImageHelper { public static Bitmap Zoom(Image origin, float zoomCoef) { //IL_0015: Unknown result type (might be due to invalid IL or missing references) //IL_001a: Expected O, but got Unknown //IL_001c: Unknown result type (might be due to invalid IL or missing references) //IL_0021: Expected O, but got Unknown //IL_0033: Unknown result type (might be due to invalid IL or missing references) Bitmap val = new Bitmap((int)((float)origin.Width * zoomCoef), (int)((float)origin.Height * zoomCoef)); Graphics val2 = Graphics.FromImage(val); try { val2.DrawImage(origin, new Rectangle(0, 0, val.Width, val.Height)); } finally { ((IDisposable)val2)?.Dispose(); } return val; } } #endregion }