OpenXMLSDk:插入图像损坏文档

时间:2013-12-04 11:13:42

标签: asp.net vb.net image openxml openxml-sdk

我需要在不同的页面中插入图像。所有图像都是不同的,它将被插入到不同的位置,如表格单元格。

我在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

2 个答案:

答案 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);

希望这有帮助!