Форум программистов, компьютерный форум, киберфорум
VBA
Войти
Регистрация
Восстановить пароль
Блоги Сообщество Поиск Заказать работу  
 
Рейтинг 4.78/9: Рейтинг темы: голосов - 9, средняя оценка - 4.78
0 / 0 / 0
Регистрация: 05.09.2015
Сообщений: 6
Word

Сложности с программным сохранением картинок на диск

05.09.2015, 01:18. Показов 1965. Ответов 8
Метки нет (Все метки)

Студворк — интернет-сервис помощи студентам
Доброго времени суток, коллеги!

У меня стоит задача из документа Word выбрать все картинки и сохранить их на жесткий диск. К ворду я цепляюсь как COM-объекту и мне доступны все свойства и коллекции.

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

Картинки я смог получить только в виде байтового массива из свойства InlineShapes[ИндексКартинки].Range.EnhMetaFileBits. Потом получилось сбросить их на диск, картинки при этом находятся в EMF формате

И теперь сами вопросы:
1) Можно ли картинки получить как то по другому, в другом формате?

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

Очень прошу помочь, заранее спасибо!
Миниатюры
Сложности с программным сохранением картинок на диск   Сложности с программным сохранением картинок на диск  
Вложения
Тип файла: docx Файл с Картинкой.docx (35.0 Кб, 8 просмотров)
0
Programming
Эксперт
39485 / 9562 / 3019
Регистрация: 12.04.2006
Сообщений: 41,671
Блог
05.09.2015, 01:18
Ответы с готовыми решениями:

Программное удаление нескольких картинок
Всем привет, дорогие товарищи! В excel-е программно рисую 4 картинки с графиками, а затем их...

Вставка картинки в Excel 2010 (сохранения самих картинок в тушке файле)
Добрый день! Возможно проблема где-то уже всплывала. Суть такова, есть макрос, который...

Сохранение всех картинок (в формат png) из Word файла в отдельную папку
Всем доброго времени суток Прошу помощи в создании макроса, суть которого являеться сохранением...

8
 Аватар для chumich
2081 / 1239 / 464
Регистрация: 20.12.2014
Сообщений: 3,234
05.09.2015, 22:13
Цитата Сообщение от Black Romeo Посмотреть сообщение
Можно ли картинки получить как то по другому, в другом формате?
На одном из форумов видел код, сохраняющий рисунки из буфера обмена в файл, который выложил ViterAlex:
Кликните здесь для просмотра всего текста
Visual Basic
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
Public Function Clip2File(Optional Filename As String, Optional Path = "")
  Dim sFileName As String, sPath As String
  Dim strOutputPath As String, oPic As IPictureDisp
  'Путь к папке для сохранения файла
  'Если путь пустой, то копируем в «TEMP». Если нет, то в указанyю папку
  sPath = IIf(Path = "", Environ("TEMP"), Path)
  'Если имя файла не указано, то генерируем случайное имя
  If Filename = "" Then
    Dim FSO As Object
    Set FSO = CreateObject("Scripting.FileSystemObject")
    sFileName = FSO.GetTempName(): sFileName = Mid(sFileName, 1, InStrRev(sFileName, ".") - 1)
  Else: sFileName = Filename: End If
  'Get the filename to save the bitmap to
  strOutputPath = sPath & "\" & sFileName & ".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

Сам не пробовал
1
0 / 0 / 0
Регистрация: 05.09.2015
Сообщений: 6
05.09.2015, 22:22  [ТС]
Чуть чуть не то. Мне интересно, не хранится ли картинка где то еще, а не в EnhMetaFileBits? И там оно может быть не в виде EMF, а в формате оригинала (jpeg, например). По белым полям, такое чувство, что если рисунок "сидит" в таблице, то я дергаю целиком все строки и ячейки и они как раз и вылазят белым фоном. Но как то проверить не получается
0
3218 / 967 / 223
Регистрация: 29.05.2010
Сообщений: 2,087
06.09.2015, 00:50
Сам файл *.docx является архивом, в структуре которого есть поддиректория word\media содержит файлы image в формате загрузки. Может попробовать просто извлечь...
0
0 / 0 / 0
Регистрация: 05.09.2015
Сообщений: 6
06.09.2015, 03:28  [ТС]
Читал что можно переделать расширение в zip и архиватором разжать. Мне не подходит, равно и как сохранить документ в формате html и разбор картинок.

Нужно исключить любую работу руками, только программно.
0
es geht mir gut
 Аватар для SoftIce
11274 / 4760 / 1183
Регистрация: 27.07.2011
Сообщений: 11,439
06.09.2015, 04:55
Вот рабочий(проверил) код. Сохраняет картинки в Bmp

Но Ваша картинка изначально с небольшой белой рамочкой

Visual Basic
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
Option Explicit
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
Const CF_BITMAP = 2
Const IMAGE_BITMAP = 0
Const LR_COPYRETURNORG = &H4
Private Type GUID
  Data1 As Long
  Data2 As Integer
  Data3 As Integer
  Data4(0 To 7) As Byte
End Type
Private Type uPicDesc
  Size As Long
  Type As Long
  hPic As Long
  hPal As Long
End Type
 
Sub Black_Romeo()
    Dim s
    For Each s In ActiveDocument.InlineShapes
        s.Select
        Selection.Copy
        Clip2File
    Next
End Sub
 
Private Function Clip2File()
  Dim strOutputPath As String, oPic As IPictureDisp
  Randomize
  strOutputPath = ThisDocument.Path & "\" & CStr(Int(Rnd * 10000)) & ".bmp"
  Set oPic = GetClipPicture()
  If Not oPic Is Nothing Then
    SavePicture oPic, strOutputPath
    Clip2File = strOutputPath
    MsgBox "Saved as " & 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
  hPicAvail = IsClipboardFormatAvailable(CF_BITMAP)
  
  If hPicAvail <> 0 Then
    h = OpenClipboard(0&)
    If h > 0 Then
      hPtr = GetClipboardData(CF_BITMAP)
      hCopy = CopyImage(hPtr, IMAGE_BITMAP, 0, 0, LR_COPYRETURNORG)
      h = CloseClipboard
      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
  Dim r As Long, uPicInfo As uPicDesc, IID_IDispatch As GUID, IPic As IPicture
  Const PICTYPE_BITMAP = 1
  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
  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
  r = OleCreatePictureIndirect(uPicInfo, IID_IDispatch, True, IPic)
  Set CreatePicture = IPic
End Function
Миниатюры
Сложности с программным сохранением картинок на диск  
Вложения
Тип файла: rar Файл с Картинкой.rar (43.9 Кб, 6 просмотров)
2
0 / 0 / 0
Регистрация: 05.09.2015
Сообщений: 6
07.09.2015, 00:23  [ТС]
Спасибо, видимо придется макрос вшивать в сам документ и запускать на выполнение. Напомню, я работаю из-под другого языка программирования

Добавлено через 7 часов 31 минуту
Цитата Сообщение от SoftIce Посмотреть сообщение
Но Ваша картинка изначально с небольшой белой рамочкой
А если я щелкаю на картинке в ворде и выбираю "Сохранить как" - получившийся файл без рамки. Или я как то не так смотрю?
0
 Аватар для Pro_grammer
6807 / 2839 / 527
Регистрация: 24.04.2011
Сообщений: 5,308
Записей в блоге: 10
07.09.2015, 08:07
Цитата Сообщение от Black Romeo Посмотреть сообщение
я работаю из-под другого языка программирования
Что за язык программирования, который не умеет работать с ZIP файлами?
Нет ничего проще, чем распаковать архив и переместить из него готовые картинки в оригинальном качестве в нужное место. Пример на VB6
Visual Basic
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
Private Sub Command1_Click()
DocFile = "H:\Down\Файл с Картинкой.docx" 'путь к документу
ZipFile = DocFile & ".zip"
ExtractTo = "C:\temp\doc"  '  папка куда будет извлекатся архив
Name DocFile As ZipFile     ' делаем из дока зип
Set fso = CreateObject("Scripting.FileSystemObject")
If Not fso.FolderExists(ExtractTo) Then
fso.CreateFolder (ExtractTo)
End If
Set objShell = CreateObject("Shell.Application")
Set FilesInZip = objShell.NameSpace(ZipFile).items
objShell.NameSpace(ExtractTo).CopyHere (FilesInZip)
Set fso = Nothing
Set objShell = Nothing
 
 
Name ZipFile As DocFile ' переименовываем назад
                                    'Все картинки тут: C:\temp\doc\word\media\
                                    'Можно переместить их куда угодно, а папку  C:\temp\doc удалить или очистить
End Sub
И да, на оригинальной картинке нет белого ободка, она в формате JPG 720x400
1
0 / 0 / 0
Регистрация: 05.09.2015
Сообщений: 6
09.09.2015, 01:30  [ТС]
Все работает просто супер, если файл docx, а вот если doc то уже не работает. Даже если просто переименовать в zip - архиватором тоже не открыть
0
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
inter-admin
Эксперт
29715 / 6470 / 2152
Регистрация: 06.03.2009
Сообщений: 28,500
Блог
09.09.2015, 01:30
Помогаю со студенческими работами здесь

Как программно сохранить файл не на диск, а на FTP?
Есть необходимость формировать клиенту файлы. Можно ли их как-то на FTP закидывать с логином и...

Программно скрыть каталог или жёсткий диск
Здравствуйте, помогите кто знает как скрыть от пользователя папку. И можно ли таким же образом...

Сохранение файла из письма в M exchanger на диск?
Можно ли сохранить прикрепленный файл из письма в Microsoft Exchanger на диске? Если да, то как. ...

MAPI и сохранение на диск аттачмента с письма.
Подскажите пожалуста как сохранить на диске аттачмент с письма....

Сохранение отдельного рисунка из PowerPoint на диск в формате jpg
на другом форуме встретился вопрос - как сохранить Excel'евский Range как jpg-рисунок. зная, что...


Искать еще темы с ответами

Или воспользуйтесь поиском по форуму:
9
Ответ Создать тему
Новые блоги и статьи
Модель ЗдрввоСохранения 7: больше работников, больше ресурсов.
anaschu 08.04.2026
работников и заданий может быть сколько угодно, но настроено всё так, что используется пока что только 20% kYBz3eJf3jQ
Дальние перспективы сервера - слоя сети с космологическим дизайном интефейса карты и логики.
Hrethgir 07.04.2026
Дальнейшее ближайшее планирование вывело к размышлениям над дальними перспективами. И вот тут может быть даже будут нужны оценки специалистов, так как в дальних перспективах всё может очень сильно. . .
Горе от ума
kumehtar 07.04.2026
Эта мне ментальная установка, что вот прямо сейчас, мол, мне для полного счастья не хватает (нужное вписать), и когда я этого достигну - тогда и полный кайф. Одна из самых сильных ловушек на пути. . . .
Использование значений реквизитов справочника в документе, с определенными условиями и правами
Maks 07.04.2026
1. Контроль срока действия договора Алгоритм из решения ниже реализован на примере нетипового документа "ЗаявкаНаРаботу", разработанного в конфигурации КА2. Задача: уведомлять пользователя, если. . .
Доступность команды формы по условию
Maks 07.04.2026
Алгоритм из решения ниже реализован на примере нетипового документа "СписаниеМатериалов", разработанного в конфигурации КА2. Задача: сделать доступной кнопку (команда формы "ЗавершитьСписание") при. . .
Уведомление о неверно выбранном значении справочника
Maks 06.04.2026
Алгоритм из решения ниже реализован на примере нетипового документа "НарядПутевка", разработанного в конфигурации КА2. Задача: уведомлять пользователя, если в документе выбран неверный склад. . .
Установка Qt Creator для C и C++: ставим среду, CMake и MinGW без фреймворка Qt
8Observer8 05.04.2026
Среду разработки Qt Creator можно установить без фреймворка Qt. Есть отдельный репозиторий для этой среды: https:/ / github. com/ qt-creator/ qt-creator, где можно скачать установщик, на вкладке Releases:. . .
AkelPad-скрипты, структуры, и немного лирики..
testuser2 05.04.2026
Такая программа, как AkelPad существует уже давно, и также давно существуют скрипты под нее. Тем не менее, прога живет, периодически что-то не спеша дополняется, улучшается. Что меня в первую очередь. . .
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2026, CyberForum.ru