我需要在不同的页面中插入图像。所有图像都是不同的,它将被插入到不同的位置,如表格单元格。
我在MSDN链接中尝试过该示例 - http://msdn.microsoft.com/en-us/library/office/bb497430.aspx
但是插入文档后会被破坏。使用相同的代码插入一个图像工作,但我尝试插入另一个图像文档正在被破坏。 RelationshipID传递不同于addImagePart创建新的relationshipID。
我尝试在Open XMl SDk 2.5 Productivity Tool中打开恢复的docuemnt和损坏的文档,我可以看到图像存储在损坏的文档中的 / media / 文件夹中,并且 / word /已恢复的文档中的media / 。这是否会成为腐败的原因? http://tinypic.com/r/r1fozp/5 请求帮我解决这个问题,因为我已经坚持了一段时间
我正在使用操作系统:Windows 8,OpenXMLSDK 2.5和Office 2013
的问候,
Swaroop
答案 0 :(得分:1)
确保调用WordprocessingDocument.Close(),否则不会添加关系。在MSDN示例中,他们忽略了指出这一点。
答案 1 :(得分:1)
好的,所以这是一个非常古老的问题,但今天我一直在用它撕掉我的头发,所以想给将来搜索的人发一个答案。
如果您尝试插入多个图像,则文档中的重复ID会导致损坏的文档错误。请注意以下几行:
new DW.DocProperties()
{
Id = (UInt32Value)1U,
Name = "Picture 1"
}
和
new PIC.NonVisualDrawingProperties()
{
Id = (UInt32Value)0U,
Name = "New Bitmap Image.jpg"
}
如果您已经使用MSDN示例中的“原样”代码,则会将多个元素添加到具有相同ID的文档中,从而导致损坏文档的XML验证错误。我的解决方案是每次增加ID。
我基于抽象的示例here创建了一个小图像助手类,它在构造时获取图像起始ID,然后在每次调用时递增值,如下所示:
using DocumentFormat.OpenXml;
using DocumentFormat.OpenXml.Wordprocessing;
using A = DocumentFormat.OpenXml.Drawing;
using DW = DocumentFormat.OpenXml.Drawing.Wordprocessing;
namespace DOCXExporter
{
class ImageHelper
{
private UInt32Value _docPropImageId;
public ImageHelper(UInt32Value startImageId)
{
_docPropImageId = startImageId;
}
public Drawing GetImageElement(
string imagePartId,
string fileName,
string pictureName,
double width,
double height)
{
// Increment ID values
_docPropImageId += 1;
double englishMetricUnitsPerInch = 914400;
double pixelsPerInch = 96;
//calculate size in emu
double emuWidth = width * englishMetricUnitsPerInch / pixelsPerInch;
double emuHeight = height * englishMetricUnitsPerInch / pixelsPerInch;
var element = new Drawing(
new DW.Inline(
new DW.Extent { Cx = (Int64Value)emuWidth, Cy = (Int64Value)emuHeight },
new DW.EffectExtent { LeftEdge = 0L, TopEdge = 0L, RightEdge = 0L, BottomEdge = 0L },
new DW.DocProperties { Id = _docPropImageId, Name = pictureName },
new DW.NonVisualGraphicFrameDrawingProperties(
new A.GraphicFrameLocks { NoChangeAspect = true }),
new A.Graphic(
new A.GraphicData(
new A.Pictures.Picture(
new A.Pictures.NonVisualPictureProperties(
new A.Pictures.NonVisualDrawingProperties { Id = (_docPropImageId + 1), Name = fileName },
new A.Pictures.NonVisualPictureDrawingProperties()),
new A.Pictures.BlipFill(
new A.Blip(
new A.BlipExtensionList(
new A.BlipExtension { Uri = "{28A0092B-C50C-407E-A947-70E740481C1C}" }))
{
Embed = imagePartId,
CompressionState = A.BlipCompressionValues.Print
},
new A.Stretch(new A.FillRectangle())),
new A.Pictures.ShapeProperties(
new A.Transform2D(
new A.Offset { X = 0L, Y = 0L },
new A.Extents { Cx = (Int64Value)emuWidth, Cy = (Int64Value)emuHeight }),
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"
});
return element;
}
}
}
在向文档添加任何图像之前,使用种子ID实例化该类:
var imageHelper = new ImageHelper(1U);
然后在向桌子添加图片时使用:
var mainPart = wordDocument.MainDocumentPart;
var imagePart = mainPart.AddImagePart(ImagePartType.Jpeg);
using (var mediaStream = new FileStream(imageFilename, FileMode.Open))
{
imagePart.FeedData(mediaStream);
}
var imageElement = imageHelper.GetImageElement(
mainPart.GetIdOfPart(imagePart),
imageFilename,
Guid.NewGuid().ToString(),
260, 208);
var imgPara = new Paragraph(new Run(imageElement));
cell.Append(imgPara);
希望这有帮助!