delphi如何提取word中的图片到数据库中

解决方案 »

  1.   

     用image字段保存这些文档。 
    var 
    word_stream: TMemoryStream; 
    filename: string; 
    begin 
    if odgDoc.Execute then//odgDoc:OpenDialog 
    begin 
    filename := ExtractFileName(odgDoc.FileName); 
    word_stream := TMemoryStream.Create; 
    word_stream.LoadFromFile(odgDoc.FileName); 
    word_stream.Position := 0; 
    cdsPACT.Append 
    cdsPACT.FieldByName('DocName').Value := filename; 
    TBlobField(cdsPACT.FieldByName('PactText')).LoadFromStream(word_stream); 
    cdsPACT.Post; 
    word_stream.Free; 
    end; 
    end;---- 目前,Delphi被越来越多的人选中作为MIS系统开发中的前台工具。在以Delphi为前台,一些大型数据库为后台的MIS系统中,图形的处理不可避 免;即从以Delphi开发的前台界面输入图形,并保存到相应的数据库字段中。在这种形式的图形处理中,BMP文件的处理比较简单,因为Delphi本身 有Image和DBImage构件,用这些构件与数据库中可以保存图形的大型字段BLOB比较容易地进行数据交换。以这种方式进行图形处理已应用在许多 MIS软件中,包括处理人员照片的人事档案系统等。 
    ---- 但是,BMP文件一般都比较大。而且有时要录入的是自己在计算机上画的简图,并伴随大量文字说明。这种情况用Win95中的画图板等处理BMP文件的工具 处理就比较困难。一般应用人员都喜欢用WORD画图和写说明文字,然后保存到数据库中。 
    ---- 经过一段时间的摸索,我们解决了这个问题,并经过完善,在应用中运行较好。程序如下: 
    procedure TsampleForm.OpenDOCClick(Sender: TObject); 
    var 
    MemSize: Integer; 
    Buffer: PChar; 
    Myfile: TFileStream; 
    Stream: TBlobStream; 
    begin 
    OpenDialog1.Filter:='WORD文档(*.DOC)|*.DOC';{从对话窗选择文件} 
    if OpenDialog1.Execute then 
    begin 
    Myfile:=TFileStream.Create(OpenDialog1.FileName,fmOpenRead); 
    with table1 do {‘table1’为含BLOB字段的表名} 
    begin 
    Open; 
    Edit; 
    Stream := TBlobStream.Create(FieldByName('Doc') as TBlobField, bmWrite);{‘Doc’为BLOB字段名} 
    MemSize := MyFile.Size; 
    Inc(MemSize); {Make room for the buffer's null terminator.} 
    Buffer := AllocMem(MemSize); {Allocate the memory.} 
    try 
    Stream.Seek(0, soFromBeginning); {Seek 0 bytes from the stream's end point} 
    MyFile.Read(Buffer^,MemSize); 
    Stream.Write(Buffer^,MemSize); 
    finally 
    MyFile.Free; 
    Stream.Free; 
    end; 
    try 
    Post; 
    except 
    on E: EDatabaseError do 
    if HandelException(E)< >0 then 
    exit 
    else 
    raise; 
    end; 
    end; 
    Doc_ole.CreateObjectFromFile(OpenDialog1.FileName,False); 
    Doc_ole.Run;{Doc_ole为ToleContainer构件名} 
    end; 
    end; ---- 以上为向数据库中写入的程序,应用中从对话窗取出文件在ToleContainer构件中显示的同时存入数据库。 
    procedure TsampleForm.GetDocClick(Sender: TObject); 
    var 
    MemSize: Integer; 
    Buffer: PChar; 
    Myfile: TFileStream; 
    Stream: TBlobStream; 
    begin 
    Myfile:=TFileStream.Create('c:\temp.tmp',fmCreate); 
    with Query1 do 
    begin 
    Stream := TBlobStream.Create(FieldByName('Doc') as TBlobField, bmRead); 
    MemSize := Stream.Size; 
    Inc(MemSize); {Make room for the buffer's null terminator.} 
    Buffer := AllocMem(MemSize); {Allocate the memory.} 
    try 
    Stream.Read(Buffer^,MemSize); 
    MyFile.Write(Buffer^,MemSize); 
    finally 
    MyFile.Free; 
    Stream.Free; 
    end; 
    end; 
    if FileExists('c:\temp.DOC') then 
    DeleteFile('c:\temp.DOC'); 
    if FileExists('c:\temp.tmp') then 
    begin 
    RenameFile('c:\temp.tmp', 'c:\temp.DOC'); 
    Doc_ole.CreateObjectFromFile('c:\temp.DOC',False); 
    Doc_ole.Run; 
    end; 
    end; 
    ---- 以上程序为从数据库从将WORD文档取出,并放在temp.doc的临时文件上并在ToleContainer构件中显示。 
    ---- 在程序的其他部份应准确控制表记录指针,使WORD文档的存取发生在正确的记录位置。本文来自CSDN博客,转载请标明出处:http://blog.csdn.net/lee576/archive/2008/02/22/2113578.aspx