插入图.图像进入文字处理文档主体

本文关键字:文字处理 文档 主体 图像 插入 | 更新日期: 2023-09-27 18:10:11

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

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

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

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

说明一些问题:

我知道我可以使用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,博士

我有一张画。我想在我的wordprocessingDocument.Document.Body中插入一个特定字符串的图像,我更愿意这样做而不使用html img link to url。

更新:

bill的答案,这基本上是一个MSDN链接,展示了如何插入一个图像,这很好。然而它遗漏了一些部分,比如:

  1. 我如何将图像放置在某个位置,在这个例子中是我的[image]标签?(最重要的)

  2. 我宁愿不保存我的绘图。图像本地索引器使用'FileStream(fileName, FileMode.Open))'即有一种方法让我用我的绘画做到这一点。直接图像而不保存下来吗?(不重要,但希望如此)

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

插入图.图像进入文字处理文档主体

word文档只不过是一堆XML文件放在一起。取一个现有的.docx文件,将其重命名为.zip,并查看其中的内容。您将看到如何存储图像、主文档、样式定义以及各种其他好东西。要添加图像,您需要找到要添加图像的文档的"部分"。找到后,很容易将图像"part"添加到父元素"part"中。

以下是来自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));

addmagetobody看起来像这样:

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,您想要插入图像。

您考虑过使用图片内容控件而不是[IMAGE]文本吗?您可以将它定位在Word文件中的任何位置,给它一个"标记"来识别它,然后在代码中访问它的SdtContent并按照您的需要操作它。

您仍然需要使用:

将新的替换图像添加到Word文档中
MainDocumentPart mainPart = wordprocessingDocument.MainDocumentPart;
ImagePart imagePart = mainPart.AddImagePart(ImagePartType.Jpeg);
using (FileStream stream = new FileStream(fileName, FileMode.Open))
{
    imagePart.FeedData(stream);
}

就像比尔的回答一样,但你不需要经历创建绘图的麻烦。形象的形象。只是将现有的BlipEmbed属性替换为新添加的图像的id。