分类: PHP
2013-01-16 10:31:54
缘起
由于项目需要开发了类似百度文库和DOCIN类似的Flash播放器读取上传文档的系统,虽然最终技术问题都得以解决,但开发的过程中走了不少弯路,浪费了不少时间,特别是FlexPaper去掉自带的Logo这一步上,前后花了几天才得以解决,郁闷的有点不想在事后整理这个文档。为了让自己更好的记下解决问题的关键点所在,让同样有此需求的开发人员避免浪费时间,少走一些弯路,打起精神整理本次开发过程的技术研究和技术实现过程。
基于Linux环境的技术选型
项目基于Linux环境,如果你的服务器是windows,那么某些部分的技术选型跟本文可能会有出入,最主要的一个过程是把文档统一转成PDF,如果在Windows下可以考虑跳过,因为使用Flash Paper或者Print Flash可以把文档直接转成SWF。但这两者都不支持Linux环境。因此我们采用先把所有文档统一转成PDF,然后再转成SWF的方案。
主要技术点和步骤
基于对Linux环境的支持考虑(当然Windows下也可以采用这种技术选型),团队讨论决定引入openoffice sdk + pdf2swf tool,分两个步骤,先利用openoffice sdk把文档统一转成pdf,然后利用pdf2swf tool把pdf转成swf。
为了提高系统的反映速度并降低系统的耦合,主业务上传文档和文档转换流程采用异步处理(分开两个应用,降低耦合)、同时采用Concurrent多线程来处理文档转换(可以通过线程数的配置,统分利用cpu资源,提高并发处理速度,提高系统的反应时间),同时可以进一步扩展设计,以支持多台机器同时处理文档转换。
主要技术点实现
1. Linux(CentOS5.3)下安装OpenOffice及OpenOffice SDK
OpenOffice安装:
1)下载了3.3版本的OpenOffice
2)tar zxvf OOo_3.3.0_Linux_x86-64_install-rpm-wJRE_zh-CN.tar.gz
弯路:解压后,发现目录下有个可执行的setup,大喜,心想肯定执行setup安装了。
执行后抛出错误1:
“错误信息No X11 DISPLAY variable was set”
心想直接到本机操作是否会不同,结果还是一样的错误。
有大致的信息说要设置DISPLAY系统变量,又设置
export DISPLAY=localhost:0.0
再次执行抛出错误2:
抛出异常Exception in thread "main" java.lang.UnsatisfiedLinkError: /var/tmp/install_28877/usr/java/jre1.6.0_22/lib/amd64/xawt/libmawt.so
按提示给安装相关的图形界面包
yum install libXp
yum install libXtst
yum install libXp-devel
yum install libXau-devel
再次setup,又回到No X11 DISPLAY variable was set报错,我就想了,是不是当时装操作系统时没装上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,再次进行setup,还是同样的出错。血压都升高了,心里在想难道要进图形界面才能安装么,但我们服务器原则上不推荐使用图形界面,如果安装的openoffice需要在图形界面下运行,那有点偏移了最初的技术选型目的。看来setup方式在文本界面下已经走不下去了,再次问google去,这次发现了另外一种安装方法。
3) cd OOO330_m20_native_packed-1_zh-CN.9567/RPMS/
4)rpm -ivh *.rpm
5)RPMS/desktop-integration
6)rpm -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,则会报出找不到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)查看服务是否运行正常
netstat -ano 可以查看到8100端口被soffice服务占用
ps aux|grep soffice 查看进程
OpenOffice SDK3.3安装:
1) 下载OpenOffice SDK3.3
2)tar zxvf OOo-SDK_3.3.0_Linux_x86-64_install-rpm_en-US.tar.gz
3)cd OOO330_m20_native_packed-1_en-US.9567/RPMS/
4)rpm -vih *.rpm
2.Linux下安装pdf2swf Tool
中文支持安装:
1) mkdir –p /usr/share/xpdf
cd /usr/share/xpdf/
2) 下载中文支持及字体库
wget ftp://ftp.foolabs.com/pub/xpdf/xpdf-chinese-simplified.tar.gz
wget
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
4)vi add-to-xpdfrc
内容如下:
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
保存后退出
相关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安装:
1)cd /usr/local/
2)wget
3)tar zxvf swftools-0.9.1.tar.gz
4)cd swftools-0.9.1
5)./configure
6)make
7)make install
8)测试一下是否可用
pdf2swf -o /path/output.swf -T -z -t -f /path/yourpdffile.pdf -s languagedir=/usr/share/xpdf/xpdf-chinese-simplified -s flashversion=9
小意外:
测试环境意外宕机重起后,运行pdf2swf,抛出错误:
pdf2swf: error while loading shared libraries: libjpeg.so.8: cannot open shared object file: No such file or directory
find了一遍,发现libjpeg.so.8被装到了/usr/local/lib下,这不是默认的/lib或/usr/lib目录。问了下google,对于动态库的路径问题有以下三种解决方案
动态库的路径问题
为了让执行程序顺利找到动态库,有三种方法:
(1)把库拷贝到/usr/lib和/lib目录下。
(2)在LD_LIBRARY_PATH环境变量中加上库所在路径。例如动态库libhello.so在/home/ting/lib目录下,以bash为例,使用命令:
$export LD_LIBRARY_PATH=$LD_LIBRARY_PATH:/home/ting/lib
(3) 修改/etc/ld.so.conf文件,把库所在的路径加到文件末尾,并执行ldconfig刷新。这样,加入的目录下的所有库文件都可见。
本人使用了第2种办法,再次运行pdf2swf正常。