210 lines
6.5 KiB
C#
Raw Normal View History

using DocumentFormat.OpenXml.Drawing.Wordprocessing;
using DocumentFormat.OpenXml.Drawing;
using DocumentFormat.OpenXml;
using System;
using System.Collections.Generic;
using System.Linq;
using System.Runtime.CompilerServices;
using System.Text;
using System.Threading.Tasks;
using DocumentFormat.OpenXml.Packaging;
using DocumentFormat.OpenXml.Wordprocessing;
namespace MyCustomComponents.Helpers
{
public class ImageService
{
// Хранит документ Word
private Document _document = null;
// Хранит тело документа Word
private Body _body = null;
// Список байтовых массивов для изображений
private List<byte[]> _images = null;
// Свойство для получения или создания документа Word
private Document Document
{
get
{
if (_document == null)
{
_document = new Document();
}
return _document;
}
}
// Свойство для получения или создания тела документа Word
private Body Body
{
get
{
if (_body == null)
{
_body = Document.AppendChild(new Body());
}
return _body;
}
}
// Свойство для получения списка изображений
private List<byte[]> Images
{
get
{
// Если список изображений еще не создан, инициализируем его
if (_images == null)
{
_images = new List<byte[]>();
}
return _images;
}
}
public void CreateHeader(string header)
{
DocumentFormat.OpenXml.Wordprocessing.Paragraph paragraph = Body.AppendChild(new DocumentFormat.OpenXml.Wordprocessing.Paragraph());
DocumentFormat.OpenXml.Wordprocessing.Run run = paragraph.AppendChild(new DocumentFormat.OpenXml.Wordprocessing.Run());
run.AppendChild(new DocumentFormat.OpenXml.Wordprocessing.RunProperties(new Bold()));
run.AppendChild(new DocumentFormat.OpenXml.Wordprocessing.Text(header));
}
public void CreateImage(byte[] image)
{
if (image == null || image.Length == 0)
{
throw new ArgumentNullException("Картинка не загружена");
}
Images.Add(image);
}
public void SaveDoc(string filepath)
{
if (filepath.IsEmpty())
{
throw new ArgumentNullException("Имя файла не задано");
}
if (_document == null || _body == null)
{
throw new ArgumentNullException("Документ не сформирован, сохранять нечего");
}
using WordprocessingDocument wordprocessingDocument = WordprocessingDocument.Create(filepath, WordprocessingDocumentType.Document);
MainDocumentPart mainDocumentPart = wordprocessingDocument.AddMainDocumentPart();
mainDocumentPart.Document = Document;
if (_images != null)
{
int num = 0;
foreach (byte[] image in _images)
{
ImagePart imagePart = mainDocumentPart.AddImagePart(ImagePartType.Jpeg);
using (MemoryStream memoryStream = new MemoryStream(image))
{
memoryStream.Position = 0L;
imagePart.FeedData(memoryStream);
}
AddImageToBody(mainDocumentPart.GetIdOfPart(imagePart), ++num);
}
}
}
private void AddImageToBody(string relationshipId, int index)
{
OpenXmlElement[] array = new OpenXmlElement[1];
OpenXmlElement[] obj = new OpenXmlElement[5]
{
new Extent
{
Cx = (Int64Value)3000000L,
Cy = (Int64Value)3000000L
},
new EffectExtent
{
LeftEdge = (Int64Value)0L,
TopEdge = (Int64Value)0L,
RightEdge = (Int64Value)0L,
BottomEdge = (Int64Value)0L
},
null,
null,
null
};
DocProperties obj2 = new DocProperties
{
Id = (UInt32Value)1u
};
DefaultInterpolatedStringHandler defaultInterpolatedStringHandler = new DefaultInterpolatedStringHandler(8, 1);
defaultInterpolatedStringHandler.AppendLiteral("Picture ");
defaultInterpolatedStringHandler.AppendFormatted(index);
obj2.Name = (StringValue)defaultInterpolatedStringHandler.ToStringAndClear();
obj[2] = obj2;
obj[3] = new DocumentFormat.OpenXml.Drawing.Wordprocessing.NonVisualGraphicFrameDrawingProperties(new GraphicFrameLocks
{
NoChangeAspect = (BooleanValue)true
});
OpenXmlElement[] array2 = new OpenXmlElement[1];
OpenXmlElement[] array3 = new OpenXmlElement[1];
OpenXmlElement[] array4 = new OpenXmlElement[3];
OpenXmlElement[] array5 = new OpenXmlElement[2];
DocumentFormat.OpenXml.Drawing.Pictures.NonVisualDrawingProperties obj3 = new DocumentFormat.OpenXml.Drawing.Pictures.NonVisualDrawingProperties
{
Id = (UInt32Value)0u
};
defaultInterpolatedStringHandler = new DefaultInterpolatedStringHandler(16, 1);
defaultInterpolatedStringHandler.AppendLiteral("New Picture ");
defaultInterpolatedStringHandler.AppendFormatted(index);
defaultInterpolatedStringHandler.AppendLiteral(".jpg");
obj3.Name = (StringValue)defaultInterpolatedStringHandler.ToStringAndClear();
array5[0] = obj3;
array5[1] = new DocumentFormat.OpenXml.Drawing.Pictures.NonVisualPictureDrawingProperties();
array4[0] = new DocumentFormat.OpenXml.Drawing.Pictures.NonVisualPictureProperties(array5);
array4[1] = new DocumentFormat.OpenXml.Drawing.Pictures.BlipFill(new Blip(new BlipExtensionList(new BlipExtension
{
Uri = (StringValue)"{28A0092B-C50C-407E-A947-70E740481C1C}"
}))
{
Embed = (StringValue)relationshipId,
CompressionState = (EnumValue<BlipCompressionValues>)BlipCompressionValues.Print
}, new Stretch(new FillRectangle()));
array4[2] = new DocumentFormat.OpenXml.Drawing.Pictures.ShapeProperties(new Transform2D(new Offset
{
X = (Int64Value)0L,
Y = (Int64Value)0L
}, new Extents
{
Cx = (Int64Value)990000L,
Cy = (Int64Value)792000L
}), new PresetGeometry(new AdjustValueList())
{
Preset = (EnumValue<ShapeTypeValues>)ShapeTypeValues.Rectangle
});
array3[0] = new DocumentFormat.OpenXml.Drawing.Pictures.Picture(array4);
array2[0] = new GraphicData(array3)
{
Uri = (StringValue)"http://schemas.openxmlformats.org/drawingml/2006/picture"
};
obj[4] = new Graphic(array2);
array[0] = new Inline(obj)
{
DistanceFromTop = (UInt32Value)0u,
DistanceFromBottom = (UInt32Value)0u,
DistanceFromLeft = (UInt32Value)0u,
DistanceFromRight = (UInt32Value)0u,
EditId = (HexBinaryValue)"50D07946"
};
Drawing drawing = new Drawing(array);
Body.AppendChild(new DocumentFormat.OpenXml.Wordprocessing.Paragraph(new DocumentFormat.OpenXml.Wordprocessing.Run(drawing)));
}
}
}