#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 запусков начался сбой