線上訂房服務-台灣趴趴狗聯合訂房中心
發文 回覆 瀏覽次數:5344
推到 Plurk!
推到 Facebook!

寻找把word,excel转成位图的方法

答題得分者是:pceyes
thanmail
一般會員


發表:4
回覆:20
積分:14
註冊:2004-12-16

發送簡訊給我
#1 引用回覆 回覆 發表時間:2008-12-09 11:44:51 IP:218.69.xxx.xxx 訂閱
我的应用程序要能够浏览word,excel文件。

不需要编辑或者选择拷贝。

因为还有一个要求是能够把整个页面反色显示(就是黑的变白的,白的变黑的),

因此我要把word,excel文件转成位图处理,

转成位图的方法我在网上找不到,

用olecontainer的方法,pceyes已经给了一份,在这里再次感谢他。

但是因为olecontainer的方法特别慢,

因此我想询问一下是否还有更好的方法。

我尝试过的其他方法有:
1.先转成html,再转成位图。
缺点是excel转成html,格式会乱。
2.先转成pdf,再转成位图。
缺点是word可以另存为pdf,而excel必须打印成pdf。
而且客户机器上不一定安装pdf打印机。
3.全屏word,excel文件,然后拷贝屏幕。
缺点是用户会看到抓屏过程,而且对于excel来说,
很难确定,右边和底边的边界。

希望有人能提供更好地办法!
pceyes
尊榮會員


發表:70
回覆:657
積分:1140
註冊:2003-03-13

發送簡訊給我
#2 引用回覆 回覆 發表時間:2008-12-09 13:03:39 IP:220.141.xxx.xxx 訂閱
我是沒什麼好方法啦,反正開全螢幕,然後抓畫面,再多加上之前的
跳轉到下一頁方法,就勉強達到你的要求。
如何能取得ole打开对象的页数,并能跳转。
http://delphi.ktop.com.tw/board.php?cid=30&fid=69&tid=96382

以下是開全螢幕的方法
[code delphi]
// 開啟Ms Word 程序
WordApp:= GetActiveoleObject('Word.Application');

// 顯示Word
WordApp.Application.Visible := true;

if OpenDialog1.Execute then begin
Doc :=Documents.Open(OpenDialog1.FileName,vLink, vReadOnly);

// 模擬 WPS 界面
WordApplication1.CommandBars.Item[1].Set_Visible(false);
wordapp.ActiveWindow.View.FullScreen := true;
WordApp.CommandBars['Full Screen'].Visible := false;
wordapp.ActiveWindow.DisplayHorizontalScrollBar := False;
wordapp.ActiveWindow.DisplayVerticalScrollBar := False;


[/code]
------
努力會更接近成功
thanmail
一般會員


發表:4
回覆:20
積分:14
註冊:2004-12-16

發送簡訊給我
#3 引用回覆 回覆 發表時間:2008-12-09 20:25:59 IP:218.69.xxx.xxx 訂閱
感谢pceyes!

目前发现这种抓屏的方法的问题是:
1.如果全屏拷贝,要去掉内容之外的边框和空白部分,这点很难控制。

2.如果拷贝内容,copy 或者 copyaspicture,
考下来的位图,只有第一页内容。

经过测试发现,全选拷贝word文档里的全部内容,然后复制,
然后粘贴在画板上,也是只有第一页。
即使跳转到下一页,也不行。

现在看来想要通过拷贝的方式抓内容,
则要解决如何能跳转到某一页,并且只选中当前页的全部内容。

感谢pceyes!
編輯記錄
thanmail 重新編輯於 2008-12-09 20:29:09, 註解 無‧
pceyes
尊榮會員


發表:70
回覆:657
積分:1140
註冊:2003-03-13

發送簡訊給我
#4 引用回覆 回覆 發表時間:2008-12-09 21:51:36 IP:220.141.xxx.xxx 訂閱
我是有些疑問
1. 已知總頁數。
如何能取得ole打开对象的页数,并能跳转。
i := doc.Range.Information[$00000004]; // wdNumberOfPagesInDocument
2. 已能依所要的轉換到某一頁。
如何能取得ole打开对象的页数,并能跳转。
WordApp
.Selection.GoTo(What:=wdGoToPage, Which:=wdGoToNext, Name:=2);
3. 已能抓取目前所在頁的畫面。
如何在程式運行中自動執行 Alt PrintScreen 並且存檔
4. 可以處理剪貼簿的方法。
關於rxRichedit存成的RTF檔
5.
用迴圈的方式,難道沒辦法取得單檔多頁的畫面嗎?
6. 還是你要的是將比如4頁的資料,要合成一張圖?
------
努力會更接近成功
編輯記錄
pceyes 重新編輯於 2008-12-09 22:10:24, 註解 無‧
pceyes 重新編輯於 2008-12-09 22:16:37, 註解 無‧
thanmail
一般會員


發表:4
回覆:20
積分:14
註冊:2004-12-16

發送簡訊給我
#5 引用回覆 回覆 發表時間:2008-12-10 09:15:52 IP:218.69.xxx.xxx 訂閱
pceyes 您好,
1.您说的第三步,我理解的就是全屏拷贝,这样的话要去掉多余的部分,
比如工具栏,状态栏,即使通过ole使word全屏显示,word还会显示多余一页的部分,
还有一个关掉全屏显示的按钮,
我需要在通过处理位图才能去掉这些多余的部分,这很难办到。

2.您说的第四步,我理解的就是copy或者copyaspicture,
通过这种办法只能复制到剪贴板第一页的内容,
即使通过您提供的
WordApp.Selection.GoTo(What:=wdGoToPage, Which:=wdGoToNext, Name:=2
);
方法,
仍然只能复制第一页的内容,
除非“只复制word当前的页的内容”,
但是这个方法目前我还不知道,
也没查到。

两种方法都不理想。

編輯記錄
thanmail 重新編輯於 2008-12-10 09:17:51, 註解 無‧
pceyes
尊榮會員


發表:70
回覆:657
積分:1140
註冊:2003-03-13

發送簡訊給我
#6 引用回覆 回覆 發表時間:2008-12-10 09:54:21 IP:122.118.xxx.xxx 訂閱
我想你根本沒有試,我所回的東西都已達到你的目的,但因為你沒有試,所以只是一直說不行。
===================引 用 thanmail 文 章===================
pceyes 您好,
您说的第三步,我理解的就是全屏拷贝,这样的话要去掉多余的部分,
比如工具栏,状态栏,即使通过ole使word全屏显示,word还会显示多余一页的部分,
还有一个关掉全屏显示的按钮,
我需要在通过处理位图才能去掉这些多余的部分,这很难办到。
下面這段並沒你說的問題呀!畫面上只有文件,沒有多余的東西,也沒有按鈕,不知你有沒有試過。
[code delphi]
// 模擬 WPS 界面
WordApplication1.CommandBars.Item[1].Set_Visible(false);
wordapp.ActiveWindow.View.FullScreen := true;
WordApp.CommandBars['Full Screen'].Visible := false;
wordapp.ActiveWindow.DisplayHorizontalScrollBar := False;
wordapp.ActiveWindow.DisplayVerticalScrollBar := False;
[/code]

您说的第四步,我理解的就是copy或者copyaspicture,
通过这种办法只能复制到剪贴板第一页的内容,
即使通过您提供的
WordApp.Selection.GoTo(What:=wdGoToPage, Which:=wdGoToNext, Name:=2
);
上面這行的Name:=第二頁,然後設Name:=第三頁...不知你有沒有試過,弄個迴圈就好了。
方法,
仍然只能复制第一页的内容,
除非“只复制word当前的页的内容”,
但是这个方法目前我还不知道,
也没查到。

两种方法都不理想。

------
努力會更接近成功
編輯記錄
pceyes 重新編輯於 2008-12-10 09:55:00, 註解 無‧
thanmail
一般會員


發表:4
回覆:20
積分:14
註冊:2004-12-16

發送簡訊給我
#7 引用回覆 回覆 發表時間:2008-12-10 10:19:58 IP:218.69.xxx.xxx 訂閱
pceyes您好,

我是试过了您说的代码的。

procedure TForm1.BitBtn4Click(Sender: TObject);
var
WordApp, Doc: OleVariant;
begin
Ole1.CreateObjectFromFile('d:\2.doc',true);
Ole1.DoVerb(ovShow);WordApp := Ole1.OleObject.application;
// 模擬 WPS 界面
//WordApp.CommandBars.Item[1].Set_Visible(false);//这句在我的机器上不能用,可能是因为我的系统装的是office2007
wordapp.ActiveWindow.View.FullScreen := true;
WordApp.CommandBars['Full Screen'].Visible := false;
wordapp.ActiveWindow.DisplayHorizontalScrollBar := False;
wordapp.ActiveWindow.DisplayVerticalScrollBar := False;
end;

全屏之后出来的则是word文档的内容,
页面上还有多余的内容是:
1。flashget的下载框,客户的机器上可能还有迅雷等浮动的下载框。
2。搜狗输入法的浮动框。
3。系统下边的状态栏(就是带开始菜单的系统systray那栏)
4。客户的机器上可能还安装有别的置前台的应用程序。
5。word显示的文档内容多余一页(第二页内容的开头),这样我翻页拷贝下来的内容,
每页都有多余的部分, 我还要将多余的部分除去才行,这很难办。
上述的1-4的内容多数可以通过建立第二desktop的方法勉强解决。
5的内容实在不好办,我的目标是不能有多余的内容部分。
6。那个关掉全屏显示的按钮,我是在别人的机器上试的,
他的机器是office2003,我是直接代开office2003,全屏试验的。
刚才把exe拷过去执行了一下,确实没有那个关掉全屏显示的按钮。
这里是我的粗心,向您道歉!

所以我觉得全屏拷贝的方法不好,想找其他的办法尝试。

感谢pceyes!

編輯記錄
thanmail 重新編輯於 2008-12-10 10:28:48, 註解 無‧
thanmail
一般會員


發表:4
回覆:20
積分:14
註冊:2004-12-16

發送簡訊給我
#8 引用回覆 回覆 發表時間:2008-12-10 15:38:59 IP:218.69.xxx.xxx 訂閱
pceyes您好,

在您的指点下,我已经可以完成了word存成位图的功能

pages := WordApp.ActiveDocument.Range.Information[$00000004]; // wdNumberOfPagesInDocument
for I := 1 to pages-1 do
begin
WordApp.selection.homekey(6); //Ctrl Home;
WordApp.browser.next; //Next Page;
WordApp.selection.Moveleft(1); //MoveLeft
WordApp.selection.homekey(6,1); //Ctrl Shift Home
WordApp.selection.CopyAsPicture; //copy
//位图抓取
////////创建图像对象接收剪切板中图片,进行保存
bmp := TMetaFile.Create;
bmp.Assign(ClipBoard);
bmp.SaveToFile('d:\word' inttostr(i) '.bmp');
bmp.free;

WordApp.selection.Cut; //cut
end;

WordApp.selection.WholeStory;
WordApp.selection.CopyAsPicture;
bmp := TMetaFile.Create;
bmp.Assign(ClipBoard);
bmp.SaveToFile('d:\word' inttostr(i) '.bmp');
bmp.free;

一会儿还要再继续excel转图功能。

感谢 pceyes!

編輯記錄
thanmail 重新編輯於 2008-12-10 15:55:33, 註解 無‧
thanmail 重新編輯於 2008-12-10 15:57:43, 註解 無‧
thanmail 重新編輯於 2008-12-10 16:00:30, 註解 無‧
pceyes
尊榮會員


發表:70
回覆:657
積分:1140
註冊:2003-03-13

發送簡訊給我
#9 引用回覆 回覆 發表時間:2008-12-10 16:51:00 IP:220.141.xxx.xxx 訂閱
抱歉!我太沖了,其實自己也沒認真測,換頁功能是有,但前頁會留半頁在畫面上,至今才回您,是因為一直在網上找,而網上問Word轉圖的多回答的人少。

以下這篇比較接近,因為word的文件可以貼在Richedit上面,除了內含的圖片外。
它的原理是將元件畫面直接轉成圖。

請問如何轉換 RichEdit 成 Bitmap ?
http://delphi.ktop.com.tw/board.php?cid=30&fid=69&tid=85337
我有想過這篇,既然網頁都可以轉成圖,但問題是word就算轉出來,連續的圖也不是你要的。
網頁快照(Full SourceCode)
http://delphi.ktop.com.tw/board.php?cid=31&fid=79&tid=95813
------
努力會更接近成功
pceyes
尊榮會員


發表:70
回覆:657
積分:1140
註冊:2003-03-13

發送簡訊給我
#10 引用回覆 回覆 發表時間:2008-12-10 17:10:39 IP:220.141.xxx.xxx 訂閱
自嘆不如,真的是努力會接近成功,我已放棄了,但你因再次努力,結果成功了,恭喜恭喜!CopyASPicture CopyAsPicture CopyAsPicture CopyAsPicture CopyAsPicture CopyAsPicture CopyAsPicture CopyAsPicture CopyAsPicture CopyAsPicture CopyAsPicture CopyAsPicture CopyAsPicture....唉,終於可以關機休息了。
------
努力會更接近成功
thanmail
一般會員


發表:4
回覆:20
積分:14
註冊:2004-12-16

發送簡訊給我
#11 引用回覆 回覆 發表時間:2008-12-10 17:20:49 IP:218.69.xxx.xxx 訂閱
感谢pceyes!

您提供的richedit抓图和html抓图的帖子,

我粗略的看了一下(时间太紧,有时间仔细看)。

word转成rtf格式后,原有格式会较大幅度失真。

word抓成html格式后,格式损失不大,这个方法应该可以采用。

不过目前还没有人能对带有框架的网页抓图。

(excel转成的html格式大部分都是框架网页,)

(word转成的html格式好像都是框架网页。)

我有时间再把word转成html,再抓图试试。

目前还是得研究怎么把Excel处理成图形。

另,

我取得的一点成果都是来自与您的指点和

互联网上大家的帮助,在此谢谢您和无形中帮助我的每一个人!

感谢pceyes!感谢大家!
RootKit
資深會員


發表:16
回覆:358
積分:419
註冊:2008-01-02

發送簡訊給我
#12 引用回覆 回覆 發表時間:2008-12-10 23:47:04 IP:122.126.xxx.xxx 訂閱
插花

使用剪貼簿,可能有些格式是無法正常顯示。而且非正統方式。

建議仍然走 Ole 路線,以WebBowser開啟文件畫面上不會有雜七雜八工具列等。
計算大小也很簡單讀取該 Document 的文件大小。按照比率。剩下的範圍就是不要的。
對照 Document 內容就知道了。
thanmail
一般會員


發表:4
回覆:20
積分:14
註冊:2004-12-16

發送簡訊給我
#13 引用回覆 回覆 發表時間:2008-12-11 09:24:23 IP:218.69.xxx.xxx 訂閱
RooKit您好,我尝试了您说的路线。

我的WebBowser,打开html没问题,

但是打开word ,execel文件,

不知道为什么,文件会在窗口外打开,

我把ThreadMode改为True也不行。

其他都是默认值。

也许是因为我安装了office2007?



===================引 用 RootKit 文 章===================
插花

使用剪貼簿,可能有些格式是無法正常顯示。而且非正統方式。

建議仍然走 Ole 路線,以WebBowser開啟文件畫面上不會有雜七雜八工具列等。
計算大小也很簡單讀取該 Document 的文件大小。按照比率。剩下的範圍就是不要的。
對照 Document 內容就知道了。
RootKit
資深會員


發表:16
回覆:358
積分:419
註冊:2008-01-02

發送簡訊給我
#14 引用回覆 回覆 發表時間:2008-12-11 11:03:03 IP:61.222.xxx.xxx 訂閱
前言:上一次答覆,可能跟  IE 版本有關。

另一種我覺得最方便直覺的方法:

利用 ActiveX 接口擷取快照,可透過 IOleDocument 取得本文。
再利用 OleDraw (或IViewObject) 可繪至 Bitmap.Canvas.Handle 上。
這樣一來,整頁印出至 Bitmap上,單純乾淨也不會有邊匡及其他東東。
僅需將 TOleContainer 搬至偏遠地帶,不讓User 看到暗箱作業。
thanmail
一般會員


發表:4
回覆:20
積分:14
註冊:2004-12-16

發送簡訊給我
#15 引用回覆 回覆 發表時間:2008-12-11 11:11:45 IP:218.69.xxx.xxx 訂閱
谢谢Rookit的关注!

我曾经查阅过OleContainer 的源码,

OleDraw (或IViewObject) 似乎不能Draw出第二页的内容,

只能画第一页。

我发问之前最早试的是这个办法,但是我没有成功,可能是我对Ole了解的不够深入!

不知道谁能也尝试实现TOleContainer 显示Ole的第二页内容!


===================引 用 RootKit 文 章===================
前言:上一次答覆,可能跟 IE 版本有關。

另一種我覺得最方便直覺的方法:

利用 ActiveX 接口擷取快照,可透過 IOleDocument 取得本文。
再利用 OleDraw (或IViewObject) 可繪至 Bitmap.Canvas.Handle 上。
這樣一來,整頁印出至 Bitmap上,單純乾淨也不會有邊匡及其他東東。
僅需將 TOleContainer 搬至偏遠地帶,不讓User 看到暗箱作業。
pceyes
尊榮會員


發表:70
回覆:657
積分:1140
註冊:2003-03-13

發送簡訊給我
#16 引用回覆 回覆 發表時間:2008-12-11 11:51:55 IP:122.118.xxx.xxx 訂閱

[code delphi]
procedure TForm1.Button3Click(Sender: TObject);
var WordApp: variant;
begin
WordApp:=olecontainer1.oleobject.application ;
WordApp.browser.next; // 下一頁
end;

procedure TForm1.Button4Click(Sender: TObject);
var WordApp: variant;
begin
WordApp:=olecontainer1.oleobject.application ;
WordApp.browser.Previous; // 上一頁
end;

[/code]
------
努力會更接近成功
thanmail
一般會員


發表:4
回覆:20
積分:14
註冊:2004-12-16

發送簡訊給我
#17 引用回覆 回覆 發表時間:2008-12-11 12:10:44 IP:218.69.xxx.xxx 訂閱
感谢pceyes,您提供的方法必须是激活olecontainer1里的对象后,才能使用。

这已经不是Rookit所说的擷取快照,使用OleDraw (或IViewObject) 的方法了。

我理解的
Rookit所说的方法是:

1。在设计期,右键点击Olecontainer,然后点“Insert Object”,
或者
2。在执行期,调用InsertObjectDialog,插入对象后,

这两中情况下才会擷取快照,并调用
OleDraw (或IViewObject) 。

如果激活olecontainer1里的对象后,已经不是OleDraw在起作用了,

是对象的自身的paint等方法在起作用。

不知道我说的对不对。



===================引 用 pceyes 文 章===================

[code delphi]
procedure TForm1.Button3Click(Sender: TObject);
var WordApp: variant;
begin
WordApp:=olecontainer1.oleobject.application ;
WordApp.browser.next; // 下一頁
end;

procedure TForm1.Button4Click(Sender: TObject);
var WordApp: variant;
begin
WordApp:=olecontainer1.oleobject.application ;
WordApp.browser.Previous; // 上一頁
end;

[/code]
系統時間:2024-04-19 17:02:26
聯絡我們 | Delphi K.Top討論版
本站聲明
1. 本論壇為無營利行為之開放平台,所有文章都是由網友自行張貼,如牽涉到法律糾紛一切與本站無關。
2. 假如網友發表之內容涉及侵權,而損及您的利益,請立即通知版主刪除。
3. 請勿批評中華民國元首及政府或批評各政黨,是藍是綠本站無權干涉,但這裡不是政治性論壇!