最近在寫一個東西,裡面牽涉到了嵌入word的功能,打開word,得到word的文檔結構圖,實現Word中
文檔結構圖類似的功能(跳轉到當前標題),還有把Word轉換成PDF,最後把PDF文件Base64加密變成字符串存儲在XML中。
(1)由於要嵌入到程序中,所以用到了oleContianer,但是這個東西用起來真是有一番曲折,開始的時候打開文件直接用CreateObjectFromFile,但是在某些情況下(文件有一些修改存檔)有的文件打開會有問題,具體原因不明,經過多方嘗試,終於解決這個問題,方案就是從流中把文件讀到olecontianer,完整的方法如下:
type
//流Header的結構
TStreamHeader = record
Signature: Integer; //$434F4442
DrawASPect: Integer; //1
DataSize: Integer; //stream.size;
end;
procedure LoadFromFile(const AFileName: string; Container: TOleContainer);
var
Header : TStreamHeader;
oMemoryStream : TMemoryStream;
oFileStream: TFileStream;
begin
oFileStream := TFileStream.Create(AFileName, fmShareDenyNone);
oMemoryStream := TMemoryStream.Create;
try
with Header do
begin
Signature := $434F4442;
DrawASPect := 1;
DataSize := oFileStream.Size;
end;
oFileStream.Position := 0;
oMemoryStream.WriteBuffer(Header,SizeOf(Header));
oMemoryStream.CopyFrom(oFileStream, 0);
oMemoryStream.Position := 0;
Container.LoadFromStream(oMemoryStream);
finally
oMemoryStream.Free;
oFileStream.Free;
end;
end;
這裡要注意的就是olecontainer要求的流結構比普通的流多一個Header,要加上這個Header才可以!
(2)加載以後,由於olecontianer本身並沒有對word的相關操作,那麼我們需要操作Word,應該怎麼辦?一種辦法就是使用Delphi中提供的TWordApplication,代碼大概如下:
WordApplication.Connect或者
WordApplication.ConnectTo(IDispatch(OleContainer.OleObject.Application) as _Application)
我開始的時候就是用這個,但是後來在一台機器上出現問題了,這台機器以前裝過word2000,現在裝的word2003,跑這個程序就有問題了,總是在上面那行代碼出錯''Interface not Supported'',我是想了很多辦法,都沒有搞定,比如可能是word版本的問題,於是就是Word重新卸載,把Office相關的注冊表全部刪除,重新安裝Office,還是沒有用;又把Delphi重新安裝,Delphi安裝的時候要選擇Office版本,我是XP和2000的都交叉的試過了,還是不行;然後又上網狂搜索,可惜網上針對我這個問題的信息不多。