2012-01-10 9 views
2
から

背景

私のプロジェクトが急務であると私は大規模なXMLファイルを反復処理し、Base64でエンコードされた画像を返すことが必要です。Novacode DOCXイメージの作成ビットマップ

各画像はMS Word文書に挿入する必要があり、そのためにはDocXライブラリを使用しています。

Base64文字列を問題なくビットマップに変換しています。

問題は私の人生のために

、私はその後、文書に挿入することができますNovacode.Imageオブジェクトにビットマップを取得するように見えることはできません。注:私は既にSystem.Drawing.Image形式に変換する方法を知っています。私は悲しんでいるNovacode.Image形式(DocX)です。

私が(Novacode.Image)somebitmap;に変換しようとすると、Can not cast expression of type Image to Bitmapが得られます。新しいNovacode.Imageオブジェクトを初期化しようとすると、私はCan not access internal constructor Image hereになります。

C#、.NET 4、Forms Appを使用すると、たくさんのコーヒーが使用されます。

質問

のみNovacode.Imageオブジェクトは、ライブラリを経由してMS Word文書に挿入することができますので、どのように一体私はそこに私のビットマップを得るのですか?

私はこの時点で白っぽいですので、おそらく私は単純なものを見逃しています。

答えて

13

オブジェクトを作成するには、DocX.AddImage()メソッドを使用する必要があります。

は、Word文書に画像を追加するには、これらの5つのステップに従ってください:

  1. メモリストリームにあなたの写真を保存します。
  2. Novacode.Imageオブジェクトを作成するには、AddImage()メソッドを呼び出します。
  3. 手順2で作成したNovacode.ImageオブジェクトのCreatePicture()を呼び出して画像を作成します。
  4. (必要に応じて)画像の形状を設定します。
  5. 写真をプラカードに挿入します。

    using (DocX doc = DocX.Create(@"Example.docx")) 
    { 
        using (MemoryStream ms = new MemoryStream()) 
        { 
        System.Drawing.Image myImg = System.Drawing.Image.FromFile(@"test.jpg"); 
    
        myImg.Save(ms, myImg.RawFormat); // Save your picture in a memory stream. 
        ms.Seek(0, SeekOrigin.Begin);      
    
        Novacode.Image img = doc.AddImage(ms); // Create image. 
    
        Paragraph p = doc.InsertParagraph("Hello", false); 
    
        Picture pic1 = img.CreatePicture();  // Create picture. 
        pic1.SetPictureShape(BasicShapes.cube); // Set picture shape (if needed) 
    
        p.InsertPicture(pic1, 0); // Insert picture into paragraph. 
    
        doc.Save(); 
        } 
    } 
    

    ホープ、このことができます:以下

サンプルでは、​​Word文書に画像を挿入する方法を示しています。

+0

ハンス、助けてくれてありがとうが、これはまだ私にトラブルを与えました。特に、ms.Seek(0、SeekOrigin.Begin);ストリームが閉じられたことを示すエラーがスローされました。また、.createPictureメソッドでエラーが発生しました。私は、私は悪いDLL、または外部コードのバグを持っていると思っています。いずれにせよ、私は通常のWord Interopメソッドを使用するだけで問題を解決しました。私はあなたの答えを正しいものとして選択する前にしばらく時間を取って、エラーが私の側にあることを確認して、誰かを誤解させないようにしたいと思います。ありがとう! –

+0

@MatthewPatrickCashatt:コードを投稿してください。 – Hans

0

ありがとうHans。私は、DPIに基づいて画像が間違ったサイズに挿入されている問題を持っていたので、私はDPIに基づいて画像をスケーリングするためにこれを使用、96 dpiとは、単語でスケーリングされた画像に基づいようだった:

using (MemoryStream ms = new MemoryStream()) 
       { 
        System.Drawing.Image myImg = System.Drawing.Image.FromFile(path); 

        //Calculate Horizontal and Vertical scale 
        float Hscale = ((float)96/myImg.HorizontalResolution); 
        float Vscale = ((float)96/myImg.VerticalResolution); 

        myImg.Save(ms, myImg.RawFormat); // Save your picture in a memory stream. 
        ms.Seek(0, SeekOrigin.Begin); 

        Novacode.Image img = proposal.AddImage(ms); // Create image. 
        Picture pic1 = img.CreatePicture();  // Create picture. 

        //Apply scale to height & width 
        pic1.Height = (int)(myImg.Height * Hscale); 
        pic1.Width = (int)(myImg.Width * Vscale); 

        a.InsertPicture(pic1, 0); // Insert picture into paragraph. 
       } 
3

おかげでハンスとマーティン、私は大きなイメージファイル(写真)が常にページに収まるようにサイズを確保するための基礎として、これを使用することができました。最大幅と最大高さは、ページサイズに応じて変更できます。

using (MemoryStream ms = new MemoryStream()) 
{ 
    System.Drawing.Image myImg = System.Drawing.Image.FromFile(imageDirectory + i.FileName); 

    double xScale = 1; 
    double yScale = 1; 

    double maxWidthInches = 6.1; // Max width to fit on a page 
    double maxHeightInches = 8.66; // Max height to fit on a page 

    // Normalise the Horizontal and Vertical scale for different resolutions 
    double hScale = ((double)96/myImg.HorizontalResolution); 
    double vScale = ((double)96/myImg.VerticalResolution); 

    // Scaling required to fit in x direction 
    double imageWidthInches = myImg.Width/myImg.HorizontalResolution; // in inches using DPI 
    if (imageWidthInches > maxWidthInches) 
     xScale = maxWidthInches/imageWidthInches * hScale; 

    // Scaling required to fit in y direction 
    double imageHeightInches = myImg.Height/myImg.VerticalResolution; 
    if (imageHeightInches > maxHeightInches) 
     yScale = maxHeightInches/imageHeightInches * vScale; 

    double finalScale = Math.Min(xScale, yScale); // Use the smallest of the two scales to ensure the picture will fit in both directions 

    myImg.Save(ms, myImg.RawFormat); // Save your picture in a memory stream. 
    ms.Seek(0, SeekOrigin.Begin); 

    Novacode.Image img = document.AddImage(ms); // Create image. 
    Paragraph p = document.InsertParagraph(); 
    Picture pic = img.CreatePicture(); // Create picture. 

    //Apply final scale to height & width 
    double width = Math.Round((double)myImg.Width * finalScale); 
    double height = Math.Round((double)myImg.Height * finalScale); 

    pic.Width = (int)(width); 
    pic.Height = (int)(height); 

    p.InsertPicture(pic); // Insert picture into paragraph. 
} 
+0

好奇心をそそらずに、単にdoc.PageWidthとdoc.PageHeightを次の行に沿って使用する方が簡単です: 'float scale = new [] {1、picture.Width/doc.PageWidth、picture.Height/doc .PageHeight} .Max(); picture.Height =(int)(picture.Height/scale); picture.Width =(int)(picture.Width/scale); ' – ChrisFox

関連する問題