152 lines
6.1 KiB
C#
152 lines
6.1 KiB
C#
|
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)));
|
|||
|
}
|
|||
|
}
|
|||
|
}
|