OpenXML: проблема с добавлением изображений в документы

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

   //set stuff up...
WordprocessingDocument doc = WordprocessingDocument.Open(fsPat, true, new OpenSettings(){
    AutoSave = true,

    MarkupCompatibilityProcessSettings = new MarkupCompatibilityProcessSettings(MarkupCompatibilityProcessMode.ProcessAllParts,
    DocumentFormat.OpenXml.FileFormatVersions.Office2007),

    MaxCharactersInPart = long.MaxValue
    });

    MainDocumentPart mainPart = doc.MainDocumentPart;
.
.Other stuff goes here
.

//now the fun...
Run r2 = new Run();
    // Add an ImagePart.
    ImagePart ip = mainPart.AddImagePart(ImagePartType.Png);
    string imageRelationshipID = mainPart.CreateRelationshipToPart(ip); //
    using (Stream imgStream = ip.GetStream())
        {
        System.Drawing.Bitmap b = new System.Drawing.Bitmap("myfile.png");
        b.Save(imgStream, System.Drawing.Imaging.ImageFormat.Png);
        }
    Drawing drawing = BuildImage(imageRelationshipID, "name"+imageRelationshipID.ToString(), 17, 17);
    r2.Append(drawing);
    p.Append(r2);

Часть изображения по существу скопирована с http://blog.stuartwhiteford.com/?p=33) и в настоящее время работает в цикле. Я также скопировал его функцию BuildImage() и использую ее как есть.

Когда я открываю полученный docx, я вижу красные крестики там, где изображения говорят: «В настоящее время это изображение не может быть отображено».

Когда я открою zip, изображения появятся в корне/носителе, но не в корне/слове/носителе, как я ожидал. Я также не могу найти изображения, на которые есть ссылки ни в одном из файлов отношений. В идеале они должны быть в root/word/_rels/document.xml.rels. Вы заметите, что я изменил способ установки imageRelationshipID в надежде исправить это. Это не так.

Пожалуйста помоги. Спасибо.


person emragins    schedule 04.09.2011    source источник


Ответы (1)


Итак... Похоже, OpenXML меня просто ненавидит. Я скопировал код AddImagePart примерно из 3-4 мест, пробуя другие вещи — ни одна из которых не длилась долго — и просто не мог сформировать отношения. Я вижу, что они происходят автоматически с помощью функции AddImagePart.

В итоге я применил полный обходной путь, добавив все изображения, которые я, возможно, захочу поместить, и удалив родителей узлов рисования тех, которые мне не нужны (как правило, узлы запуска). Поскольку это очень маленькие изображения, это осуществимо и способами более элегантными, чем пытаться добавить их по мере необходимости, поскольку мне не нужно отслеживать, где изображения хранятся на диске.

person emragins    schedule 05.09.2011
comment
Не могли бы вы уточнить? Я сталкиваюсь с той же проблемой. Отношения изображения не создаются. - person tr4nc3; 27.01.2014
comment
@ tr4nc3 В моем сценарии я знал, что всегда хотел, чтобы одно из трех изображений отображалось в определенных местах. Поэтому я схитрила и добавила их в эти места в моем шаблоне документа Word. Затем я смог удалить все изображения, которые не соответствовали желаемому «имени изображения», оставив мне только одно. Все 3 изображения по-прежнему были встроены в папку мультимедиа, поэтому размер файла был немного больше, чем мог бы быть в противном случае. Это сработало только для меня, потому что а) ограниченные параметры изображения б) маленькие изображения (12x12 или что-то в этом роде) в) я использовал шаблон, а не создавал документ с нуля. - person emragins; 27.01.2014
comment
Если это не соответствует вашим потребностям, извините, я не смогу помочь. У меня никогда не получалось, чтобы код добавления изображения работал в пользу вышеуказанного решения. Долгосрочным результатом моего проекта было то, что мы в итоге перешли на создание html и преобразование его в pdf. Еще позже мы перешли на Crystal Reports благодаря нетехническим бизнесменам. Это совсем другая история, которую нужно рассказывать за пивом. - person emragins; 27.01.2014
comment
Спасибо за ответ. Великая изобретательность! К сожалению, в моем случае это не сработает. - person tr4nc3; 27.01.2014