[英]OpenXML insert image as Link to File to word document
如何添加链接和如何添加图像之间的唯一区别在于关系的构造。 图像的显示部分相同。 为了添加图像关系,您将需要以下内容:
//This isn't necessery if you know the Part Type (e.g. MainDocumentPart.AddImagePart())
private static ImagePart CreateImagePart(OpenXmlPart container, string contentType)
{
var method = container.GetType().GetMethod("AddImagePart", new Type[] { typeof(string) });
if (method == null)
throw new Exception("Can't add an image to type: " + container.GetType().Name);
return (ImagePart)method.Invoke(container, new object[] { contentType });
}
private static string AddImageToDocument(OpenXmlPart part, string imageSource, string contentType, bool addAsLink)
{
if (addAsLink)
{
ImagePart imagePart = CreateImagePart(part, contentType);
string id = part.GetIdOfPart(imagePart);
part.DeletePart(imagePart);
part.AddExternalRelationship(imagePart.RelationshipType, new Uri(imageSource, UriKind.Absolute), id);
return id;
}
else
{
ImagePart imagePart = CreateImagePart(part, contentType);
using (Stream imageStream = File.Open(imageSource, FileMode.Open))
{
imagePart.FeedData(imageStream);
}
return part.GetIdOfPart(imagePart);
}
}
将图像添加到文档中后,可以使用参考显示图像
就像是...
private static OpenXmlElement CreateImageContainer(OpenXmlPart part, string relationshipId, string imageName, int widthPixels, int heightPixels)
{
long widthEMU = (widthPixels * 914400L) / 96L;
long heightEMU = (heightPixels * 914400L) / 96L;
var element =
new Paragraph(
new Run(
new RunProperties(
new NoProof()),
new Drawing(
new wp.Inline(
new wp.Extent() { Cx = widthEMU, Cy = heightEMU },
new wp.DocProperties() { Id = (UInt32Value)1U, Name = "Picture 0", Description = imageName },
new wp.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 = imageName },
new pic.NonVisualPictureDrawingProperties()),
new pic.BlipFill(
new a.Blip() { Embed = relationshipId },
new a.Stretch(
new a.FillRectangle())),
new pic.ShapeProperties(
new a.Transform2D(
new a.Offset() { X = 0L, Y = 0L },
new a.Extents() { Cx = widthEMU, Cy = heightEMU }),
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 }))
);
return element;
}
请注意,我在网上找到的最后一部分(CreateImageContainer)进行了调整/重命名/重构以用于我的示例,其中包含一个问题,即DocProperties ID和Name以及NonVisualDrawingProperties Id在整个部分中必须是唯一的。 (您不能以当前形式两次调用此方法)
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.