插入图.图像进入文字处理文档主体
本文关键字:文字处理 文档 主体 图像 插入 | 更新日期: 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链接,展示了如何插入一个图像,这很好。然而它遗漏了一些部分,比如:
我如何将图像放置在某个位置,在这个例子中是我的[image]标签?(最重要的)
我宁愿不保存我的绘图。图像本地索引器使用
'FileStream(fileName, FileMode.Open))'
即有一种方法让我用我的绘画做到这一点。直接图像而不保存下来吗?(不重要,但希望如此)以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);
}
就像比尔的回答一样,但你不需要经历创建绘图的麻烦。形象的形象。只是将现有的Blip
的Embed
属性替换为新添加的图像的id。