[方法] ワープロ ドキュメントに画像を挿入する (Open XML SDK)How to: Insert a picture into a word processing document (Open XML SDK)

このトピックでは、Open XML SDK 2.5 for Office のクラスを使用して、プログラムによってワープロ ドキュメントに画像を追加する方法について説明します。This topic shows how to use the classes in the Open XML SDK 2.5 for Office to programmatically add a picture to a word processing document.

このトピックのコードをコンパイルするには、次のアセンブリ ディレクティブが必要です。The following assembly directives are required to compile the code in this topic.

    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;
    Imports System.IO
    Imports DocumentFormat.OpenXml
    Imports DocumentFormat.OpenXml.Packaging
    Imports DocumentFormat.OpenXml.Wordprocessing
    Imports A = DocumentFormat.OpenXml.Drawing
    Imports DW = DocumentFormat.OpenXml.Drawing.Wordprocessing
    Imports PIC = DocumentFormat.OpenXml.Drawing.Pictures

既存のドキュメントを編集用に開くOpening an Existing Document for Editing

既存のドキュメントを開くには、次の using ステートメントに示すように、WordprocessingDocument クラスをインスタンス化します。To open an existing document, instantiate the WordprocessingDocument class as shown in the following using statement. 同じステートメントで、Open(String, Boolean) メソッドを使用して、指定した filepath にあるワープロ ファイルを開きます。ドキュメントの編集を有効にするには、ブール値のパラメーターを true に設定します。In the same statement, open the word processing file at the specified filepath by using the Open(String, Boolean) method, with the Boolean parameter set to true in order to enable editing the document.

    using (WordprocessingDocument wordprocessingDocument =
           WordprocessingDocument.Open(filepath, true)) 
    { 
        // Insert other code here. 
    }
    Using wordprocessingDocument As WordprocessingDocument = WordprocessingDocument.Open(filepath, True)
        ' Insert other code here. 
    End Using

using ステートメントは、一般的な .Create、.Save、.Close シーケンスの推奨される代替手段を提供します。これによって、閉じかっこに達したときに、Dispose メソッド (Open XML SDK がリソースをクリーンアップするために使用する内部メソッド) が自動的に呼び出されます。using ステートメントに続くブロックは、using ステートメントで作成または指定されたオブジェクト (この場合は wordprocessingDocument) のスコープを設定します。Open XML SDK の **WordprocessingDocument クラスが System.IDisposable 実装の一部として自動的にオブジェクトを保存して閉じること、また、Dispose がブロックの終わりで自動的に呼び出されることから、using を使用する場合は、Save および Close を明示的に呼び出す必要はありません。The using statement provides a recommended alternative to the typical .Create, .Save, .Close sequence. It ensures that the Dispose method (internal method that is used by the Open XML SDK to clean up resources) is automatically called when the closing brace is reached. The block that follows the using statement establishes a scope for the object that is created or named in the using statement, in this case wordprocessingDocument. Because the WordprocessingDocument class in the Open XML SDK automatically saves and closes the object as part of its System.IDisposable implementation, and because Dispose is automatically called when you exit the block, you do not have to explicitly call Save and Close─as long as you use using.


グラフィック オブジェクトの XML 表現The XML Representation of the Graphic Object

グラフィック オブジェクト データ要素は、ISO/IEC 29500 仕様書で導入され、次のように説明されています。The following text from the ISO/IEC 29500 specification introduces the Graphic Object Data element.

この要素は、ドキュメント内のグラフィック オブジェクトへの参照を指定します。このグラフィック オブジェクトは、そのデータをドキュメント内に保持することを選択したドキュメントの作成者によってのみ提供されます。This element specifies the reference to a graphic object within the document. This graphic object is provided entirely by the document authors who choose to persist this data within the document.

[注意: 使用されるグラフィック オブジェクトの種類によっては、OOXML フレームワークをサポートする生成側アプリケーションの一部でそのグラフィック オブジェクトをレンダリングできない場合があります。][Note: Depending on the type of graphical object used not every generating application that supports the OOXML framework will have the ability to render the graphical object. end note]

© ISO/IEC29500: 2008.© ISO/IEC29500: 2008.

次の XML スキーマ フラグメントは、この要素のコンテンツを定義しています。The following XML Schema fragment defines the contents of this element

    <complexType name="CT_GraphicalObjectData">
       <sequence>
           <any minOccurs="0" maxOccurs="unbounded" processContents="strict"/>
       </sequence>
       <attribute name="uri" type="xsd:token"/>
    </complexType>

サンプル コードの動作のしくみHow the Sample Code Works

ドキュメントを開いた後、次のコード セグメントに示すように、ファイル ストリームを使用して ImagePart オブジェクトを MainDocumentPart オブジェクトに追加します。After you have opened the document, add the ImagePart object to the MainDocumentPart object by using a file stream as shown in the following code segment.

    MainDocumentPart mainPart = wordprocessingDocument.MainDocumentPart;
    ImagePart imagePart = mainPart.AddImagePart(ImagePartType.Jpeg);
    using (FileStream stream = new FileStream(fileName, FileMode.Open))
    {
        imagePart.FeedData(stream);
    }
    AddImageToBody(wordprocessingDocument, mainPart.GetIdOfPart(imagePart));
    Dim mainPart As MainDocumentPart = wordprocessingDocument.MainDocumentPart
    Dim imagePart As ImagePart = mainPart.AddImagePart(ImagePartType.Jpeg)
    Using stream As New FileStream(fileName, FileMode.Open)
        imagePart.FeedData(stream)
    End Using
    AddImageToBody(wordprocessingDocument, mainPart.GetIdOfPart(imagePart))

本文に画像を追加するには、まず画像の参照を定義します。To add the image to the body, first define the reference of the image. 次に、その参照を本文に追加します。Then, append the reference to the body. この要素は、Run 内に存在する必要があります。The element should be in a Run.

    // Define the reference of the image.
    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"
             });

    // Append the reference to the body. The element should be in 
    // a DocumentFormat.OpenXml.Wordprocessing.Run.
    wordDoc.MainDocumentPart.Document.Body.AppendChild(new Paragraph(new Run(element)));
    ' Define the image reference.
    Dim element = New Drawing( _
                          New DW.Inline( _
                      New DW.Extent() With {.Cx = 990000L, .Cy = 792000L}, _
                      New DW.EffectExtent() With {.LeftEdge = 0L, .TopEdge = 0L, .RightEdge = 0L, .BottomEdge = 0L}, _
                      New DW.DocProperties() With {.Id = CType(1UI, UInt32Value), .Name = "Picture1"}, _
                      New DW.NonVisualGraphicFrameDrawingProperties( _
                          New A.GraphicFrameLocks() With {.NoChangeAspect = True} _
                          ), _
                      New A.Graphic(New A.GraphicData( _
                                    New PIC.Picture( _
                                        New PIC.NonVisualPictureProperties( _
                                            New PIC.NonVisualDrawingProperties() With {.Id = 0UI, .Name = "Koala.jpg"}, _
                                            New PIC.NonVisualPictureDrawingProperties() _
                                            ), _
                                        New PIC.BlipFill( _
                                            New A.Blip( _
                                                New A.BlipExtensionList( _
                                                    New A.BlipExtension() With {.Uri = "{28A0092B-C50C-407E-A947-70E740481C1C}"}) _
                                                ) With {.Embed = relationshipId, .CompressionState = A.BlipCompressionValues.Print}, _
                                            New A.Stretch( _
                                                New A.FillRectangle() _
                                                ) _
                                            ), _
                                        New PIC.ShapeProperties( _
                                            New A.Transform2D( _
                                                New A.Offset() With {.X = 0L, .Y = 0L}, _
                                                New A.Extents() With {.Cx = 990000L, .Cy = 792000L}), _
                                            New A.PresetGeometry( _
                                                New A.AdjustValueList() _
                                                ) With {.Preset = A.ShapeTypeValues.Rectangle} _
                                            ) _
                                        ) _
                                    ) With {.Uri = "http://schemas.openxmlformats.org/drawingml/2006/picture"} _
                                ) _
                            ) With {.DistanceFromTop = 0UI, _
                                    .DistanceFromBottom = 0UI, _
                                    .DistanceFromLeft = 0UI, _
                                    .DistanceFromRight = 0UI} _
                        )

    ' Append the reference to the body, the element should be in 
    ' a DocumentFormat.OpenXml.Wordprocessing.Run.
    wordDoc.MainDocumentPart.Document.Body.AppendChild(New Paragraph(New Run(element)))

サンプル コードSample Code

次のコード例では、既存の Word 文書に画像を追加しています。コードでは、ワード文書のパスと、画像を含むファイルのパスをこの順に渡すことで InsertAPicture メソッドを呼び出せます。たとえば、次の呼び出しは、"MyPic.jpg" という画像を "Word9.docx" というファイルに挿入します (どちらのファイルもそれぞれ指定されたパスにあるものが使用されます)。The following code example adds a picture to an existing word document. In your code, you can call the InsertAPicture method by passing in the path of the word document, and the path of the file that contains the picture. For example, the following call inserts the picture "MyPic.jpg" into the file "Word9.docx," located at the specified paths.

    string document = @"C:\Users\Public\Documents\Word9.docx";
    string fileName = @"C:\Users\Public\Documents\MyPic.jpg";
    InsertAPicture(document, fileName);
    Dim document As String = "C:\Users\Public\Documents\Word9.docx"
    Dim fileName As String = "C:\Users\Public\Documents\MyPic.jpg"
    InsertAPicture(document, fileName)

このコードを実行した後、Word9.docx ファイルを調べて、画像が挿入されていることを確認してください。After you run the code, look at the file "Word9.docx" to see the inserted picture.

以下に、C# と Visual Basic による完全なサンプル コードを示します。The following is the complete sample code in both C# and Visual Basic.

    public static void InsertAPicture(string document, string fileName)
    {
        using (WordprocessingDocument wordprocessingDocument = 
            WordprocessingDocument.Open(document, true))
        {
            MainDocumentPart mainPart = wordprocessingDocument.MainDocumentPart;

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

            using (FileStream stream = new FileStream(fileName, FileMode.Open))
            {
                imagePart.FeedData(stream);
            }

            AddImageToBody(wordprocessingDocument, mainPart.GetIdOfPart(imagePart));
        }
    }

    private static void AddImageToBody(WordprocessingDocument wordDoc, string relationshipId)
    {
        // Define the reference of the image.
        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" });

       // Append the reference to body, the element should be in a Run.
       wordDoc.MainDocumentPart.Document.Body.AppendChild(new Paragraph(new Run(element)));
    }
    Public Sub InsertAPicture(ByVal document As String, ByVal fileName As String)
        Using wordprocessingDocument As WordprocessingDocument = WordprocessingDocument.Open(document, True)
            Dim mainPart As MainDocumentPart = wordprocessingDocument.MainDocumentPart

            Dim imagePart As ImagePart = mainPart.AddImagePart(ImagePartType.Jpeg)

            Using stream As New FileStream(fileName, FileMode.Open)
                imagePart.FeedData(stream)
            End Using

            AddImageToBody(wordprocessingDocument, mainPart.GetIdOfPart(imagePart))
        End Using
    End Sub

    Private Sub AddImageToBody(ByVal wordDoc As WordprocessingDocument, ByVal relationshipId As String)
        ' Define the reference of the image.
        Dim element = New Drawing( _
                              New DW.Inline( _
                          New DW.Extent() With {.Cx = 990000L, .Cy = 792000L}, _
                          New DW.EffectExtent() With {.LeftEdge = 0L, .TopEdge = 0L, .RightEdge = 0L, .BottomEdge = 0L}, _
                          New DW.DocProperties() With {.Id = CType(1UI, UInt32Value), .Name = "Picture1"}, _
                          New DW.NonVisualGraphicFrameDrawingProperties( _
                              New A.GraphicFrameLocks() With {.NoChangeAspect = True} _
                              ), _
                          New A.Graphic(New A.GraphicData( _
                                        New PIC.Picture( _
                                            New PIC.NonVisualPictureProperties( _
                                                New PIC.NonVisualDrawingProperties() With {.Id = 0UI, .Name = "Koala.jpg"}, _
                                                New PIC.NonVisualPictureDrawingProperties() _
                                                ), _
                                            New PIC.BlipFill( _
                                                New A.Blip( _
                                                    New A.BlipExtensionList( _
                                                        New A.BlipExtension() With {.Uri = "{28A0092B-C50C-407E-A947-70E740481C1C}"}) _
                                                    ) With {.Embed = relationshipId, .CompressionState = A.BlipCompressionValues.Print}, _
                                                New A.Stretch( _
                                                    New A.FillRectangle() _
                                                    ) _
                                                ), _
                                            New PIC.ShapeProperties( _
                                                New A.Transform2D( _
                                                    New A.Offset() With {.X = 0L, .Y = 0L}, _
                                                    New A.Extents() With {.Cx = 990000L, .Cy = 792000L}), _
                                                New A.PresetGeometry( _
                                                    New A.AdjustValueList() _
                                                    ) With {.Preset = A.ShapeTypeValues.Rectangle} _
                                                ) _
                                            ) _
                                        ) With {.Uri = "http://schemas.openxmlformats.org/drawingml/2006/picture"} _
                                    ) _
                                ) With {.DistanceFromTop = 0UI, _
                                        .DistanceFromBottom = 0UI, _
                                        .DistanceFromLeft = 0UI, _
                                        .DistanceFromRight = 0UI} _
                            )

        ' Append the reference to body, the element should be in a Run.
        wordDoc.MainDocumentPart.Document.Body.AppendChild(New Paragraph(New Run(element)))
    End Sub

関連項目See also

その他のリソースOther resources

Open XML SDK 2.5 クラス ライブラリ リファレンスOpen XML SDK 2.5 class library reference