gpt4 book ai didi

c# - 将 Drawing.Image 插入 WordprocessingDocument 正文

转载 作者:行者123 更新时间:2023-11-30 22:05:22 25 4
gpt4 key购买 nike

我有一个代码是我用 System.IO 读取字节数组格式的 docx 文档。后来我制作了一个 docx 字节数组流,并使用 WordprocessingDocument 来编辑 docx 流。

我编辑/替换了 docx 流文本中使用硬括号和自定义插入文本的标签。

最后,我将编辑后的 ​​docx 流转换为一个新的字节数组,稍后我将其用于其他内容(例如使用字节数组创建 PDF),但之后发生的事情现在并不重要。

现在的问题是,就像我替换文本中的某些标签一样,我可以插入图片吗?最好使用 Drawing.Image,因为这就是我现在的图像格式。

明确几点:

我知道我可以使用 Drawing.Image.Save() 保存图像,然后使用 <img href="our image url that we just saved down.png"> 编辑 [IMAGE] 标签- 这是一个非常简单的解决方案。

但是。如果我可以避免保存不必要的文件并且不得不依赖链接(这不是图像消失时最稳定的),我更愿意

但为了减少追逐,这里是我目前使用的代码:

Image image = myImage;
byte[] byteArray = System.IO.File.ReadAllBytes(fullFileNamePath); //Get our docx document as Byte Array
byte[] byteArrayAfterReading;
using (MemoryStream stream = new MemoryStream())
{
stream.Write(byteArray, 0, (int)byteArray.Length); //Create a stream of the docx byte array document
using (WordprocessingDocument wordDoc = WordprocessingDocument.Open(stream, true))
{
Body body = wordDoc.MainDocumentPart.Document.Body;
foreach (var text in body.Descendants<Text>())
{
if (text.Text.Contains("[TEST]"))
{
text.Text = text.Text.Replace("[TEST]", "Test text here!");
}
if (text.Text.Contains("[IMAGE]"))
{
text.Text = text.Text.Replace("[IMAGE]", "Image here!");
//Here I should somehowly insert my Drawing.Image
//I could do this here but would prefer to not
//text.Text = text.Text.Replace("[IMAGE]", "<img href='imgurl.png'>");
}
}
}
byteArrayAfterReading = stream.ToArray();
}
//After here I do my convert byte array to PDF and save it

所有这一切都很好用。我只是想找出一种将我的图像插入其中的好方法。

tl;博士

我有一个 Drawing.Image,我想在某个字符串处插入到我的 wordprocessingDocument.Document.Body 中,我更愿意在不使用 html img 链接到 url 的情况下执行此操作。

要更新这个:

Bills answer,基本上是一个 MSDN 链接,显示了如何插入效果很好的图像。 但是它遗漏了一些部分,例如:

  1. 如何将图像放置在特定位置,在本例中是我的 [IMAGE] 标签? (最重要)

  2. 我宁愿不必在本地保存我的 Drawing.Image inode 来使用 'FileStream(fileName, FileMode.Open))'即有没有办法让我直接用我的 Drawing.Image 做这个而不先保存它? (不重要但更喜欢这个)

  3. 在 MSDN 示例中,我的图像分辨率和纵横比发生了变化,有什么原因吗? (现在不是那么重要,但将来可能会)

最佳答案

Word 文档只不过是一堆放在一起的 XML 文件。获取现有的 .docx 文件,将其重命名为 .zip,然后查看其中的内容。您将看到图像的存储方式、主要文档、定义的样式以及各种其他好东西。要添加图像,您需要找到要添加图像的文档的“部分”。一旦找到,就很容易将图像“部分”添加到父“部分”。

这是来自 MSDN 的快速操作方法: http://msdn.microsoft.com/en-us/library/office/bb497430(v=office.15).aspx

MainDocumentPart mainPart = wordprocessingDocument.MainDocumentPart;
ImagePart imagePart = mainPart.AddImagePart(ImagePartType.Jpeg);
using (FileStream stream = new FileStream(fileName, FileMode.Open))
{
imagePart.FeedData(stream);
}
AddImageToBody(wordprocessingDocument, mainPart.GetIdOfPart(imagePart));

AddImageToBody 看起来像这样:

private static void AddImageToBody(WordprocessingDocument wordDoc, string relationshipId)
{
// Define the reference of the image.
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 body, the element should be in a Run.
wordDoc.MainDocumentPart.Document.Body.AppendChild(new Paragraph(new Run(element)));
}

这里的关键部分是知道如何找到要插入图像的父“部分”的 ID。

关于c# - 将 Drawing.Image 插入 WordprocessingDocument 正文,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/24412091/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com