用Flex調用SWF查看PDF

  有時候一些資料只能給別人看,如可打印的文檔如DOC,PDF,但不能讓其他無權限的人另存或者打印,特別是web版的文件管理類的系統,總會考慮到這個問題。當用IE直接打開pdf的時候,儘管可以疲敝IE的另存爲,但是點擊PDF文件的時候,再按F8的時候,PDF的閱讀器如(adobereader)會顯示ToolsBar,所以直接打開pdf貌似行不同(目前所知道的)。當時一聽到這個需求立馬就想用swing(因爲我只懂一些swing),把pdf轉換成圖片,然後每一頁對應一張圖片顯示,但是馬上給否定了,第一轉換出來的圖片不清晰(我目前所瞭解的)而且這圖片放大縮小的效果也不好看,第二不想花時間和別人去爭論swing慢的問題。

         剛巧進一家新公司沒什麼任務,在看flex,就想能不能把PDF轉換成swf呢?好,馬上google,結果還真找到有這麼好的東東SWFTOOLS,這款東西是老外用c寫的,還是開源的,夠強!它有很多功能包括PDF2SWF,SWFCombine,SWFStrings,SWFDump,JPEG2SWF,PNG2SWF,GIF2SWF,WAV2SWF,AVI2SWF,Font2SWF。在這裏我們只需要PDF2SWF,關於PDF2SWF的命令大家可以查看他的幫助documentation,E文不好的可以看如何將PDF轉換成SWF》,這個東西是把pdf的每一頁轉換成swf的每一幀,這樣的話又可以很好的解決翻頁功能。安裝好就可以用來測試了。然後用cmd進入到安裝的目錄下,隨便找一份pdf進行測試,如下:

圖片中“-o”的那個參數就是指點生成的swf的名稱和路徑,這樣就能轉成swf,而且非常清晰和pdf無異,簡單吧~

         整合在java裏面也簡單,只要一個用Runtime.getRuntime().exec()就行,如下:

package kissjava.pdf;
/** *//**
*
@author kissjava;
*/


import java.io.IOException;

public class PDFToSWF {
    
public static void main(String[] args) throws IOException{
         Process process
= Runtime.getRuntime().exec("d://Program Files//SWFTools//pdf2swf.exe -o /"e://test.swf/"   -t /"e://flexBinding.pdf/"");
         System.out.println(
"sucess!!!");
     }

}


這樣等生成了swf,就發個通知告訴客戶端可以調用這個swf。
但是當寫好mxml後卻bug一大堆,下面是flex程序初始化的一個函數:

private function init():void{
                
var mc:MovieClip = swfload.content as MovieClip;
                 mc.gotoAndStop(
1);
                
var myContextMenu : ContextMenu = new ContextMenu();
                   myContextMenu.hideBuiltInItems();
                  
this.contextMenu = myContextMenu;                
                
//swfload.addEventListener(MouseEvent.MOUSE_DOWN,mouseDown);
                //swfload.addEventListener(MouseEvent.MOUSE_UP,mouseUp);
             }


卻發現mc爲null,怎麼可能呢?用別人用flash寫的swf,明明是可以通訊的,debug進去,發現swfload.content 是AVM1Movie,這東西是個老東西是as2的,他和MovieClip是不來電的,而且用反編譯的查看這個生成的swf,它顯示的版本居然是flash6,天啊,這麼老的版本,要想和flash9通訊很困難,找了很多資料,都說很複雜。但是這款最新下載的工具更新的時間明明是2008-09-22,沒道理不支持flash9啊,可是它的幫助文檔卻沒設置flash版本這方面的參數說明,苦悶了很久,抱着試試的態度去看了下他的源碼(我很怕C哈),結果裏面果然有蹊蹺,居然有指定flash版本的參數,它爲什麼不在文檔裏說明呢??

把上面生成swf語句改成如下:

Process process = Runtime.getRuntime().exec("f://Program Files//SWFTools//pdf2swf.exe -o /"e://test.swf/" -s flashversion=9 /"e://flexBinding.pdf/"");


再運行flex,ok,跑的爽。測試效果如下:

 

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章