PDF在線閱讀開發經驗(FlexPaper+SWFTools+SaveAsPDFandXPS)

轉載:http://www.wizzer.cn/?p=50

1、使用SaveAsPDFandXPS將office文檔轉換成PDF

http://www.microsoft.com/downloads/details.aspx?FamilyID=4d951911-3e7e-4ae6-b059-a2e79ed87041&displaylang=en

微軟原計劃讓Office 2007直接支持保存爲PDF格式,但引起了Adobe的不滿,並被指責爲壟斷,最終被迫放棄,改爲以插件的形式予以支持,插件大家都知道怎麼回事兒,默認不裝,要用你的自己找來裝上。不過微軟針對這件事情也做出了一個迴應:發佈XPS, XPS則是微軟自己利用XML技術開發的新型文檔格式。

該插件支持Office 2007的8個組件,包括Word、Excel、Access、PowerPoint、InfoPath、OneNote、Publisher和Visio。安裝插件後,用戶即可在上述組件中將相應文檔存儲爲PDF格式或XPS格式,還可以方便地將文檔保存爲PDF/XPS格式的E-mail附件。

2、下載 SWFTools

SWFTools 是一組用來處理 Flash 的 swf 文件的工具包,包括:

1. 合併工具 swfcombine
2. 抽取工具 swfextract
3. PDF/JPEG/PNG/AVI/TTF/WAV 到 SWF 的轉換工具 :pdf2swf, jpeg2swf, png2swf, avi2swf, font2swf, and wav2swf|
4. 文本解析工具 swfstrings
5. SWF 解析器 swfdump
6. SWF 讀寫庫 rfxswflib

其中把pdf轉成swf的工具就是pdf2swf了。在命令行中運行pdf2swf src.pdf des.swf一般能滿足需求。而命令行參數可以通過pdf2swf -f得到:

-h , –help Print short help message and exit 打印幫助信息
-V , –version Print version info and exit 打印版本號
-o , –output file.swf Direct output to file.swf. If file.swf contains ‘13568621′ (file13568630.swf), then each page指定輸出的swf文件名
-p , –pages range Convert only pages in range with range e.g. 1-20
or 1,4,6,9-11 or
指定轉換的頁面範圍,使用的頁碼描述方法與打印機打印文件時候的選頁一樣

-P , –password password Use password for deciphering the pdf.指定打開pdf的密碼
-v , –verbose Be verbose. Use more than one -v for greater effect.轉換時輸出詳細的內容
-z , –zlib Use Flash 6 (MX) zlib compression.使用Flash 6的zlib壓縮機制
-i , –ignore Allows pdf2swf to change the draw order of the pdf. This may make the generated允許程序修改pdf的繪製順序,可能會導致結果與原來有差異
-j , –jpegquality quality Set quality of embedded jpeg pictures to quality. 0 is worst (small), 100 is best (big). (default:85)設置轉換其中的jpeg圖片的質量,從0到100,默認值是85。
-s , –set param=value Set a SWF encoder specific parameter. See pdf2swf -s help for more information. 設置SWF轉碼時候的參數,具體參數可以用pdf2swf -s help獲取
-w , –samewindow When converting pdf hyperlinks, don’t make the links open a new window. 設置轉換後的swf打開原pdf中的連接時使用相同的窗口
-t , –stop Insert a stop() command in each page. 在每頁結尾添加一個stop()命令
-T , –flashversion num Set Flash Version in the SWF header to num. 設置SWF所使用的flash版本號
-F , –fontdir directory Add directory to the font search path. 指定字體文件所在路徑
-b , –defaultviewer Link a standard viewer to the swf file. 指定默認的swf導航文件,用來翻頁、放大縮小等等
-l , –defaultloader Link a standard preloader to the swf file which will be displayed while the main swf is loading. 指定默認的swf加載文件,用來顯示加載進程效果
-B , –viewer filename Link viewer filename to the swf file. 指定swf導航文件,作用同-b
-L , –preloader filename Link preloader filename to the swf file. 指定swf加載文件,作用同-l
-q , –quiet Suppress normal messages. Use -qq to suppress warnings, also. 不打印普通信息,用-qq就不打印警告信息。
-S , –shapes Don’t use SWF Fonts, but store everything as shape. 不使用字體,所有都轉爲形狀。
-f , –fonts Store full fonts in SWF. (Don’t reduce to used characters). 在swf中保存全部字體。
-G , –flatten Remove as many clip layers from file as possible. 在文件中儘量去除影片層,合併它們
-I , –info Don’t do actual conversion, just display a list of all pages in the PDF. 不做實際轉換,僅顯示PDF的信息。
-Q , –maxtime n Abort conversion after n seconds. Only available on Unix. 如果運行時間超時則退出。

3、java程序,實現上傳PDF自動轉換成SWF文件

01 //ajax方法,先解密傳過來的文件名,根據判斷生成SWF文件後跳轉至FLASH頁面
02  
03 if (ajaxAction.equals("exeflash"))   //把PDF成SWF
04         {
05             String fn = DecodeUtil.Decrypt(StringUtil.null2String(request.getParameter("fn")).trim()).toLowerCase();
06             try {
07                 if (!"".equals(fn) && fn.indexOf("/") > -1 && fn.indexOf(".pdf") > -1) {
08                     Map webfileupmap = (Map) Globals.SYS_UPLOAD_CONFIG.get("webfile");
09                     String webfilepath = StringUtil.null2String(webfileupmap.get("path")).replace("\\""\\\\");
10                     fn = fn.substring(fn.lastIndexOf("/") + 1);//aa.pdf
11                     webfilepath = webfilepath + fn;
12                     File f = new File(webfilepath);
13                     if (!f.exists()) {
14                         return "error";
15                         //如果PDF文件不存在則退出
16                     }
17                     Map webupmap = (Map) Globals.SYS_UPLOAD_CONFIG.get("web");
18                     String webpath = StringUtil.null2String(webupmap.get("path")).replace("\\""\\\\");
19                     String urlpath = StringUtil.null2String(webupmap.get("urlpath"));
20                     String wname = fn.substring(0, fn.indexOf(".")) + ".swf";
21                     webpath = webpath + wname;
22                     String wurl = urlpath + wname;
23                     boolean issc = false;
24                     File f2 = new File(webpath);
25                     if (!f2.exists()) {
26                         issc = true;
27                         //如果文件不存在則生成
28                     }
29                     if (issc) {
30                         String cmd = "C:\\SWFTools\\pdf2swf " + webfilepath + " -o " + webpath + " -T 9";
31                         if (StringUtil.executeCmdFlash(cmd) == false) {
32                             return "error";
33                         }
34                         System.out.println("cmd::::::" + cmd);
35                     }
36  
37                     File f1 = new File(webpath);
38                     if (f1.exists()) {
39                         ajaxstr = DecodeUtil.Encrypt(wurl);
40                     }
41  
42                 else {
43                     return "error";
44                 }
45             catch (Exception e) {
46                 Globals.Logger("發生錯誤:" + e, 2);
47             }
48  
49         }

注意:

String cmd = “C:\\SWFTools\\pdf2swf ” + webfilepath + ” -o ” + webpath + ” -T 9″;

加 “-T 9” 參數,設置輸出版本爲flash9,解決PDF文件只有一頁,生成的swf不能播放的問題。

另外,若PDF內表格元素過多,在轉換時會拋出一堆異常錯誤。似乎還沒有好的解決辦法?

01 //java調用cmd命令行方法
02  
03 /**
04      * 運行可執行文件
05      *
06      * @param cmd
07      * @return String
08      */
09     public static synchronized boolean executeCmdFlash(String cmd) {
10  
11         try {
12             final Process process = Runtime.getRuntime().exec(cmd);
13             Runtime.getRuntime().addShutdownHook(new Thread() {
14                 public void run() {
15                     process.destroy();
16                 }
17             });
18             InputStreamReader inputstreamreader = new InputStreamReader(process.getInputStream());
19             char c = (char) inputstreamreader.read();
20             if (c != '\uFFFF')
21                 stdout.append(c);
22             while (c != '\uFFFF') {
23                 if (!inputstreamreader.ready()) {
24                     System.out.println(stdout);
25                     try {
26                         process.exitValue();
27                         break;
28                     }
29                     catch (IllegalThreadStateException _ex) {
30                         try {
31                             Thread.sleep(100L);
32                         }
33                         catch (InterruptedException _ex2) {
34                         }
35                     }
36                 else {
37                     c = (char) inputstreamreader.read();
38                     stdout.append(c);
39                 }
40             }
41             try {
42                 inputstreamreader.close();
43             }
44             catch (IOException ioexception2) {
45                 System.err.println("RunCmd : Error closing InputStream " + ioexception2);
46                 return false;
47             }
48         catch (Throwable e) {
49             e.printStackTrace();
50             Globals.Logger("發生錯誤:" + e, 2);
51             return false;
52         }
53  
54         return true;
55     }

4、利用FlexPaper展示

FlexPaper是一個被設計用來與PDF2SWF一起使用,開源輕量級的在瀏覽器上顯示各種文檔的組件, 使在Flex中顯示PDF成爲可能,而這個過程並無需PDF軟件環境的支持。它可以被當做Flex的庫來使用。也可以通過將一些例如Word、PPT等文檔轉成PDF,然後實現在線瀏覽。

01 SwfFile : escape(host+"/upload/web/2010-05-24-10-21-51139.swf"),
02       Scale : 0.6,
03       ZoomTransition : "easeOut",
04       ZoomTime : 0.5,
05         ZoomInterval : 0.1,
06         FitPageOnLoad : false,
07         FitWidthOnLoad : true,
08         PrintEnabled : false,
09         FullScreenAsMaxWindow : true,
10         localeChain: "zh_CN" //設置爲中文
11       };
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章