516 lines
12 KiB
C#
516 lines
12 KiB
C#
|
|
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
|
|||
|
|
}
|