Novacode Docx Создать изображение из растрового изображения - PullRequest
5 голосов
/ 10 января 2012

Фон

Мой проект является срочным и требует, чтобы я выполнил итерацию большого файла XML и возвратил изображения в кодировке Base64.

Каждое изображение должно быть вставлено в документ 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 через библиотеку, так как, черт возьми, я могу получить там свое растровое изображение ??

На данный момент у меня мутные глаза, поэтому, возможно, я просто упускаю что-то простое.

Ответы [ 3 ]

15 голосов
/ 11 января 2012

Для создания объекта Novacode.Image необходимо использовать метод DocX.AddImage().

Чтобы добавить изображение в текстовый документ, выполните следующие 5 шагов:

  1. Сохранитеизображение в поток памяти.
  2. Создайте объект Novacode.Image, вызвав метод AddImage().
  3. Создайте изображение, вызвав CreatePicture() объекта Novacode.Image, созданного на шаге 2.
  4. Установите форму изображения (при необходимости).
  5. Вставьте свою фотографию в праграф.

Пример ниже показывает, как вставить изображение вWord Document:

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();
  }
}

Надеюсь, это поможет.

3 голосов
/ 19 октября 2014

Спасибо Гансу и Мартину, я смог использовать это в качестве основы для обеспечения того, чтобы большие файлы изображений (фотографии) всегда имели размер, соответствующий размеру страницы. Максимальная ширина и максимальная высота могут быть изменены в зависимости от размера вашей страницы.

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 голосов
/ 20 марта 2014

Спасибо, Ганс. У меня была проблема, когда изображение вставлялось с неправильным размером в зависимости от 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.
                }
...