Вставка изображения в Word файл с помощью OpenXml C#
Всем привет! Я студент университета, и у меня возникла идея создать бота, который будет генерировать объяснительные записки в формате Word. Кроме основного текста в файле Word должна быть подпись самого студента. Однако у меня возникли проблемы: фотография не вставляется корректно в файл.
Вот, как должен выглядеть Word-файл (параметр разметки: обтекание текстом - перед текстом)
и вот, как он выглядит у меня (параметр разметки: В тексте)
Пожалуйста, помогите с кодом, и желательно объясните, как вы решаете эту проблему.
мой код
public static async Task Save(string filePath, string studentName, string date, string cause, string image)
{
using (WordprocessingDocument doc = WordprocessingDocument.Open(filePath, true))
{
MainDocumentPart mainPart = doc.MainDocumentPart;
Body body = mainPart.Document.Body;
string[] content1 = {
"Завідувачці кафедрою",
"Вікторії Жебці",
"Студента групи ТЦР-23",
$"{studentName}",
"\n"
};
string[] content2 = { "Пояснювальна записка", "\n" };
string[] content3 = { $"Доводжу до Вашого відома, що причина моєї відсутності {date}, {cause}. Обіцяю всі матеріали отримати і самостійно опрацювати." };
string[] content4 = { $"Дата {date} Підпис" };
// Добавляем каждый элемент content в новый параграф с указанием стиля
foreach (string line in content1)
{
AddContentToDocument(body, line, JustificationValues.Right, "Times New Roman", 14);
}
foreach (string line in content2)
{
AddContentToDocument(body, line, JustificationValues.Center, "Times New Roman", 14);
}
foreach (string line in content3)
{
AddContentToDocument(body, line, JustificationValues.Both, "Times New Roman", 14);
}
// Вставляем изображение в новый параграф
Paragraph imageParagraph = AddContentToDocument(body, content4[0], JustificationValues.Both, "Times New Roman", 14);
InsertImageAtBeginningOfParagraph(doc, image, imageParagraph);
doc.Save();
}
}
static Paragraph AddContentToDocument(Body body, string text, JustificationValues justification, string fontName, int fontSize)
{
Paragraph paragraph = new Paragraph();
// Устанавливаем выравнивание параграфа
ParagraphProperties paragraphProperties = new ParagraphProperties();
Justification justificationElement = new Justification() { Val = justification };
paragraphProperties.Append(justificationElement);
// Добавляем стиль шрифта
RunProperties runProperties = new RunProperties();
RunFonts runFonts = new RunFonts() { Ascii = fontName, HighAnsi = fontName };
FontSize fontSizeElement = new FontSize() { Val = (fontSize * 2).ToString() }; // Размер указывается в двухкратном значении
runProperties.Append(runFonts, fontSizeElement);
// Добавляем текст в параграф
Run run = new Run(runProperties, new Text(text));
paragraph.Append(paragraphProperties, run);
// Добавляем параграф в тело документа
body.Append(paragraph);
return paragraph;
}
static void InsertImageAtBeginningOfParagraph(WordprocessingDocument doc, string imagePath, Paragraph paragraph)
{
MainDocumentPart mainPart = doc.MainDocumentPart;
ImagePart imagePart = mainPart.AddImagePart(ImagePartType.Jpeg);
using (FileStream stream = new FileStream(imagePath, FileMode.Open))
{
imagePart.FeedData(stream);
}
AddImageToParagraph(doc, mainPart.GetIdOfPart(imagePart), paragraph);
}
static void AddImageToParagraph(WordprocessingDocument wordDoc, string relationshipId, Paragraph paragraph)
{
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 = null }))
)
{ Uri = "http://schemas.openxmlformats.org/drawingml/2006/picture" })
)
{
DistanceFromTop = (UInt32Value)0U,
DistanceFromBottom = (UInt32Value)0U,
DistanceFromLeft = (UInt32Value)0U,
DistanceFromRight = (UInt32Value)0U,
EditId = "50D07946"
});
paragraph.Append(new Run(element));
}