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<ConvertImageFile>();
        }

        public string FileName { get; set; }
        public byte[] FileData { get; set; }

        public List<ConvertImageFile> Files { get; set; }
    }


	public interface IAsposeConvert
	{
		bool ConvertToImage(string inFileName, Stream inStream, List<ConvertImageFile> list);
	}





	/*  
     * 
     * 将pdf、ppf、word转换给图片的组件有很多，这里仅使用Aspose组件（试用版）作为示例。
     * 
     * Aspose官网：www.aspose.com， 请支持和购买正版Aspose组件。
     * 
     */

	#region 图片转换器工厂 -> 将被注入到OMCS的多媒体管理器IMultimediaManager的ImageConverterFactory属性

	/// <summary>
	/// 图片转换器工厂。
	/// </summary>
	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<ConvertImageFile> list)
		{
			this.cancelled = false;
			return WordConvertToImage(inFileName, inStream, list, 0, 0, null, 200);
		}



		public bool WordConvertToImage(string inFileName, Stream inStream, List<ConvertImageFile> 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<ConvertImageFile> list)
		{
			this.cancelled = false;
			return ConvertToImage(inFileName, inStream, list, 0, 0, 200);
		}


		/// <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>
		private bool ConvertToImage(string inFileName, Stream inStream, List<ConvertImageFile> 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<ConvertImageFile> list)
		{
			return ConvertToImage(inFileName, inStream, list, 0, 0, 200);
		}


		private bool ConvertToImage(string inFileName, Stream inStream, List<ConvertImageFile> 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<ConvertImageFile> list)
		{
			return ConvertToImage(inFileName, inStream, list, 0, 0, 200);
		}


		private bool ConvertToImage(string inFileName, Stream inStream, List<ConvertImageFile> 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
}
