2016-03-01 9 views
1

я работаю над приложением для чтения изображений из нескольких файлов слов и сохранить их в одном файле слова, используя Microsoft.Office.Interop.Word в C#

EDIT: Мне также нужно сохранить копию изображений в файловой системе, поэтому мне нужно изображение в растровом или подобном объекте.

This моя реализация до сих пор, который работает отлично:Чтение изображения из файлов Word, используя C# Word, API без использования буфера обмена

 foreach (InlineShape shape in doc.InlineShapes) 
     { 
      shape.Range.Select(); 
      if (shape.Type == WdInlineShapeType.wdInlineShapePicture) 
      { 
       doc.ActiveWindow.Selection.Range.CopyAsPicture(); 
       ImageData = Clipboard.GetDataObject(); 
       object _ob1 = ImageData.GetData(DataFormats.Bitmap); 
       bmp = (Bitmap)_ob1; 
       images[i++] = bmp; 
       /* 
       bmp.Save("C:\\Users\\Akshay\\Pictures\\bitmaps\\test" + i.ToString() + ".bmp"); 
       */ 
      } 
     } 



У меня есть:

  • Выбранные изображения как InlineShapes
  • Скопировал форму в буфер обмена
  • Сохранена форма в буфере обмена в DataObject
  • Извлечен из формы DataObject в формате Bitmap и хранится в объекте Bitmap.



Мне сказали воздержаться от использования буфера обмена в области автоматизации Word, и использовать API для Word, вместо этого. Я прочитал об этом и нашел SO answer, заявив то же самое.



Я посмотрел много реализаций чтения изображений из файлов Word, на MSDN, SO и т.д., но не мог найти без использования буфера обмена.

Как читать изображения из файлов Word с помощью API Word из Microsoft.Office.Interop.Word пространства имен без использования буфера обмена?

+0

Это причина, по которой не использовать буфер обмена - это память? если да, не можете ли вы удалить объект сразу после сохранения изображения? Также удалить изображение \ объект из буфера обмена? – alsafoo

+0

Нет, память не связана с тем, что вы не используете буфер обмена. Я хочу придерживаться стандартных API-интерфейсов, предоставляемых Interop Word, а не обходного пути к буферу. –

+0

Вы указываете «... и сохраняете их в одном файле слова». Если вы действительно хотите перенести изображения непосредственно на другой документ Word, вы должны использовать TargetRange.FormattedText = shape.Range.FormattedText –

ответ

0

Документы Word в формате Office Open XML хранят изображения в Base64. Поэтому должно быть возможно извлечь эту информацию и преобразовать/передать ее в файл. Вы можете получить доступ к информации, когда документ открыт в приложении Word, используя свойство Range.WordOpenXML.

string shapeBase64 = shape.Range.WordOpenXML; 

Это вернет весь Word Open XML в формате OPC с плоским файлом. Другими словами, он не будет содержать только изображение в Base64, но все определение пакета zip в качестве XML, который его окружает. В моем быстром тесте тег содержит фактический Base64 является

<pkg:binaryData> 

Это дочерний элемент

<pkg:part pkg:name="/word/media/image1.jpg" pkg:contentType="image/jpeg" pkg:compression="store"> 

Обратите внимание, что это также будет возможно для Вас, чтобы получить WordOpenXML всего документа в одном шаге :

document.Content.WordOpenXML 

, но, возможно, после этого нужно понять, каким образом в InlineShapes в теле документа, которые связаны с фактической информации в «медиа» части.

И, конечно, можно было бы работать непосредственно с Zip Package (используя Open XML SDK, возможно) вместо того, чтобы открывать документ в Word.Application.

+0

Моя реализация: http://pastebin.com/zF3sMm7D Я мог читать изображения, используя этот метод, но только несколько изображений внутри документа дали правильное представление XML. Более поздние строки XML не соответствовали ожидаемому формату, и у них не было данных изображения в любом месте. С некоторыми проб и ошибок я мог узнать, что изображения, которые не могли быть прочитаны, были теми, которые не находятся на первой странице документа слова. Я мог бы пройти через все изображения InlineShape в документе, но только те, что были на первой странице, могли бы предоставить действительную строку XML. –

+0

Ну, это не имеет смысла ... Если это работает для первой страницы, принцип должен работать на всех страницах. Возможно, вам нужно проанализировать различные графические объекты в документе, возможно, они не все были одним и тем же графическим типом (bmp, png, jpg, wmf и т. Д.) Или вставлены таким же образом и т. Д. Таким образом, базовый XML может быть другой. –

 Смежные вопросы

  • Нет связанных вопросов^_^