이미지를 만드는 동안 OPEN XML에 문제가 있습니다.Word Open XML : 3 개 이상의 이미지가 삽입되면 파일이 손상됩니다.
문서의 일부 텍스트를 일부 이미지로 바꿉니다. 1 ~ 3 개의 이미지를 바꾸면 저장된 파일이 완벽합니다. 이미지가 표시되고 모든 것이 잘 보입니다.
3 개 이상의 이미지를 바꾸면 파일 결과가 손상되고 Microsoft Word 복구 후에도 완벽합니다.
이미지를 이동하고 순서를 변경하고 이미지를 변경하려고했으나 3 개의 삽입 된 이미지를 검토 할 때 의사가 깨진 것 같습니다. 여기
이 방법은 내가 전화한다 :
private static void ReplaceTextWithImage(string find, string filepath, Bitmap bitmap, int incremental)
{
using (WordprocessingDocument doc = WordprocessingDocument.Open(filepath, true))
{
MainDocumentPart mainPart = doc.MainDocumentPart;
ImagePart imagePart = mainPart.AddImagePart(ImagePartType.Jpeg);
using (var ms = new MemoryStream())
{
bitmap.Save(ms, System.Drawing.Imaging.ImageFormat.Jpeg);
ms.Position = 0;
imagePart.FeedData(ms);
}
var relID = mainPart.GetIdOfPart(imagePart);
var element =
new Drawing(
new DW.Inline(
new DW.Extent() { Cx = 990000L * (long)(7.13/1.08), Cy = 792000L * (long)(8.51/0.87) },
new DW.EffectExtent()
{
LeftEdge = 0L,
TopEdge = 0L,
RightEdge = 0L,
BottomEdge = 0L
},
new DW.DocProperties()
{
Id = (UInt32Value)1U,
Name = "img" + incremental
},
new DW.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 = "img" + incremental + ".jpg"
},
new PIC.NonVisualPictureDrawingProperties()),
new PIC.BlipFill(
new A.Blip(
new A.BlipExtensionList(
new A.BlipExtension()
{
Uri = Guid.NewGuid().ToString()
})
)
{
Embed = relID,
CompressionState = A.BlipCompressionValues.Print
},
new A.Stretch(new A.FillRectangle())),
new PIC.ShapeProperties(
new A.Transform2D(
new A.Offset() { X = 0L, Y = 0L },
new A.Extents() { Cx = 990000L * (long)(7.13/1.08), Cy = 792000L * (long)(8.51/0.87) }),
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"
});
var paragraphs = doc.MainDocumentPart.Document.Body.ChildElements.First(x => x.OuterXml.Contains(find));
doc.MainDocumentPart.Document.Body.InsertAfter(new Paragraph(new Run(element)), paragraphs);
doc.MainDocumentPart.Document.Body.RemoveChild(paragraphs);
doc.Close();
}
}
당신이 매우 tipical 방법입니다 볼 수 있듯이, 이미 일부 ID 등 만 성공하지 않고 변경을 시도!