![]() |
| ||
|
|
Новости |
Поиск |
FAQ |
Статьи |
Книги |
Новости VCL
| | Форумы ЧАТ |
Орешник |
|
| |||
| |||
« предыдущая ветвь | форум | следующая ветвь »
достать картинки из Вордового документа [Delphi, Windows]
_Dragon © (2004-10-21 21:53:00)Есть документ Ворда, в котором содержится туева хуча картинок. Каким способом с помощью Delphi можно все эти картинки сохранить каждую в отдельный файл???
_Dragon (2004-10-23 00:09:00) [1]спасибо огромное!
vertal (2004-10-23 00:01:00) [2]Я решал такую задачу для формата jpeg, могу поделиться кодом:
Примерно так:
Var
MSWOrd:Variant;
Begin
CoInitialize(Nil);
MsWord := CreateOleObject('Word.Application');
MsWord.Documents.Open(FileName:='SomeFile',ConfirmConversions:=False,ReadOnly:=True,AddToRecentFiles:=False,Format:= wdOpenFormatAuto);
MsWord.ActiveDocument.Shapes(1).Select;
MsWord.ActiveDocument.Selection.Copy;
SaveClipboardBitMapImageToJPEGFile('YourFile.jpg');
MsWord.ActiveDocument.Close(SaveChanges:=wdDoNotSaveChanges);
MSWord.Quit(SaveChanges:=wdDoNotSaveChanges);
MSWord:=0;
CoUninitialize();
End;
...
library savejpeg;
uses jpeg,clipbrd,windows,graphics;
Function CheckForMetaFile():LongInt;
Var
mHDC,rHDC:THandle;
pMFP:^METAFILEPICT;
HG:HGLOBAL;
hBitmap:THandle;
xWidth,yWidth:LongInt;
LastObj:HGDIOBJ;
Begin
Result:=ERROR_SUCCESS;
if not IsClipboardFormatAvailable(CF_BITMAP)
and IsClipboardFormatAvailable(CF_METAFILEPICT)then
Begin
rHDC:=GetDC(0);
mHDC:=CreateCompatibleDC(rHDC);
OpenClipboard(0);
HG:=GetClipboardData(CF_METAFILEPICT);
pMFP := GlobalLock(HG);
SetMapMode(mhdc, pmfp^.mm);
if (pmfp^.mm=MM_ISOTROPIC)or(pmfp^.mm=MM_ANISOTROPIC)and(pmfp^.xExt>0)then
Begin
xWidth:=Integer(Round(pmfp^.xExt * GetDeviceCaps(mhdc, HORZRES) /
GetDeviceCaps(mhdc, HORZSIZE) / 100));
yWidth:=Integer(Round(pmfp^.yExt * GetDeviceCaps(mhdc, VERTRES) /
GetDeviceCaps(mhdc, VERTSIZE) /100));
hBitmap:=CreateCompatibleBitmap(rHDC,xWidth,yWidth);
LastObj:=SelectObject(mHDC,hBitmap);
SetViewportExtEx(mhdc,xWidth,yWidth,Nil);
PlayMetaFile(mHDC,pMFP^.hMF);
SelectObject(mHDC,LastObj);
SetClipboardData(CF_BITMAP,hBitmap);
End;
GlobalUnlock(HG);
CloseClipboard();
DeleteDC(mHDC);
ReleaseDC(0,rHDC);
End;
End;
Function SaveClipboardBitMapImageToJPEGFile(Quality:LongInt;FileName:PChar):
LongInt;stdcall;
var
jp: TJPEGImage;
tp: TPicture;
Begin
CheckForMetaFile;
Result:=ERROR_SUCCESS;
try
tp:=TPicture.Create;
try
tp.RegisterClipboardFormat(cf_BitMap,TBitMap);
tp.LoadFromClipboardFormat(cf_bitmap,ClipBoard.GetAsHandle(cf_Bitmap),0);
try
jp := TJPEGImage.Create;
try
jp.CompressionQuality := Quality;
jp.Assign(tp.Bitmap);
jp.Compress;
try
jp.SaveToFile(FileName);
except
Result:=ERROR_FILE_NOT_FOUND;
end;
except
Result:=ERROR_OUTOFMEMORY;
end;
jp.Free;
except
Result:=ERROR_OUTOFMEMORY;
end;
tp.UnregisterGraphicClass(TBitMap);
except
Result:=ERROR_OUTOFMEMORY;
end;
tp.Free;
except
Result:=ERROR_OUTOFMEMORY;
end;
end;
exports
SaveClipboardBitMapImageToJPEGFile;
end.
_Dragon (2004-10-22 23:40:00) [3]ну понятно, что через OLE! А каким способом это сделать?
ИМХО (2004-10-22 07:26:00) [4]используя OLE-автоматизацию (коллекция Shapes)