2017-11-23 25 views
1

私はワード文書に画像を追加するはずのアプリを開発しました。これは、単語の文書からコピーを取り出し、コピーに画像を追加します。テキストを追加しようとしましたが、うまく機能しましたが、画像を追加することで、ドキュメントにはエラーが発生してファイルを開くことができました(コンテンツに問題があるためファイル "name"を開くことができません)OpenXMLを使ってワード文書に画像を追加する

コードは次のようになります。

File.Copy(file, newFile, true); 
    WordprocessingDocument wordFile = WordprocessingDocument.Open(newFile, true); 
    Body body = wordFile.MainDocumentPart.Document.Body; 

    var picture = new Picture(); 
    var shape = new Shape() { Style = "width: 20px; height: 20px" }; 
    var imageData = new ImageData() { RelationshipId = "img" }; 

    shape.Append(imageData); 
    picture.Append(shape); 
    wordFile.MainDocumentPart.AddExternalRelationship(
      "http://schemas.openxmlformats.org/officeDocument/2006/relationships/image", 
      new Uri(link_of_image, UriKind.Absolute),"img"); 

    Paragraph para = body.AppendChild(new Paragraph()); 
    Run run = para.AppendChild(new Run()); 
    run.AppendChild(new Picture(picture)); 

    wordFile.Close(); 

何が間違っている可能性がありますか?

+0

ここでは "link_of_image" とは何ですか?それは有効なファイルパスになっていますか?そして、イメージは存在しますか? –

+0

@KerriBrown画像がコンピュータ上に存在しない例としてサーバにアップロードされた画像へのリンク( "something.com/Images/image.png") –

+0

調査のために他にもできることがあります。たとえば、ローカルマシンに保存されている画像を試し、 "wordFile.MainDocumentPart.AddExternalRelationship"を削除し、まだエラーが発生していないかどうか確認してください。 –

答えて

1

ローカルドライブ上の画像を追加するためのこのソリューションが、私はオンラインサーバー 溶液からそれを追加する方法がわからない: は、最初に、これらのアセンブリを追加:

using System.IO; 
using DocumentFormat.OpenXml; 
using DocumentFormat.OpenXml.Packaging; 
using DocumentFormat.OpenXml.Wordprocessing; 
using A = DocumentFormat.OpenXml.Drawing; 
using DW = DocumentFormat.OpenXml.Drawing.Wordprocessing; 
using PIC = DocumentFormat.OpenXml.Drawing.Pictures; 

は、次にファイルを開く

 WordprocessingDocument wordprocessingDocument = 
     WordprocessingDocument.Open(newFile, true); 

     MainDocumentPart mainPart = wordprocessingDocument.MainDocumentPart; 
     ImagePart imagePart = mainPart.AddImagePart(ImagePartType.Jpeg); 

     using (FileStream stream = new FileStream(@"C:\Users\User\Desktop\img.PNG", FileMode.Open)) 
     { 
      imagePart.FeedData(stream); 
     } 
     AddImageToBody(wordprocessingDocument, mainPart.GetIdOfPart(imagePart)); 

     wordprocessingDocument.Close(); 

イメージの参照を定義し、参照を本文に追加します。

var element = 
    new Drawing(
     new DW.Inline(
      new DW.Extent() { Cx = 990000L, Cy = 792000L }, 
      new DW.EffectExtent() 
      { 
       LeftEdge = 0L, 
       TopEdge = 0L, 
       RightEdge = 0L, 
       BottomEdge = 0L 
      }, 
      new DW.DocProperties() 
      { 
       Id = (UInt32Value)1U, 
       Name = "Picture 1" 
      }, 
      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 = "New Bitmap Image.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.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, Cy = 792000L }), 
          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" 
     }); 

wordDoc.MainDocumentPart.Document.Body.AppendChild(new Paragraph(new Run(element))); 

リファレンスhttps://msdn.microsoft.com/en-us/library/office/bb497430.aspx

関連する問題