久久国产成人av_抖音国产毛片_a片网站免费观看_A片无码播放手机在线观看,色五月在线观看,亚洲精品m在线观看,女人自慰的免费网址,悠悠在线观看精品视频,一级日本片免费的,亚洲精品久,国产精品成人久久久久久久

分享

linux下類似百度文庫(kù)開發(fā)研究與實(shí)戰(zhàn)

 Tom.Lin 2012-06-28

緣起

由于項(xiàng)目需要開發(fā)了類似百度文庫(kù)和DOCIN類似的Flash播放器讀取上傳文檔的系統(tǒng),,雖然最終技術(shù)問題都得以解決,但開發(fā)的過程中走了不少?gòu)澛?,浪費(fèi)了不少時(shí)間,特別是FlexPaper去掉自帶的Logo這一步上,,前后花了幾天才得以解決,郁悶的有點(diǎn)不想在事后整理這個(gè)文檔,。為了讓自己更好的記下解決問題的關(guān)鍵點(diǎn)所在,,讓同樣有此需求的開發(fā)人員避免浪費(fèi)時(shí)間,,少走一些彎路,,打起精神整理本次開發(fā)過程的技術(shù)研究和技術(shù)實(shí)現(xiàn)過程。

 

基于Linux環(huán)境的技術(shù)選型

         項(xiàng)目基于Linux環(huán)境,,如果你的服務(wù)器是windows,那么某些部分的技術(shù)選型跟本文可能會(huì)有出入,最主要的一個(gè)過程是把文檔統(tǒng)一轉(zhuǎn)成PDF,如果在Windows下可以考慮跳過,,因?yàn)槭褂?/span>Flash Paper或者Print Flash可以把文檔直接轉(zhuǎn)成SWF,。但這兩者都不支持Linux環(huán)境,。因此我們采用先把所有文檔統(tǒng)一轉(zhuǎn)成PDF,,然后再轉(zhuǎn)成SWF的方案。

 

主要技術(shù)點(diǎn)和步驟

     基于對(duì)Linux環(huán)境的支持考慮(當(dāng)然Windows下也可以采用這種技術(shù)選型),,團(tuán)隊(duì)討論決定引入openoffice sdk + pdf2swf tool,,分兩個(gè)步驟,先利用openoffice sdk把文檔統(tǒng)一轉(zhuǎn)成pdf,,然后利用pdf2swf toolpdf轉(zhuǎn)成swf,。

     為了提高系統(tǒng)的反映速度并降低系統(tǒng)的耦合,,主業(yè)務(wù)上傳文檔和文檔轉(zhuǎn)換流程采用異步處理(分開兩個(gè)應(yīng)用,降低耦合),、同時(shí)采用Concurrent多線程來處理文檔轉(zhuǎn)換(可以通過線程數(shù)的配置,,統(tǒng)分利用cpu資源,提高并發(fā)處理速度,,提高系統(tǒng)的反應(yīng)時(shí)間),,同時(shí)可以進(jìn)一步擴(kuò)展設(shè)計(jì),以支持多臺(tái)機(jī)器同時(shí)處理文檔轉(zhuǎn)換,。

 

主要技術(shù)點(diǎn)實(shí)現(xiàn)

1.       Linux(CentOS5.3)下安裝OpenOfficeOpenOffice SDK

OpenOffice安裝:

1)下載了3.3版本的OpenOffice

2tar zxvf OOo_3.3.0_Linux_x86-64_install-rpm-wJRE_zh-CN.tar.gz

彎路:解壓后,,發(fā)現(xiàn)目錄下有個(gè)可執(zhí)行的setup,大喜,,心想肯定執(zhí)行setup安裝了,。

執(zhí)行后拋出錯(cuò)誤1

錯(cuò)誤信息No X11 DISPLAY variable was set”

心想直接到本機(jī)操作是否會(huì)不同,結(jié)果還是一樣的錯(cuò)誤,。

有大致的信息說要設(shè)置DISPLAY系統(tǒng)變量,,又設(shè)置

export DISPLAY=localhost:0.0

再次執(zhí)行拋出錯(cuò)誤2:

拋出異常Exception in thread "main" java.lang.UnsatisfiedLinkError: /var/tmp/install_28877/usr/java/jre1.6.0_22/lib/amd64/xawt/libmawt.so

按提示給安裝相關(guān)的圖形界面包

yum install libXp

yum install libXtst

yum install libXp-devel

yum install libXau-devel

再次setup,又回到No X11 DISPLAY variable was set報(bào)錯(cuò),,我就想了,,是不是當(dāng)時(shí)裝操作系統(tǒng)時(shí)沒裝上x windows server

也沒想太多,搜了google,,安裝XWindow 

yum  groupinstall "X Window System" 

yum groupinstall "GNOME Desktop Environment" 

yum install nc expect 

yum install freenx 

yum groupinstall chinese-support

不放心,,裝好后reboot,再次進(jìn)行setup,,還是同樣的出錯(cuò),。血壓都升高了,心里在想難道要進(jìn)圖形界面才能安裝么,,但我們服務(wù)器原則上不推薦使用圖形界面,,如果安裝的openoffice需要在圖形界面下運(yùn)行,那有點(diǎn)偏移了最初的技術(shù)選型目的,??磥?/span>setup方式在文本界面下已經(jīng)走不下去了,再次問google去,,這次發(fā)現(xiàn)了另外一種安裝方法,。

 

3 cd OOO330_m20_native_packed-1_zh-CN.9567/RPMS/

4rpm -ivh  *.rpm

5RPMS/desktop-integration

6rpm -ivh  openoffice.org3.3-redhat-menus-3.3-*.noarch.rpm

7/opt/openoffice.org3/program/soffice -headless -accept="socket,host=127.0.0.1,port=8100;urp;" -nofirststartwizard &

前提:如果你沒有安裝jdk或者安裝后沒有把jdk/bin加入到PATH,則會(huì)報(bào)出找不到jre

vi /etc/profile,,加入以下三行

export   JAVA_HOME=/usr/local/jdk1.6.0_17

export   PATH=$JAVA_HOME/bin:$PATH

export   CLASSPATH=$JAVA_HOME/lib/tools.jar:$CLASSPATH

 

8)查看服務(wù)是否運(yùn)行正常

   netstat -ano 可以查看到8100端口被soffice服務(wù)占用

   ps aux|grep soffice 查看進(jìn)程

 

OpenOffice SDK3.3安裝:

1)  下載OpenOffice SDK3.3

2tar zxvf OOo-SDK_3.3.0_Linux_x86-64_install-rpm_en-US.tar.gz

3cd OOO330_m20_native_packed-1_en-US.9567/RPMS/

4rpm -vih *.rpm

 

 

2.Linux下安裝pdf2swf Tool

中文支持安裝:

1)  mkdir –p /usr/share/xpdf

cd /usr/share/xpdf/

2)  下載中文支持及字體庫(kù)

wget  ftp://ftp.foolabs.com/pub/xpdf/xpdf-chinese-simplified.tar.gz

 

wget  http://www./download/font.zip

3 tar zxvf xpdf-chinese-simplified.tar.gz

         unzip font.zip

mv Gbsn00lp.ttf gkai00mp.ttf xpdf-chinese-simplified/CMap/

cd /usr/share/xpdf/xpdf-chinese-simplified

4vi add-to-xpdfrc

內(nèi)容如下:

cidToUnicode   Adobe-GB1       /usr/share/xpdf/chinese-simplified/Adobe-GB1.cidToUnicode

unicodeMap     ISO-2022-CN    /usr/share/xpdf/chinese-simplified/ISO-2022-CN.unicodeMap

unicodeMap     EUC-CN             /usr/share/xpdf/chinese-simplified/EUC-CN.unicodeMap

unicodeMap     GBK           /usr/share/xpdf/chinese-simplified/GBK.unicodeMap

cMapDir            Adobe-GB1       /usr/share/xpdf/chinese-simplified/CMap

toUnicodeDir                      /usr/share/xpdf/chinese-simplified/CMap

displayCIDFontTT Adobe-GB1 /usr/share/xpdf/chinese-simplified/CMap/gkai00mp.ttf

保存后退出

 

相關(guān)Lib包安裝:

1)  yum –y install gcc-c++(如果已安裝可跳過)

2)  yum install giflib-devel.x86_64

3)  yum install zlib-devel.x86_64

4)  yum install freetype-devel.x86_64

5)  yum install libjpeg-devel.x86_64

 

SwfTool安裝:

1cd /usr/local/

2wget  http://www./swftools-0.9.1.tar.gz

3tar zxvf swftools-0.9.1.tar.gz

4cd swftools-0.9.1

5./configure

6make

7make install

8)測(cè)試一下是否可用

pdf2swf -o /path/output.swf -T -z -t -f /path/yourpdffile.pdf -s languagedir=/usr/share/xpdf/xpdf-chinese-simplified -s flashversion=9

小意外:

測(cè)試環(huán)境意外宕機(jī)重起后,,運(yùn)行pdf2swf,拋出錯(cuò)誤:

pdf2swf: error while loading shared libraries: libjpeg.so.8: cannot open shared object file: No such file or directory

find了一遍,,發(fā)現(xiàn)libjpeg.so.8被裝到了/usr/local/lib下,,這不是默認(rèn)的/lib/usr/lib目錄,。問了下google,對(duì)于動(dòng)態(tài)庫(kù)的路徑問題有以下三種解決方案

 

動(dòng)態(tài)庫(kù)的路徑問題

為了讓執(zhí)行程序順利找到動(dòng)態(tài)庫(kù),,有三種方法:

(1)把庫(kù)拷貝到/usr/lib/lib目錄下,。

(2)LD_LIBRARY_PATH環(huán)境變量中加上庫(kù)所在路徑,。例如動(dòng)態(tài)庫(kù)libhello.so/home/ting/lib目錄下,,以bash為例,使用命令:

$export LD_LIBRARY_PATH=$LD_LIBRARY_PATH:/home/ting/lib

(3) 修改/etc/ld.so.conf文件,,把庫(kù)所在的路徑加到文件末尾,,并執(zhí)行ldconfig刷新。這樣,,加入的目錄下的所有庫(kù)文件都可見,。

本人使用了第2種辦法,再次運(yùn)行pdf2swf正常,。

 

 

pdf2swf參數(shù)很多,,以下參數(shù)是經(jīng)網(wǎng)友翻譯后的詳細(xì)說明:

  • -h , –help                      Print short help message and exit              打印幫助信息
  • -V , –version                Print version info and exit                        打印版本號(hào)
  • -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

指定轉(zhuǎn)換的頁面范圍,使用的頁碼描述方法與打印機(jī)打印文件時(shí)候的選頁一樣

  • -P , –password password       Use password for deciphering the pdf.指定打開pdf的密碼
  • -v , –verbose                 Be verbose. Use more than one -v for greater effect.轉(zhuǎn)換時(shí)輸出詳細(xì)的內(nèi)容
  • -z , –zlib                    Use Flash 6 (MX) zlib compression.使用Flash 6zlib壓縮機(jī)制
  • -i , –ignore                  Allows pdf2swf to change the draw order of the pdf. This may make the generated允許程序修改pdf的繪制順序,,可能會(huì)導(dǎo)致結(jié)果與原來有差異
  • -j , –jpegquality quality     Set quality of embedded jpeg pictures to quality. 0 is worst (small), 100 is best (big). (default:85)設(shè)置轉(zhuǎn)換其中的jpeg圖片的質(zhì)量,,從0100,默認(rèn)值是85,。
  • -s , –set param=value         Set a SWF encoder specific parameter. See pdf2swf -s help for more information. 設(shè)置SWF轉(zhuǎn)碼時(shí)候的參數(shù),,具體參數(shù)可以用pdf2swf -s help獲取
  • -w , –samewindow              When converting pdf hyperlinks, don’t make the links open a new window.        設(shè)置轉(zhuǎn)換后的swf打開原pdf中的連接時(shí)使用相同的窗口
  • -t , –stop                    Insert a stop() command in each page.            在每頁結(jié)尾添加一個(gè)stop()命令
  • -T , –flashversion num        Set Flash Version in the SWF header to num.         設(shè)置SWF所使用的flash版本號(hào)
  • -F , –fontdir directory       Add directory to the font search path.                    指定字體文件所在路徑
  • -b , –defaultviewer           Link a standard viewer to the swf file.             指定默認(rèn)的swf導(dǎo)航文件,用來翻頁,、放大縮小等等
  • -l , –defaultloader           Link a standard preloader to the swf file which will be displayed while the main swf is loading.     指定默認(rèn)的swf加載文件,,用來顯示加載進(jìn)程效果
  • -B , –viewer filename         Link viewer filename to the swf file.   指定swf導(dǎo)航文件,作用同-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. 不使用字體,,所有都轉(zhuǎn)為形狀,。
  • -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. 不做實(shí)際轉(zhuǎn)換,,僅顯示PDF的信息。
  • -Q , –maxtime n               Abort conversion after n seconds. Only available on Unix. 如果運(yùn)行時(shí)間超時(shí)則退出,。

然后看看-s都可以設(shè)置些什么:
PDF Parameters:
PDF device global parameters:
fontdir= a directory with additional fonts 指定字體目錄, 1級(jí)參數(shù)的-F相若
font= an additional font filename 增加額外的字體文件
pages= the range of pages to convert (example: pages=1-100,210-) 指定頁面范圍,,與1級(jí)參數(shù)的-p相若
zoom= the resolution (default: 72) 指定分辨率,默認(rèn)為72dpi
languagedir= Add an xpdf language directory 增加一個(gè)xpdf的語言目錄,,對(duì)非西歐字符有用
multiply= Render everything at the resolution 在幾倍分辨率下渲染
poly2bitmap Convert graphics to bitmaps 把其中的圖形轉(zhuǎn)成點(diǎn)陣
bitmap Convert everything to bitmaps 把所有內(nèi)容轉(zhuǎn)成點(diǎn)陣(包括字體)

SWF Parameters:

SWF layer options:
jpegsubpixels=<pixels> resolution adjustment for jpeg images (same as jpegdpi, but in pixels) jpeg
圖片的分辨率

ppmsubpixels=<pixels> resolution adjustment for lossless images (same asppmdpi, but in pixels)
無損圖片的分辨率
subpixels=<pixels>     shortcut for setting both jpegsubpixels and ppmsubpixels
快速設(shè)置上兩個(gè)參數(shù)
drawonlyshapes           convert everything to shapes (currently broken)
所有都轉(zhuǎn)成圖形
ignoredraworder         allow to perform a few optimizations for creating smaller SWFs
允許執(zhí)行一些小優(yōu)化
linksopennewwindow   make links open a new browser window
鏈接打開新窗口
linktarget                  target window name of new links      
新鏈接窗口的名稱
linkcolor=<color)        color of links (format: RRGGBBAA)   
鏈接的顏色
linknameurl         Link buttons will be named like the URL they refer to (handy for iterating through links with actionscript)
鏈接名稱與鏈接URL一致
storeallcharacters      don’t reduce the fonts to used characters in the output file
保存所有的字符字體
enablezlib                switch on zlib compression (also done if flashversion>=7)
使用zlib壓縮
bboxvars                 store the bounding box of the SWF file in actionscript variables
as中保存swf的區(qū)域大小
dots                        Take care to handle dots correctly
保存單點(diǎn)顯示
reordertags=0/1     (default: 1) perform some tag optimizations
執(zhí)行某些tag優(yōu)化
internallinkfunction=<name> when the user clicks a internal link (to a different page) in the converted file, this actionscript function is called
內(nèi)部鏈接函數(shù),,如果點(diǎn)擊一個(gè)內(nèi)部鏈接,,將調(diào)用該actionscript函數(shù)
externallinkfunction=<name> when the user clicks an external link (e.g. http://www.r/) on the converted file, this actionscript function is called
外部鏈接函數(shù),如果點(diǎn)擊一個(gè)外部鏈接,,將調(diào)用該actionscript函數(shù)
disable_polygon_conversion never convert strokes to polygons (will remove capstyles and joint styles)
不要將筆畫轉(zhuǎn)成多邊形
caplinewidth=<width>        the minimum thichness a line needs to have so that capstyles become visible (and are converted)          
線條最低轉(zhuǎn)換寬度,,比這個(gè)細(xì)的線條將不轉(zhuǎn)換
insertstop                  put an ActionScript “STOP” tag in every frame
swf的每個(gè)楨中添加stop()函數(shù)
protect                     add a “protect” tag to the file, to prevent loadingin the Flash editor
增加protect標(biāo)簽,禁止在flash中加載該swf
flashversion=<version> the SWF fileversion (6)
設(shè)置最低swf版本

framerate=<fps>         SWF framerate
設(shè)置楨率
minlinewidth=<width> convert horizontal/vertical boxes smaller than thiswidth to lines (0.05)
將寬度少于某值的矩形轉(zhuǎn)成線條
simpleviewer     Add next/previous buttons to the SWF
使用簡(jiǎn)單的導(dǎo)航
animate           insert a showframe tag after each placeobject (animate draw order of PDF files)
jpegquality=<quality> set compression quality of jpeg images
設(shè)置jpeg的壓縮質(zhì)量
splinequality=<value> Set the quality of spline convertion to value (0-100, default: 100).
設(shè)置樣條曲線的轉(zhuǎn)換質(zhì)量
disablelinks                Disable links.
禁止鏈接

 

3.文檔轉(zhuǎn)成PDFJava實(shí)現(xiàn)

         這篇文檔http://blog./2010/05/convert-document-to-pdf-via-openoffice.html介紹的很詳細(xì),,基本上可以照著上面做,。雖然是windows下的例子,但在Linux下做稍微改動(dòng)即可,。這里就不貼出代碼,,列出這部分實(shí)現(xiàn)的細(xì)節(jié)差別:

1)  Linux下,openoffice默認(rèn)安裝目錄到/opt/openoffice,,而目錄/opt/openoffice.org/basis3.3/program/classes/默認(rèn)是隱藏的,。

Linux下,所需相關(guān)類的路徑如下:

/opt/openoffice.org/basis3.3/program/classes/unoil.jar

/opt/openoffice.org/ure/share/java/jurt.jar

/opt/openoffice.org/ure/share/java/juh.jar

/opt/openoffice.org/ure/share/java/bootstrapconnector.jar(按上述文檔下載,,并上傳到這個(gè)目錄)

2)  如果Eclipse還報(bào)找不到import com.sun.star.beans.PropertyValue,,那么把/opt/openoffice.org/ure/share/java/ridl.jar也引入。我的Eclipse未報(bào)此錯(cuò)誤,,而我的同事Eclipse卻報(bào)這個(gè)錯(cuò)誤,。本人猜測(cè)可能是同事安裝的環(huán)境或MAINFEST.MF描述不同引起的,未進(jìn)一步找出原因,。

3)  考慮到多線程應(yīng)用,,重寫初始化XCompoentContext對(duì)象方法

代碼片段:

 

 

 

Java代碼  收藏代碼
  1. /** 
  2.  
  3.  * 創(chuàng)建一個(gè)XComponentContext對(duì)象 
  4.  
  5.  *  
  6.  
  7.  * @return 
  8.  
  9.  * @throws Exception 
  10.  
  11.  */  
  12.   
  13. private static XComponentContext createContext(int port) throws Exception {  
  14.   
  15.     return BootstrapSocketConnector.bootstrap(HXConstants.OOSYSPATH,"localhost",port);  
  16.   
  17. }  

 

新增傳入端口參數(shù),可以支持打開多個(gè)openoffice,,如果線程多個(gè),,需要為每個(gè)線程提供不同的端口。

 

 

新增傳入端口參數(shù),,可以支持打開多個(gè)openoffice,,如果線程多個(gè),需要為每個(gè)線程提供不同的端口,。

 

 

 

4)  轉(zhuǎn)換類型

輸入文檔不同,,最好選擇不同的打印方式,java代碼實(shí)現(xiàn)

Java代碼  收藏代碼
  1. public static String getConvertType(String extension){  
  2.   
  3. if(extension.matches("doc|docs|txt|rtf|html|htm|xml|odt|wps|wpd")){  
  4.   
  5.                return "writer_pdf_Export";  
  6.   
  7.             }  
  8.   
  9.             if(extension.matches("xls|xlsb|xlsx|ods")){  
  10.   
  11.                return "calc_pdf_Export";  
  12.   
  13.             }  
  14.   
  15.             if(extension.matches("ppt|pptx|odp")){  
  16.   
  17.                return "impress_pdf_Export";  
  18.   
  19.             }  
  20.   
  21.             return "writer_pdf_Export";  
  22.   
  23. }  

 

 

 

 

 

 

4.PDF轉(zhuǎn)成SWFJava實(shí)現(xiàn)

代碼片段

 

Java代碼  收藏代碼
  1. /**  
  2.  
  3.      * 將pdf文件轉(zhuǎn)化成swf文件   
  4.  
  5.      * @param fileName 文件的絕對(duì)路徑(含文件名和擴(kuò)展名)  
  6.  
  7.      * @param destPath 目標(biāo)路徑 (目標(biāo)文件夾,不含文件名) 
  8.  
  9.      * @return -1:源文件不存在,-2:格式不正確,-3:發(fā)生異常,0:轉(zhuǎn)化成功;1:無法打開文件(Process.exitValue())   
  10.  
  11.      * @author dongbai  
  12.  
  13.      */    
  14.   
  15.     public static int convertPdfToSwf(String fileName,String destPath){    
  16.   
  17.     if(null != fileName && fileName.length() > 0){  
  18.   
  19. //          String destName = "";  
  20.   
  21.             String fileExt = "";    
  22.   
  23.             StringBuffer command = new StringBuffer();    
  24.   
  25.             Process pro;  
  26.   
  27.             BufferedReader buffer;  
  28.   
  29.             fileExt = fileName.substring(fileName.lastIndexOf(".")+1, fileName.length()).toLowerCase();  
  30.   
  31.             try{    
  32.   
  33.                 File file = new File(fileName);    
  34.   
  35.                 if(!file.exists()){//判斷源文件是否存在     
  36.   
  37.                     return ERROR_FILE_NOT_EXIST;    
  38.   
  39.                 }else if(!fileExt.equals("pdf")){//判斷文件是否是pdf格式的文件                    
  40.   
  41.                   return ERROR_WRONG_EXT_NAME;    
  42.   
  43.                 }    
  44.   
  45.                 else{    
  46.   
  47.                   //" -Q 300"參數(shù)只在linux下有效  
  48.   
  49. command.append(HXConstants.PDF2SWF_PATH).append("pdf2swf").append(" -o ").append(destPath).append(" -T -z -t -f ").append(HXConstants.PDF2SWF_PATH.startsWith("/")?" -Q 300 ":"").append(fileName).append(" -s languagedir=").append(HXConstants.LANGDIR).append(" -s flashversion=9");    
  50.   
  51.                    
  52.   
  53.                     pro = Runtime.getRuntime().exec(command.toString());    
  54.   
  55.                     buffer = new BufferedReader(new InputStreamReader(pro.getInputStream()));    
  56.   
  57.    
  58.   
  59.                     while(buffer.readLine()!=null);    
  60.   
  61.                     int rtstate = pro.waitFor();  
  62.   
  63.                     return rtstate;  
  64.   
  65.                 }    
  66.   
  67.             }catch (Exception e){    
  68.   
  69.                 System.out.println(e.getMessage());  
  70.   
  71.                 return ERROR_HAS_EXCEPTION;    
  72.   
  73.             }finally{  
  74.   
  75.             command=null;  
  76.   
  77.              pro=null;  
  78.   
  79.             buffer=null;  
  80.   
  81.             }  
  82.   
  83.     }else{  
  84.   
  85.         return ERROR_FILE_NOT_EXIST;  
  86.   
  87.     }  
  88.   
  89.     }    

 

 

 

 

代碼片段說明:

(1)其中一些常量,,可以自行定義,,HXConstants.PDF2SWF_PATHHXConstants.LANGDIR分別定義swftool安裝路徑,、中文支持安裝路徑,,為了移植方便,可以配置在properties配置文件里,如:

oosyspath=C:/Program Files/OpenOffice.org 3/program/

pdf2swf=D:/SWFTools/

langdir=/usr/share/xpdf/xpdf-chinese-simplified

發(fā)布到linux環(huán)境后,,修改配置文件即可,。

(2)根據(jù)需要,可以追加參數(shù),,參考本文pdf2swf Tool參數(shù)詳細(xì)說明,。

(3) pro.waitFor()pro.exitValue()的區(qū)別,pro.exitValue可以異步處理,,你可以根據(jù)需求而定,。

 

5.Concurrent線程池實(shí)現(xiàn)

1)整體業(yè)務(wù)描述

   (1)首先前臺(tái)用戶提交文檔上傳。

   (2)后臺(tái)異步處理上傳文檔,。

   (3)前臺(tái)檢查后臺(tái)處理狀態(tài),,處理完畢顯示flexpaper效果,,未處理完畢顯示其他提示或處于加載中,。

2Concurrent實(shí)現(xiàn)任務(wù)線程池

   (1)實(shí)現(xiàn)抓取待處理的任務(wù),放入BlockingQueue,,避免重復(fù)抓?。?/span>

   (2)實(shí)現(xiàn)多線程處理文檔,,線程從BlockingQueeu取出一個(gè)任務(wù),,處理完后把對(duì)應(yīng)的文檔數(shù)據(jù)置成處理完成狀態(tài)。

見博客一個(gè)任務(wù)隊(duì)列的BlockingQueue實(shí)現(xiàn),。

 

6.FlexPaper源碼初步說明及改造

1)研究歷程

FlexPaper是一套開源系統(tǒng),,用于展示swftool生成的swf,通過參數(shù)設(shè)置能達(dá)到比較好的展示效果,,FlexPaper遵循GNU GPL協(xié)議,。項(xiàng)目地址:

http://code.google.com/p/flexpaper/

源碼地址:

http://flexpaper./svn/trunk/

         如果你不介意FlexPaper播放的時(shí)候帶有其自帶的logo標(biāo)簽,下載trunk下的Example,,里面有詳細(xì)的例子,。如果你要對(duì)播放器進(jìn)行一些修改,比如要去掉其自帶的logo,,那就要對(duì)FlexPaper進(jìn)行重新編譯,。可以看到trunk下有FlexPaper項(xiàng)目和FlexPaper_SDK4項(xiàng)目,,兩者的區(qū)別主要是Flex SDK版本,,前者使用Flex SDK3.5,后者使用Flex SDK4及以上版本,,其次FlexPaper_SDK4在我下載時(shí)還只有beta版,,下載后導(dǎo)入4.0對(duì)應(yīng)的FlexPaper_SDK4.swc編譯不能通過,因此當(dāng)前時(shí)間還是選擇FlexPaper項(xiàng)目比較穩(wěn)妥。在Eclipse(安裝Flash Builder插件)下通過svn檢出項(xiàng)目即可,,檢出后會(huì)自動(dòng)成了Flex庫(kù)項(xiàng)目,,完成編譯后,可以看到在目錄bin下編譯產(chǎn)生的FlexPaper.swc文件,。

提示: 如果在編譯過程中報(bào)錯(cuò):1046: 找不到類型,,或者它不是編譯時(shí)常數(shù): Vector

Flex編譯器Adobe Flash Player選項(xiàng)選種:使用特定版本(v):10.0.0,,而Flex3.5默認(rèn)的設(shè)置是9.0.0

還需要在資源加入local\{local},,如果編譯還報(bào)local錯(cuò)誤,那就把local直接拷貝到sdks\3.5.0\frameworks\local下,。

 

   彎路1:本人一開始以為直接生成FlexPaperViewer.swf,,對(duì)檢出Flex庫(kù)項(xiàng)目很納悶,然后就自己創(chuàng)建Flash web類型的項(xiàng)目,,再通過svn檢出,,又手動(dòng)把項(xiàng)目下的FlexPaperViewer.mxml設(shè)置成默認(rèn)運(yùn)行,這樣是生成了FlexPaperViewer.swf,,但打開FlexPaperViewer.swf發(fā)現(xiàn)只有灰色或黑色的背景,。在浪費(fèi)大半天時(shí)間后,在同事提醒下才搞明白原來此FlexPaperViewer.mxmlExample項(xiàng)目下直接編譯生成的FlexPaperViewer.swf,。這該死的命名,,對(duì)剛接觸的人來說是太容易產(chǎn)生聯(lián)想了。

   彎路2:那就自己寫一個(gè)FlexPaperViewer.mxml,,或者干脆不要取這個(gè)名也可以,,容易產(chǎn)生混淆,。網(wǎng)上找到一個(gè),,引入重新編譯過的FlexPaper.swc,,編譯成功,打開后界面也出來了,。但在加載指定的SwfFile時(shí)一直加載不出來,,右上角的菊花一直在轉(zhuǎn),。懷疑是不是自編譯的FlexPaper.swc有問題,,上官網(wǎng)下載官方的FlexPaper.swc,,還是不行……,,周末后家里的開發(fā)環(huán)境又折騰了大半天,,中間還下了個(gè)flash反編譯軟件,打算對(duì)Example下的FlexPaperView.swf進(jìn)行反編譯,,可惜目前大多反編譯軟件只有反編譯成.fla.as,最終反編譯也只能作罷,?;氐秸罚K于找到比較完整的FlexPaperViewr.mxml,。

 

2)  FlexPaperView.mxml的實(shí)現(xiàn)

       完整代碼:

 

Java代碼  收藏代碼
  1. <?xml version="1.0" encoding="utf-8"?>     
  2.   
  3. <mx:Application xmlns:mx="http://www.adobe.com/2006/mxml"    
  4.   
  5.                 xmlns:fp="com.devaldi.controls.flexpaper.*"    
  6.   
  7.                 layout="absolute" width="100%" height="100%"      
  8.   
  9.                 applicationComplete="initApp();">     
  10.   
  11.       
  12.   
  13.     <mx:Script>     
  14.   
  15.         <![CDATA[     
  16.   
  17.             import mx.controls.Alert;     
  18.   
  19.               
  20.   
  21.             public var _aid = 0;//文檔ID     
  22.   
  23.               
  24.   
  25.             [Bindable]     
  26.   
  27.             public var _Scale:Number = 1;//縮放比例     
  28.   
  29.               
  30.   
  31.             [Bindable]     
  32.   
  33.             public var _SwfFile:String = "";//SWF文件路徑     
  34.   
  35.               
  36.   
  37.             [Bindable]     
  38.   
  39.             public var _ZoomTransition:String = "easeOut";     
  40.   
  41.               
  42.   
  43.             [Bindable]     
  44.   
  45.             public var _ZoomTime:Number = 0.6;     
  46.   
  47.               
  48.   
  49.             [Bindable]     
  50.   
  51.             public var _ZoomInterval:Number = 0.1;     
  52.   
  53.               
  54.   
  55.             [Bindable]     
  56.   
  57.             public var _FitPageOnLoad:Boolean = false;//加載后適合高度     
  58.   
  59.               
  60.   
  61.             [Bindable]     
  62.   
  63.             public var _FitWidthOnLoad:Boolean = false;//加載后適合寬度     
  64.   
  65.               
  66.   
  67.             [Bindable]     
  68.   
  69.             public var _PrintEnabled:Boolean = true;//是否支持打印     
  70.   
  71.               
  72.   
  73.             [Bindable]     
  74.   
  75.             public var _FullScreenAsMaxWindow:Boolean = false;//是否支付全屏     
  76.   
  77.               
  78.   
  79.             [Bindable]     
  80.   
  81.             public var _ProgressiveLoading:Boolean = false;//是否延遲加載     
  82.   
  83.               
  84.   
  85.               
  86.   
  87.             [Bindable]  
  88.   
  89.             public var _MinZoomSize:Number = 0.3;  
  90.   
  91.               
  92.   
  93.             [Bindable]  
  94.   
  95.             public var _MaxZoomSize:Number = 5;  
  96.   
  97.               
  98.   
  99.             [Bindable]  
  100.   
  101.             public var _SearchMatchAll:Boolean = false;  
  102.   
  103.               
  104.   
  105.             [Bindable]  
  106.   
  107.             public var _ViewModeToolsVisible:Boolean = true;  
  108.   
  109.               
  110.   
  111.             [Bindable]  
  112.   
  113.             public var _ZoomToolsVisible:Boolean = true;  
  114.   
  115.               
  116.   
  117.             [Bindable]  
  118.   
  119.             public var _NavToolsVisible:Boolean = true;  
  120.   
  121.               
  122.   
  123.             [Bindable]  
  124.   
  125.             public var _CursorToolsVisible:Boolean = true;  
  126.   
  127.               
  128.   
  129.             [Bindable]  
  130.   
  131.             public var _SearchToolsVisible:Boolean = true;  
  132.   
  133.               
  134.   
  135.             [Bindable]     
  136.   
  137.             public var _localeChain:String = "zh_CN";//語言     
  138.   
  139.               
  140.   
  141.             private var isFocus:Boolean = false;     
  142.   
  143.               
  144.   
  145.             //初始化參數(shù)     
  146.   
  147.             private function initApp():void{     
  148.   
  149.                 var params:Object = Application.application.parameters;     
  150.   
  151.                 _Scale = getNumber(params, "Scale"1);     
  152.   
  153.                 _SwfFile = getString(params, "SwfFile""Paper.swf");     
  154.   
  155.                 _ZoomTransition = getString(params, "ZoomTransition""easeOut");     
  156.   
  157.                 _ZoomTime = getNumber(params, "ZoomTime"0.6);     
  158.   
  159.                 _ZoomInterval = getNumber(params, "ZoomInterval"0.1);     
  160.   
  161.                 _FitPageOnLoad = getBoolean(params, "FitPageOnLoad"false);     
  162.   
  163.                 _FitWidthOnLoad = getBoolean(params, "FitWidthOnLoad"false);     
  164.   
  165.                 _PrintEnabled = getBoolean(params, "PrintEnabled"true);     
  166.   
  167.                 _FullScreenAsMaxWindow = getBoolean(params, "FullScreenAsMaxWindow"false);     
  168.   
  169.                 _ProgressiveLoading = getBoolean(params, "ProgressiveLoading"true);   
  170.   
  171.                 _MinZoomSize = getNumber(params, "MinZoomSize"0.3);     
  172.   
  173.                 _MaxZoomSize = getNumber(params, "MaxZoomSize"5);  
  174.   
  175.                 _SearchMatchAll = getBoolean(params, "SearchMatchAll"true);  
  176.   
  177.                 _ViewModeToolsVisible = getBoolean(params, "ViewModeToolsVisible"true);  
  178.   
  179.                 _ZoomToolsVisible = getBoolean(params, "ZoomToolsVisible"true);   
  180.   
  181.                 _NavToolsVisible=getBoolean(params,"NavToolsVisible",true);  
  182.   
  183.                 _CursorToolsVisible=getBoolean(params,"_CursorToolsVisible",true);  
  184.   
  185.                 _SearchToolsVisible=getBoolean(params,"_SearchToolsVisible",true);  
  186.   
  187.                   
  188.   
  189.                 _localeChain = params["localeChain"];     
  190.   
  191.                   
  192.   
  193.                 //注冊(cè)事件監(jiān)聽     
  194.   
  195.                 this.addEventListener(MouseEvent.MOUSE_OVER, onMouseOver);     
  196.   
  197.                 this.addEventListener(MouseEvent.MOUSE_OUT, onMouseOut);     
  198.   
  199.                   
  200.   
  201.                 //開放給外部(javascript)調(diào)用     
  202.   
  203.                 ExternalInterface.addCallback("hasFocus", hasFocus);     
  204.   
  205.                 //ExternalInterface.addCallback("focus", focus);     
  206.   
  207.                 ExternalInterface.addCallback("setViewerFocus", setViewerFocus);         
  208.   
  209.             }     
  210.   
  211.               
  212.   
  213.               
  214.   
  215.               
  216.   
  217.             private function onMouseOver(event:MouseEvent):void{     
  218.   
  219.                 this.isFocus = true;     
  220.   
  221.             }     
  222.   
  223.               
  224.   
  225.             private function onMouseOut(event:MouseEvent):void{     
  226.   
  227.                 this.isFocus = false;     
  228.   
  229.             }     
  230.   
  231.               
  232.   
  233.             public function hasFocus():Boolean{     
  234.   
  235.                 //Alert.show("hasFocus");     
  236.   
  237.                 return isFocus;     
  238.   
  239.             }     
  240.   
  241.               
  242.   
  243.             public function setViewerFocus(isFocus:Boolean):void{     
  244.   
  245.                 //Alert.show("setViewerFocus");     
  246.   
  247.                 this.paperViewer.setViewerFocus();     
  248.   
  249.             }     
  250.   
  251.               
  252.   
  253.             /**   
  254.  
  255.              *    
  256.  
  257.              * 獲取String類型參數(shù)   
  258.  
  259.              * 如果沒有,則返回默認(rèn)值   
  260.  
  261.              **/    
  262.   
  263.             private function getString(params:Object, name:String, def:String):String{     
  264.   
  265.                 if(params[name] != null){     
  266.   
  267.                     return params[name];     
  268.   
  269.                 }     
  270.   
  271.                 return def;     
  272.   
  273.             }     
  274.   
  275.               
  276.   
  277.             private function getNumber(params:Object, name:String, def:Number):Number{     
  278.   
  279.                 if(params[name] != null){     
  280.   
  281.                     return params[name];     
  282.   
  283.                 }     
  284.   
  285.                 return def;     
  286.   
  287.             }     
  288.   
  289.               
  290.   
  291.             private function getBoolean(params:Object, name:String, def:Boolean):Boolean{     
  292.   
  293.                 //Alert.show("比較:"+name);     
  294.   
  295.                 if(params[name] != null){     
  296.   
  297.                     return params[name] == "true";     
  298.   
  299.                 }     
  300.   
  301.                 return def;     
  302.   
  303.             }     
  304.   
  305.         ]]>     
  306.   
  307.     </mx:Script>     
  308.   
  309.     <!--mx:Panel x="165" y="76" width="250" height="200" layout="absolute" title="一個(gè)人">     
  310.   
  311.     <mx:Label x="59" y="37" text="{Scale}" width="88"/>     
  312.   
  313.     </mx:Panel-->     
  314.   
  315.       
  316.   
  317.     <fp:FlexPaperViewer id="paperViewer"    
  318.   
  319.                         width="100%"      
  320.   
  321.                         height="100%"      
  322.   
  323.                         Scale="{_Scale}"      
  324.   
  325.                         SwfFile="{_SwfFile}"      
  326.   
  327.                         ZoomTransition="{_ZoomTransition}"      
  328.   
  329.                         ZoomTime="{_ZoomTime}"      
  330.   
  331.                         ZoomInterval="{_ZoomInterval}"    
  332.   
  333.                         FitPageOnLoad="{_FitPageOnLoad}"    
  334.   
  335.                         FitWidthOnLoad="{_FitWidthOnLoad}"      
  336.   
  337.                         FullScreenAsMaxWindow="{_FullScreenAsMaxWindow}"    
  338.   
  339.                         ProgressiveLoading="{_ProgressiveLoading}"  
  340.   
  341.                         MinZoomSize="{_MinZoomSize}"  
  342.   
  343.                         MaxZoomSize="{_MaxZoomSize}"  
  344.   
  345.                         SearchMatchAll="{_SearchMatchAll}"  
  346.   
  347.                         ViewModeToolsVisible="{_ViewModeToolsVisible}"  
  348.   
  349.                         ZoomToolsVisible="{_ZoomToolsVisible}"  
  350.   
  351.                         NavToolsVisible="{_NavToolsVisible}"  
  352.   
  353.                         CursorToolsVisible="{_CursorToolsVisible}"  
  354.   
  355.                         SearchToolsVisible="{_SearchToolsVisible}"  
  356.   
  357.                         />     
  358.   
  359. </mx:Application>  

 

 

3FlexPaper去掉logo實(shí)現(xiàn)

右上方的Logo修改:在FlexPaper項(xiàng)目的FlexPaperView.xml做修改,很容易找到,;

右下方的Logo修改:在FlexPaper項(xiàng)目的Viewer.as,,主要對(duì)成員變量_skinImgDo做注釋,其中有一行代碼addChildAt改成addChildAt (_paperContainer,1);

重新編譯后,,再次編譯FlexPaperView.xml,,在FlexPaperView.html傳入正確的SwfFile參數(shù),右角的轉(zhuǎn)動(dòng)菊花終于消失了,,看到了想要的效果。

 

 

發(fā)布到正式環(huán)境問題的暴露及校正

         在布署到正式環(huán)境過程中,發(fā)現(xiàn)兩個(gè)問題

1)雖然openoffice通過rpm方式來安裝都未出錯(cuò),,而且服務(wù)也能正常起來,,但在java應(yīng)用在執(zhí)行調(diào)用createContext(int port)會(huì)出現(xiàn)退出線程的情況。查找了各種原因后,最后發(fā)現(xiàn)是因?yàn)闇y(cè)試環(huán)境安裝了xwindow的原因,,看來圖形相關(guān)包的支持是必須的,,如下:

yum install libXp

yum install libXtst

yum install libXp-devel

yum install libXau-devel

yum  groupinstall "X Window System" 

yum groupinstall "GNOME Desktop Environment" 

yum install nc expect 

yum install freenx 

yum groupinstall chinese-support

2)Linux下openoffice服務(wù)需要啟動(dòng)

linux,,安裝完openoffice后,,需要啟動(dòng)soffice服務(wù):/opt/openoffice.org3/program/soffice -headless -accept="socket,host=127.0.0.1,port=8100;urp;"

 -nofirststartwizard & 如沒有啟動(dòng)服務(wù),,執(zhí)行文檔轉(zhuǎn)換服務(wù)會(huì)出錯(cuò)。

    本站是提供個(gè)人知識(shí)管理的網(wǎng)絡(luò)存儲(chǔ)空間,,所有內(nèi)容均由用戶發(fā)布,,不代表本站觀點(diǎn),。請(qǐng)注意甄別內(nèi)容中的聯(lián)系方式,、誘導(dǎo)購(gòu)買等信息,,謹(jǐn)防詐騙,。如發(fā)現(xiàn)有害或侵權(quán)內(nèi)容,請(qǐng)點(diǎn)擊一鍵舉報(bào),。
    轉(zhuǎn)藏 分享 獻(xiàn)花(0

    0條評(píng)論

    發(fā)表

    請(qǐng)遵守用戶 評(píng)論公約

    類似文章 更多