using System; using System.Collections.Generic; using System.ComponentModel; using System.Diagnostics; using System.Linq; using System.Text; using System.Threading.Tasks; using DocumentFormat.OpenXml; using DocumentFormat.OpenXml.Drawing; using DocumentFormat.OpenXml.Packaging; using DocumentFormat.OpenXml.Wordprocessing; using A = DocumentFormat.OpenXml.Drawing; using DW = DocumentFormat.OpenXml.Drawing.Wordprocessing; using PIC = DocumentFormat.OpenXml.Drawing.Pictures; using Paragraph = DocumentFormat.OpenXml.Wordprocessing.Paragraph; using Text = DocumentFormat.OpenXml.Wordprocessing.Text; using Run = DocumentFormat.OpenXml.Wordprocessing.Run; using WinFormsLibrary.SupportClasses; namespace WinFormsLibrary { public partial class DocumentWithImage : Component { private WordprocessingDocument? _wordDocument; private Body? _docBody; public DocumentWithImage() { InitializeComponent(); } public DocumentWithImage(IContainer container) { container.Add(this); InitializeComponent(); } public void CreateDocument(ImageClass imageClass) { // Проверка наличия данных if (string.IsNullOrEmpty(imageClass.Path) || string.IsNullOrEmpty(imageClass.Title) || imageClass.Files.Count == 0) { throw new Exception("Не все данные заполнены"); } // Создаем Word-документ using (WordprocessingDocument wordDocument = WordprocessingDocument.Create(imageClass.Path, WordprocessingDocumentType.Document)) { MainDocumentPart mainPart = wordDocument.AddMainDocumentPart(); mainPart.Document = new Document(); Body body = new Body(); // Добавляем заголовок Paragraph titleParagraph = new Paragraph(new Run(new Text(imageClass.Title))); body.Append(titleParagraph); // Добавляем изображения foreach (string imagePath in imageClass.Files) { if (File.Exists(imagePath)) { ImagePart imagePart = mainPart.AddImagePart(ImagePartType.Jpeg); using (FileStream stream = new FileStream(imagePath, FileMode.Open)) { imagePart.FeedData(stream); } AddImageToBody(wordDocument, mainPart.GetIdOfPart(imagePart)); } else { Console.WriteLine($"Изображение '{imagePath}' не найдено."); } } mainPart.Document.Append(body); Console.WriteLine($"Word-документ успешно создан в файле '{imageClass.Path}'."); } } private void AddImageToBody(WordprocessingDocument wordDoc, string relationshipId) { var element = new Drawing( new DW.Inline( new DW.Extent() { Cx = 990000L, Cy = 792000L }, new DW.EffectExtent() { LeftEdge = 0L, TopEdge = 0L, RightEdge = 0L, BottomEdge = 0L }, new DW.DocProperties() { Id = (UInt32Value)1U, Name = "Picture 1" }, new DW.NonVisualGraphicFrameDrawingProperties( new A.GraphicFrameLocks() { NoChangeAspect = true }), new A.Graphic( new A.GraphicData( new PIC.Picture( new PIC.NonVisualPictureProperties( new PIC.NonVisualDrawingProperties() { Id = (UInt32Value)0U, Name = "New Bitmap Image.jpg" }, new PIC.NonVisualPictureDrawingProperties()), new PIC.BlipFill( new A.Blip( new A.BlipExtensionList( new A.BlipExtension() { Uri = "{28A0092B-C50C-407E-A947-70E740481C1C}" }) ) { Embed = relationshipId, CompressionState = A.BlipCompressionValues.Print }, new A.Stretch( new A.FillRectangle())), new PIC.ShapeProperties( new A.Transform2D( new A.Offset() { X = 0L, Y = 0L }, new A.Extents() { Cx = 990000L, Cy = 792000L }), new A.PresetGeometry( new A.AdjustValueList() ) { Preset = A.ShapeTypeValues.Rectangle })) ) { Uri = "http://schemas.openxmlformats.org/drawingml/2006/picture" }) ) { DistanceFromTop = (UInt32Value)0U, DistanceFromBottom = (UInt32Value)0U, DistanceFromLeft = (UInt32Value)0U, DistanceFromRight = (UInt32Value)0U, EditId = "50D07946" }); // Append the reference to the body. The element should be in // a DocumentFormat.OpenXml.Wordprocessing.Run. wordDoc.MainDocumentPart.Document.Body.AppendChild(new Paragraph(new Run(element))); } } }