OpenXML случайное добавление изображений в документ Word приводит к повреждению файла

#c# #openxml #office-interop #word

#c# #openxml #office-interop #word

Вопрос:

После добавления одного или нескольких изображений в документ Word я пытаюсь открыть его с помощью Word Interop. Случайным образом документ поврежден и выдает COMException «файл может быть поврежден».

Пытаясь определить причину этого повреждения, я использовал один и тот же документ, изображения … снова и снова. При запуске моего приложения вероятность того, что оно откроется без проблем, составляет около 70%. Затем он будет продолжать восстанавливаться и открываться просто отлично, до одной случайной точки после нескольких попыток, когда я получу это COMException. После этого он будет продолжать выдавать это исключение, пока я не перезапущу приложение.

Поврежденный документ и тот, который открывается, не показывают различий в сгенерированном XML, кроме идентификаторов, которые генерируются для изображений.

  • Цель .NET: .NET Framework 4.6.1
  • DocumentFormat.Версия OpenXML: 2.11.3

Код для добавления изображения:

         var element = new Drawing
        (
            new DW.Anchor
            (
                simPos,
                horPos,
                verPos,
                new DW.Extent() { Cx = dimensions.ImageWidth, Cy = dimensions.ImageHeight },
                new DW.EffectExtent() { LeftEdge = 0L, TopEdge = 0L, RightEdge = 0L, BottomEdge = 0L },
                wrapper,
                new DW.DocProperties() { Id = (X.UInt32Value)ticks, Name = $"Picture {ticks}" },
                new DW.NonVisualGraphicFrameDrawingProperties(new A.GraphicFrameLocks() { NoChangeAspect = true }),
                new A.Graphic
                (
                    new A.GraphicData
                    (
                        new PIC.Picture
                        (
                            new PIC.NonVisualPictureProperties
                            (
                                new PIC.NonVisualDrawingProperties() { Id = (X.UInt32Value)ticks, Name = $"New Bitmap Image {ticks}.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.None,
                                },
                                new A.Stretch(new A.FillRectangle())
                            ),
                            new PIC.ShapeProperties
                            (
                                new A.Transform2D
                                (
                                    new A.Offset() { X = 0L, Y = 0L },
                                    new A.Extents() { Cx = dimensions.ImageWidth, Cy = dimensions.ImageHeight }
                                ),
                                new A.PresetGeometry(new A.AdjustValueList()) { Preset = A.ShapeTypeValues.Rectangle }
                            )
                        )
                    )
                    { Uri = "http://schemas.openxmlformats.org/drawingml/2006/picture" }
                )
            )
            {
                SimplePos = X.BooleanValue.FromBoolean(false),
                BehindDoc = X.BooleanValue.FromBoolean(true),
                LayoutInCell = X.BooleanValue.FromBoolean(true),
                AllowOverlap = X.BooleanValue.FromBoolean(true),
                Locked = X.BooleanValue.FromBoolean(false),
                RelativeHeight = 500U,
                DistanceFromBottom = 0U,
                DistanceFromLeft = 114300U,
                DistanceFromRight = 114300U,
                DistanceFromTop = 0U
            }
        );
  

Сгенерированный XML для изображения выглядит следующим образом:

 <w:drawing xmlns:w="http://schemas.openxmlformats.org/wordprocessingml/2006/main">
  <wp:anchor distT="0" distB="0" distL="114300" distR="114300" simplePos="0" relativeHeight="500" behindDoc="1" locked="0" layoutInCell="1" allowOverlap="1" xmlns:wp="http://schemas.openxmlformats.org/drawingml/2006/wordprocessingDrawing">
    <wp:simplePos x="0" y="0" />
    <wp:positionH relativeFrom="character">
      <wp:posOffset>0</wp:posOffset>
    </wp:positionH>
    <wp:positionV relativeFrom="line">
      <wp:posOffset>0</wp:posOffset>
    </wp:positionV>
    <wp:extent cx="2331720" cy="2935224" />
    <wp:effectExtent l="0" t="0" r="0" b="0" />
    <wp:wrapNone />
    <wp:docPr id="1747262326" name="Picture 637338535332223862" />
    <wp:cNvGraphicFramePr>
      <a:graphicFrameLocks xmlns:a="http://schemas.openxmlformats.org/drawingml/2006/main" noChangeAspect="1" />
    </wp:cNvGraphicFramePr>
    <a:graphic xmlns:a="http://schemas.openxmlformats.org/drawingml/2006/main">
      <a:graphicData uri="http://schemas.openxmlformats.org/drawingml/2006/picture">
        <pic:pic xmlns:pic="http://schemas.openxmlformats.org/drawingml/2006/picture">
          <pic:nvPicPr>
            <pic:cNvPr id="1747262326" name="New Bitmap Image 637338535332223862.jpg" />
            <pic:cNvPicPr />
          </pic:nvPicPr>
          <pic:blipFill>
            <a:blip r:embed="ID_465174ea-d95b-48b5-b6a8-451afacf449b" cstate="none" xmlns:r="http://schemas.openxmlformats.org/officeDocument/2006/relationships">
              <a:extLst>
                <a:ext uri="{28A0092B-C50C-407E-A947-70E740481C1C}" />
              </a:extLst>
            </a:blip>
            <a:stretch>
              <a:fillRect />
            </a:stretch>
          </pic:blipFill>
          <pic:spPr>
            <a:xfrm>
              <a:off x="0" y="0" />
              <a:ext cx="2331720" cy="2935224" />
            </a:xfrm>
            <a:prstGeom prst="rect">
              <a:avLst />
            </a:prstGeom>
          </pic:spPr>
        </pic:pic>
      </a:graphicData>
    </a:graphic>
  </wp:anchor>
</w:drawing>  

Если файл откроется 5 раз, я бы подумал, что в 6-й раз тоже не будет проблем, верно? Я совершенно не понимаю, почему это может привести к случайному повреждению файлов.

Комментарии:

1. Запустите эти тесты с временно отключенным установленным антивирусным продуктом.

2. При отключенном антивирусе и брандмауэре -> все запуски немедленно завершаются неудачей При отключенном антивирусе и включенном брандмауэре -> сбоя не получено, оба снова включены -> после 6 запусков начался сбой