mh_sms/APT.Utility/FileToImg.cs
2024-04-12 16:50:28 +08:00

516 lines
12 KiB
C#
Raw Permalink Blame History

This file contains ambiguous Unicode characters

This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.

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
}