Форум программистов
 

Восстановите пароль или Зарегистрируйтесь на форуме, о проблемах и с заказом рекламы пишите сюда - alarforum@yandex.ru, проверяйте папку спам!

Вернуться   Форум программистов > Microsoft Office и VBA программирование > Microsoft Office Word
Регистрация

Восстановить пароль
Повторная активизация e-mail

Купить рекламу на форуме - 42 тыс руб за месяц

Ответ
 
Опции темы Поиск в этой теме
Старый 28.01.2009, 13:42   #1
viter.alex
Балуюсь кодами
Участник клуба
 
Аватар для viter.alex
 
Регистрация: 09.01.2009
Сообщений: 1,837
По умолчанию Сохранение рисунков Word в файл

Имеется рисунок типа InlineShape в документе. Как его сохранить в отдельный файл? Метод сохранения всей страницы в html известен и неинтересен. Может есть другие подходы? Например, скопировать его в буфер, а буфер сохранить как файл?
Лучше день потерять — потом за пять минут долететь!©
viter.alex вне форума Ответить с цитированием
Старый 28.01.2009, 18:11   #2
EducatedFool
Программист VBA
СуперМодератор
 
Аватар для EducatedFool
 
Регистрация: 13.07.2008
Сообщений: 6,856
По умолчанию

Цитата:
Например, скопировать его в буфер, а буфер сохранить как файл?
Пожалуй, самый простой способ.

2 часа поисков способа преобразовать объект InlineShape \ Shape в пригодный для сохранения формат IPictureDisp ни к чему не привели...

Можно попробовать преобразовать в формат IPictureDisp при помощи WinAPI, либо при помощи тех же WinAPI получить из InlineShape байтовый массив и записать этот массив непосредственно в файл при помощи конструкции типаOpen Path For Binary Access Write As #1, но примеров кода найти не удалось.

Цитата:
Метод сохранения всей страницы в html известен и неинтересен
На крайний случай и такой способ можно использовать...
К тому же код должен получиться несложным.

Последний раз редактировалось EducatedFool; 28.01.2009 в 18:55.
EducatedFool вне форума Ответить с цитированием
Старый 28.01.2009, 18:16   #3
Sasha_Smirnov
Особый статус
Участник клуба
 
Аватар для Sasha_Smirnov
 
Регистрация: 24.11.2008
Сообщений: 1,535
По умолчанию

Инлайншэйп конвертировать в шэйп, и будет легче.
Щас попробую, а то забыл, как там это происходит.

Код:
Sub InlineShapeToDocInMyDocs()
Static N As Integer
N = N + 1
Selection.InlineShapes.AddPicture FileName:= _
    "C:\Documents and Settings\Sasha\Мои документы\Мои рисунки\2008.09.07.jpg" _
    , LinkToFile:=False, SaveWithDocument:=True
    
ActiveDocument.InlineShapes.Item(N).ConvertToShape.Duplicate.Select
Selection.Cut 'вырезали копию картинки'

'создадим пустой документ (он сразу сохранится в папке Мои документы)'
Documents.Add DocumentType:=wdNewBlankDocument
Selection.Paste 'вставили копию картинки'

ActiveDocument.SaveAs FileName:=ActiveDocument & N, AddToRecentFiles:=False
'теперь в папке Мои документы лежит копия картинки под именем "<старое имя>N.doc[x]"'
End Sub
Это просто попытка! (Почему-то сохраняет доки с двумя, а не с одним рисунком из исходного.)

А если не через VB, то как же?

Последний раз редактировалось Sasha_Smirnov; 28.01.2009 в 19:17.
Sasha_Smirnov вне форума Ответить с цитированием
Старый 28.01.2009, 18:51   #4
viter.alex
Балуюсь кодами
Участник клуба
 
Аватар для viter.alex
 
Регистрация: 09.01.2009
Сообщений: 1,837
По умолчанию

Спасибо за помощь, сам копаю в Google. Методы есть, но пока только на VB, а это я и без низ знаю
Лучше день потерять — потом за пять минут долететь!©
viter.alex вне форума Ответить с цитированием
Старый 28.01.2009, 19:31   #5
viter.alex
Балуюсь кодами
Участник клуба
 
Аватар для viter.alex
 
Регистрация: 09.01.2009
Сообщений: 1,837
По умолчанию

УРА!!! Слава Google!!! Самой страницы уже нет, но в кеше Google она сохранилась. Вот здесь
Собственно задача состояла в том, чтобы из документа вытянуть картинку и вставить в PictureBox на форме
Код:
Option Explicit

'### Paste into a standard module - call Clip2File ###
'##################################################

' Checks the clipboard for a bitmap
' If found, creates a standard Picture object from the
' clipboard contetnts and saves it to a file

' The code requires a reference to the "OLE Automation" type library

' The code in this module has been derived primarily from _
' the PatsePicture sample on Stephen Bullen's Excel Page _
' - http://www.bmsltd.ie/Excel/Default.htm

'Windows API Function Declarations
Private Declare Function IsClipboardFormatAvailable Lib "user32" (ByVal wFormat As Integer) As Long
Private Declare Function OpenClipboard Lib "user32" (ByVal hwnd As Long) As Long
Private Declare Function GetClipboardData Lib "user32" (ByVal wFormat As Integer) As Long
Private Declare Function CloseClipboard Lib "user32" () As Long
Private Declare Function OleCreatePictureIndirect Lib "olepro32.dll" (PicDesc As uPicDesc, RefIID As GUID, ByVal fPictureOwnsHandle _
As Long, IPic As IPicture) As Long
Private Declare Function CopyImage Lib "user32" (ByVal handle As Long, _
ByVal un1 As Long, ByVal n1 As Long, ByVal n2 As Long, _
ByVal un2 As Long) As Long

'The API format types we need
Const CF_BITMAP = 2
Const IMAGE_BITMAP = 0
Const LR_COPYRETURNORG = &H4


'Declare a UDT to store a GUID for the IPicture OLE Interface
Private Type GUID
  Data1 As Long
  Data2 As Integer
  Data3 As Integer
  Data4(0 To 7) As Byte
End Type

'Declare a UDT to store the bitmap information
Private Type uPicDesc
  Size As Long
  Type As Long
  hPic As Long
  hPal As Long
End Type

Public Function Clip2File()
  
  Dim strOutputPath As String, oPic As IPictureDisp
  
  'Get the filename to save the bitmap to
  strOutputPath = Environ("TEMP") & "\temp.bmp"
  
  'Retrieve the picture from the clipboard...
  Set oPic = GetClipPicture()
  
  '... and save it to the file
  If Not oPic Is Nothing Then
    SavePicture oPic, strOutputPath
    Clip2File = strOutputPath
  Else
    Clip2File = ""
    MsgBox "Unable to retrieve bitmap from clipboard"
  End If
End Function

Private Function GetClipPicture() As IPicture
  
  Dim h As Long, hPicAvail As Long, hPtr As Long, _
  hPal As Long, hCopy As Long
  
  'Check if the clipboard contains a bitmap
  hPicAvail = IsClipboardFormatAvailable(CF_BITMAP)
  
  If hPicAvail <> 0 Then
    'Get access to the clipboard
    h = OpenClipboard(0&)
    If h > 0 Then
      'Get a handle to the image data
      hPtr = GetClipboardData(CF_BITMAP)
      hCopy = CopyImage(hPtr, IMAGE_BITMAP, 0, 0, LR_COPYRETURNORG)
      'Release the clipboard to other programs
      h = CloseClipboard
      'If we got a handle to the image, convert it into _
      'a Picture object and return it
      If hPtr <> 0 Then Set GetClipPicture = CreatePicture(hCopy, _
        0, CF_BITMAP)
    End If
  End If
  
End Function

Private Function CreatePicture(ByVal hPic As Long, ByVal hPal As Long, _
ByVal lPicType) As IPicture
  
  ' IPicture requires a reference to "OLE Automation"
  Dim r As Long, uPicInfo As uPicDesc, IID_IDispatch As GUID, _
  IPic As IPicture
  
  'OLE Picture types
  Const PICTYPE_BITMAP = 1
  
  ' Create the Interface GUID (for the IPicture interface)
  With IID_IDispatch
    .Data1 = &H7BF80980
    .Data2 = &HBF32
    .Data3 = &H101A
    .Data4(0) = &H8B
    .Data4(1) = &HBB
    .Data4(2) = &H0
    .Data4(3) = &HAA
    .Data4(4) = &H0
    .Data4(5) = &H30
    .Data4(6) = &HC
    .Data4(7) = &HAB
  End With
  
  ' Fill uPicInfo with necessary parts.
  With uPicInfo
    .Size = Len(uPicInfo) ' Length of structure.
    .Type = PICTYPE_BITMAP ' Type of Picture
    .hPic = hPic ' Handle to image.
    .hPal = 0 ' Handle to palette (if bitmap).
  End With
  
  ' Create the Picture object.
  r = OleCreatePictureIndirect(uPicInfo, IID_IDispatch, True, IPic)
  
  ' Return the new Picture object.
  Set CreatePicture = IPic
  
End Function
Лучше день потерять — потом за пять минут долететь!©

Последний раз редактировалось viter.alex; 15.04.2009 в 14:44.
viter.alex вне форума Ответить с цитированием
Старый 08.06.2010, 21:43   #6
meshzp
Новичок
Джуниор
 
Регистрация: 08.06.2010
Сообщений: 2
По умолчанию

Не хотелось, конечно, начинать свое общение на форуме с такого поста, но все же надеюсь, что меня не проигнорируют.

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

Нарыл такой вот "учебник" о работе с графикой VBA http://markros.ru/graphics/ и окончательно запутался. Но почему-то предложенный Вами код постоянно не может получить изображение из Clipboard и выводит соответствующий msgbox.
Все картинки в файле - InlineShape
meshzp вне форума Ответить с цитированием
Ответ


Купить рекламу на форуме - 42 тыс руб за месяц



Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
Загрузка/сохранение рисунков Marsik Помощь студентам 20 20.11.2008 18:09
Загрузка и сохранение в файл rainbow Общие вопросы Delphi 16 27.09.2008 11:35
Нумерация рисунков и таблиц в Word coolsolver Microsoft Office Word 1 18.09.2007 09:27
Сохранение в файл Македонский Общие вопросы Delphi 4 05.09.2007 15:04
Сохранение в файл *.*С Noor Общие вопросы C/C++ 6 08.01.2007 22:44