2014-12-08 17 views
0

이미지를 만드는 동안 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 등 만 성공하지 않고 변경을 시도!

답변

1

OpenXml SDK 2.0 productivity tool을 사용하여 오류가있는 문서를 열어보고 document.xml 파일에서 오류를 찾을 수 있는지 확인하십시오.

또한 텍스트가 정적 인 경우 콘텐츠 컨트롤을 추가 한 다음 동적으로 바꾸는 것에 대해 생각해 볼 수 있습니다.

1

이것은 오래된 스레드 일지 모르지만 나는 오늘이 문제에 직면했던 것처럼이 질문에 답할 것이라고 생각했습니다. 이미지에 XML 문서에 포함 된 모든 항목에 고유 한 ID를 부여해야합니다.

2010 년보다

이 작업을 수행으로
new DW.DocProperties() 
         { 
          Id = (UInt32Value)1U, // THIS NEEDS TO BE A UNIQUE VALUE 
          Name = "img" + incremental 
         }, 

...

new PIC.NonVisualDrawingProperties() 
{ 
     Id = (UInt32Value)0U, // UNIQUE VALUE HERE AS WELL 

또한 EditId 단어에서 지원되지 않습니다 앞에서 나는 코드는 MSDN에서 눈치, 그들의 물건 평소와 같이 아주 작은 설명과 함께 쓰레기입니다.

또한 나는 다른 근본적인 문제를 확인하는 유효성 검사 도구를 사용하는 것이 좋습니다 ... 코드에서

스틱이 당신의 문서에 대해 그것을 실행됩니다.

using DocumentFormat.OpenXml.Validation; 
using System.Diagnostics; 


public static bool IsDocumentValid(WordprocessingDocument mydoc) 
     { 
      OpenXmlValidator validator = new OpenXmlValidator(); 
      var errors = validator.Validate(mydoc); 
      Debug.Write(Environment.NewLine); 
      foreach (ValidationErrorInfo error in errors) 
       Debug.Write(error.Description + Environment.NewLine); 
      return (errors.Count() == 0); 
     }