Гость
Целевая тема:
Создать новую тему:
Автор:
Форумы / Microsoft Office [игнор отключен] [закрыт для гостей] / достать формулу из doc'a / 3 сообщений из 3, страница 1 из 1
09.03.2007, 12:13:36
    #34380072
dacino
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
достать формулу из doc'a
как макросом из док файла сохранить в рисунок (отдельный файл) объект типа формула (Microsoft Education)
соотв если их будет несколько сохранять в разные файлы...
... в вордовых объектах не вяжу, и справки у меня к ним чет нет(хотя ставил вроде все), объясните на пальцах пожалуйста
...
Рейтинг: 0 / 0
09.03.2007, 20:27:37
    #34381491
Бенедикт
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
достать формулу из doc'a
dacino,
Microsoft Education не получал, но Microsoft Equation можно скопировать в clipboard, а оттуда записать в emf-файл (векторный), или какой-нибудь растровый (BMP, например). "На пальцах" разъяснить не получится, потому что используются системные функции. Вот модуль, который пишет формулы из активного документа в emf-файлы, для этого надо вызвать процедуру (макрос) SaveEquationsToEMF:
Код: plaintext
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.
93.
Option Explicit

Private Declare Function OpenClipboard Lib "user32" ( _
   ByVal hWnd As Long) As Long
Private Declare Function CloseClipboard Lib "user32" () As Long

Private Const CF_METAFILEPICT =  3 
Private Declare Function IsClipboardFormatAvailable Lib "user32" ( _
   ByVal wFormat As Long) As Long
Private Declare Function GetClipboardData Lib "user32" ( _
   ByVal wFormat As Long) As Long

Private Type METAFILEPICT
   mm As Long
   xExt As Long
   yExt As Long
   hMF As Long
End Type

Private Declare Function GetMetaFileBitsEx Lib "gdi32" ( _
   ByVal hMF As Long, ByVal nSize As Long, lpvData As Any) As Long
Private Declare Function SetWinMetaFileBits Lib "gdi32" ( _
   ByVal cbBuffer As Long, lpbBuffer As Byte, ByVal hdcRef As Long, _
   lpmfp As METAFILEPICT) As Long
Private Declare Function GetEnhMetaFileBits Lib "gdi32" ( _
   ByVal hEMF As Long, ByVal cbBuffer As Long, _
   lpbBuffer As Byte) As Long

Private Declare Function GlobalLock Lib "kernel32" ( _
   ByVal hMem As Long) As Long
Private Declare Function GlobalUnlock Lib "kernel32" ( _
   ByVal hMem As Long) As Long

Private Declare Sub CopyMemory Lib "kernel32" _
   Alias "RtlMoveMemory" ( _
   Destination As Any, Source As Any, ByVal Length As Long)


Function CopyToEMF(ByVal FileName As String) As Boolean
 Dim hMetaFile As Long
 Dim lMFSize As Long
 Dim hMem As Long
 Dim mfp As METAFILEPICT
 Dim hEMF As Long
 Dim MetaFileBits() As Byte
 Dim nFile As Integer
 
 If IsClipboardFormatAvailable(CF_METAFILEPICT) =  0  Then Exit Function
 If OpenClipboard( 0 ) =  0  Then Exit Function
 hMetaFile = GetClipboardData(CF_METAFILEPICT)
 If hMetaFile Then
    hMem = GlobalLock(hMetaFile)
    CopyMemory mfp, ByVal hMem, Len(mfp)
    hMem = GlobalUnlock(hMem)
    
    lMFSize = GetMetaFileBitsEx(mfp.hMF,  0 , ByVal  0 &)
    If lMFSize Then
       ReDim MetaFileBits( 0  To lMFSize -  1 ) As Byte
       lMFSize = GetMetaFileBitsEx(mfp.hMF, lMFSize, MetaFileBits( 0 ))
       hEMF = SetWinMetaFileBits(lMFSize, MetaFileBits( 0 ),  0 , mfp)
       If hEMF Then
          lMFSize = GetEnhMetaFileBits(hEMF,  0 , ByVal  0 &)
          If lMFSize Then
             ReDim MetaFileBits( 0  To lMFSize -  1 ) As Byte
             lMFSize = GetEnhMetaFileBits(hEMF, lMFSize, MetaFileBits( 0 ))
             nFile = FreeFile
             Open FileName For Output As #nFile
             Close #nFile
             Open FileName For Binary As #nFile
             Put #nFile, , MetaFileBits
             Close #nFile
             CopyToEMF = True
          End If
       End If
    End If
 End If
 CloseClipboard
End Function


Sub SaveEquationsToEMF()
 Dim fld As Word.Field
 Dim nEquation As Long
 Dim sPath As String
 sPath = ActiveDocument.Path
 If Right$(sPath,  1 ) <> "\" Then sPath = sPath & "\"
 For Each fld In ActiveDocument.Fields
    If fld.OLEFormat.ClassType Like "Equation.*" Then
       nEquation = nEquation +  1 
       fld.Copy
       CopyToEMF sPath & "Eq" & nEquation & ".EMF"
    End If
 Next fld
End Sub

Есть замечание: из-за того, установленное логическое разрешение монитора почти всегда не равно физическому, картинки в просмотрщике (или вставленные, скажем, в Word-овский документ) будут не такого размера (обычно меньше) оригинала. Поскольку картинки векторные, их можно масштабировать без потери качества, и эта особенность обычно не напрягает. Если сильно напрягает, можно попробовать устранить, за счёт усложнения кода.
...
Рейтинг: 0 / 0
11.03.2007, 12:18:29
    #34382554
dacino
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
достать формулу из doc'a
спасиб, буду пробовать,
и опыт - сын ошибок трудных....
...
Рейтинг: 0 / 0
Форумы / Microsoft Office [игнор отключен] [закрыт для гостей] / достать формулу из doc'a / 3 сообщений из 3, страница 1 из 1
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


Просмотр
0 / 0
Close
Debug Console [Select Text]