寻找把word,excel转成位图的方法 |
答題得分者是:pceyes
|
thanmail
一般會員 發表:4 回覆:20 積分:14 註冊:2004-12-16 發送簡訊給我 |
我的应用程序要能够浏览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 發送簡訊給我 |
我是沒什麼好方法啦,反正開全螢幕,然後抓畫面,再多加上之前的
跳轉到下一頁方法,就勉強達到你的要求。 如何能取得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 發送簡訊給我 |
感谢pceyes!
目前发现这种抓屏的方法的问题是: 1.如果全屏拷贝,要去掉内容之外的边框和空白部分,这点很难控制。 2.如果拷贝内容,copy 或者 copyaspicture, 考下来的位图,只有第一页内容。 经过测试发现,全选拷贝word文档里的全部内容,然后复制, 然后粘贴在画板上,也是只有第一页。 即使跳转到下一页,也不行。 现在看来想要通过拷贝的方式抓内容, 则要解决如何能跳转到某一页,并且只选中当前页的全部内容。 感谢pceyes!
編輯記錄
thanmail 重新編輯於 2008-12-09 20:29:09, 註解 無‧
|
pceyes
尊榮會員 發表:70 回覆:657 積分:1140 註冊:2003-03-13 發送簡訊給我 |
我是有些疑問
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頁的資料,要合成一張圖?
------
努力會更接近成功 |
thanmail
一般會員 發表:4 回覆:20 積分:14 註冊:2004-12-16 發送簡訊給我 |
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 發送簡訊給我 |
我想你根本沒有試,我所回的東西都已達到你的目的,但因為你沒有試,所以只是一直說不行。
===================引 用 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 發送簡訊給我 |
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 發送簡訊給我 |
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! |
pceyes
尊榮會員 發表:70 回覆:657 積分:1140 註冊:2003-03-13 發送簡訊給我 |
抱歉!我太沖了,其實自己也沒認真測,換頁功能是有,但前頁會留半頁在畫面上,至今才回您,是因為一直在網上找,而網上問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 發送簡訊給我 |
自嘆不如,真的是努力會接近成功,我已放棄了,但你因再次努力,結果成功了,恭喜恭喜!CopyASPicture CopyAsPicture CopyAsPicture CopyAsPicture CopyAsPicture CopyAsPicture CopyAsPicture CopyAsPicture CopyAsPicture CopyAsPicture CopyAsPicture CopyAsPicture CopyAsPicture....唉,終於可以關機休息了。
------
努力會更接近成功 |
thanmail
一般會員 發表:4 回覆:20 積分:14 註冊:2004-12-16 發送簡訊給我 |
感谢pceyes!
您提供的richedit抓图和html抓图的帖子, 我粗略的看了一下(时间太紧,有时间仔细看)。 word转成rtf格式后,原有格式会较大幅度失真。 word抓成html格式后,格式损失不大,这个方法应该可以采用。 不过目前还没有人能对带有框架的网页抓图。 (excel转成的html格式大部分都是框架网页,) (word转成的html格式好像都是框架网页。) 我有时间再把word转成html,再抓图试试。 目前还是得研究怎么把Excel处理成图形。 另, 我取得的一点成果都是来自与您的指点和 互联网上大家的帮助,在此谢谢您和无形中帮助我的每一个人! 感谢pceyes!感谢大家! |
RootKit
資深會員 發表:16 回覆:358 積分:419 註冊:2008-01-02 發送簡訊給我 |
|
thanmail
一般會員 發表:4 回覆:20 積分:14 註冊:2004-12-16 發送簡訊給我 |
RooKit您好,我尝试了您说的路线。
我的WebBowser,打开html没问题, 但是打开word ,execel文件, 不知道为什么,文件会在窗口外打开, 我把ThreadMode改为True也不行。 其他都是默认值。 也许是因为我安装了office2007? ===================引 用 RootKit 文 章=================== 插花 使用剪貼簿,可能有些格式是無法正常顯示。而且非正統方式。 建議仍然走 Ole 路線,以WebBowser開啟文件畫面上不會有雜七雜八工具列等。 計算大小也很簡單讀取該 Document 的文件大小。按照比率。剩下的範圍就是不要的。 對照 Document 內容就知道了。 |
RootKit
資深會員 發表:16 回覆:358 積分:419 註冊:2008-01-02 發送簡訊給我 |
|
thanmail
一般會員 發表:4 回覆:20 積分:14 註冊:2004-12-16 發送簡訊給我 |
谢谢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 發送簡訊給我 |
[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 發送簡訊給我 |
感谢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] |
本站聲明 |
1. 本論壇為無營利行為之開放平台,所有文章都是由網友自行張貼,如牽涉到法律糾紛一切與本站無關。 2. 假如網友發表之內容涉及侵權,而損及您的利益,請立即通知版主刪除。 3. 請勿批評中華民國元首及政府或批評各政黨,是藍是綠本站無權干涉,但這裡不是政治性論壇! |