linux下用flexpaper做像百度文库和豆丁网一样的在线文档浏览
以下安装步骤在debian5上测试通过
安装JRE
http://blog.linuxphp.org/archives/572/
安装基本包
apt-get install openoffice.org-core openoffice.org-java-common xvfb openoffice.org-writer openoffice.org-calc apt-get install openoffice.org-l10n-zh-cn openoffice.org-l10n-zh-tw python-uno openoffice.org-draw openoffice.org-impress
配置虚拟桌面
Xvfb :1 -screen 0 800x600x24& export DISPLAY=localhost:1
运行soffice服务
soffice -headless -accept="socket,host=127.0.0.1,port=8100;urp;" -nofirststartwizard &
文档转为Pdf(支持多种格式)
unoconv -f pdf mrtg.doc
pdf转为swf
pdf2swf -t mrtg.pdf -o mrtg.swf -s flashversion=9
flexpaper播放
wget http://flexpaper.googlecode.com/files/FlexPaper_1.4.5_flash.zip
解压缩后有个index.html是示例,用到的文件是
flexpaper/js/flexpaper_flash.js flexpaper/FlexPaperViewer.swf
SwfFile参数指定要播放的swf文件路径
问题1
javaldx: Could not find a Java Runtime Environment
如已经配置好JRE还是报错
apt-get install openoffice.org-java-common
问题2
soffice.bin X11 error: Can’t open display
apt-get install xvfb Xvfb :1 -screen 0 800x600x24& export DISPLAY=localhost:1
问题3
unoconv: UnoException during conversion: URL seems to be an unsupported one.
apt-get install openoffice.org-writer openoffice.org-draw openoffice.org-impress python-uno
如果还有问题可能是soffice启动不对,重启下试试
问题4
如果中文乱码
apt-get install openoffice.org-l10n-zh-cn openoffice.org-l10n-zh-tw
仍然不能解决问题,杀死soffice进程,重新启动试试
问题5
unoconv: File could not be loaded by OpenOffice
windows txt文件换行符问题,用程序把"\r\n"替换为"\n"
问题6
Unable to connect or start own listener. Aborting.
使用正确的方法启动soffice如果是soffice -accept=”socket,port=8100;urp;”改为
soffice -headless -accept="socket,host=127.0.0.1,port=8100;urp;" -nofirststartwizard &
参考:
http://www.oschina.net/p/flexpaper
http://hi.baidu.com/lurim/blog/item/7d21f13ea39f22e554e723d8.html
http://rainx.cn/blog/archives/140
http://blog.sina.com.cn/s/blog_502c8cc40100n6zz.html
http://rongjih.blog.163.com/blog/static/33574461201161172331383/
http://www.linux-wiki.cn/index.php/%E6%96%87%E6%A1%A3%E6%A0%BC%E5%BC%8F%E6%89%B9%E9%87%8F%E8%BD%AC%E6%8D%A2(doc,txt,pdf%E7%AD%89)
http://bugs.debian.org/cgi-bin/bugreport.cgi?bug=491456
jadexo 2011, November 7, 3:50 PM
linux下类似百度文库开发研究与实战
缘起
由于项目需要开发了类似百度文库和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 http://www.nginxs.com/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
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 http://www.swftools.org/swftools-0.9.1.tar.gz
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正常。
pdf2swf参数很多,以下参数是经网友翻译后的详细说明:
- -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. 如果运行时间超时则退出。
然后看看-s都可以设置些什么:
PDF Parameters:
PDF device global parameters:
fontdir= a directory with additional fonts 指定字体目录, 与1级参数的-F相若
font= an additional font filename 增加额外的字体文件
pages= the range of pages to convert (example: pages=1-100,210-) 指定页面范围,与1级参数的-p相若
zoom= the resolution (default: 72) 指定分辨率,默认为72dpi
languagedir= Add an xpdf language directory 增加一个xpdf的语言目录,对非西欧字符有用
multiply= Render everything at the resolution 在几倍分辨率下渲染
poly2bitmap Convert graphics to bitmaps 把其中的图形转成点阵
bitmap Convert everything to bitmaps 把所有内容转成点阵(包括字体)
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 快速设置上两个参数
drawonlyshapes convert everything to shapes (currently broken) 所有都转成图形
ignoredraworder allow to perform a few optimizations for creating smaller SWFs 允许执行一些小优化
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的区域大小
dots Take care to handle dots correctly 保存单点显示
reordertags=0/1 (default: 1) perform some tag optimizations 执行某些tag优化
internallinkfunction=<name> when the user clicks a internal link (to a different page) in the converted file, this actionscript function is called 内部链接函数,如果点击一个内部链接,将调用该actionscript函数
externallinkfunction=<name> when the user clicks an external link (e.g. http://www.foo.bar/) on the converted file, this actionscript function is called 外部链接函数,如果点击一个外部链接,将调用该actionscript函数
disable_polygon_conversion never convert strokes to polygons (will remove capstyles and joint styles) 不要将笔画转成多边形
caplinewidth=<width> the minimum thichness a line needs to have so that capstyles become visible (and are converted) 线条最低转换宽度,比这个细的线条将不转换
insertstop put an ActionScript “STOP” tag in every frame 在swf的每个桢中添加stop()函数
protect add a “protect” tag to the file, to prevent loadingin the Flash editor 增加protect标签,禁止在flash中加载该swf
flashversion=<version> the SWF fileversion (6) 设置最低swf版本
framerate=<fps> SWF framerate 设置桢率
minlinewidth=<width> convert horizontal/vertical boxes smaller than thiswidth to lines (0.05)将宽度少于某值的矩形转成线条
simpleviewer Add next/previous buttons to the SWF 使用简单的导航
animate insert a showframe tag after each placeobject (animate draw order of PDF files)
jpegquality=<quality> set compression quality of jpeg images 设置jpeg的压缩质量
splinequality=<value> Set the quality of spline convertion to value (0-100, default: 100). 设置样条曲线的转换质量
disablelinks Disable links. 禁止链接
3.文档转成PDF的Java实现
这篇文档http://blog.zhaojie.me/2010/05/convert-document-to-pdf-via-openoffice.html介绍的很详细,基本上可以照着上面做。虽然是windows下的例子,但在Linux下做稍微改动即可。这里就不贴出代码,列出这部分实现的细节差别:
1) 在Linux下,openoffice默认安装目录到/opt/openoffice,而目录/opt/openoffice.org/basis3.3/program/classes/默认是隐藏的。
在Linux下,所需相关类的路径如下:
/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(按上述文档下载,并上传到这个目录)
2) 如果Eclipse还报找不到import com.sun.star.beans.PropertyValue,那么把/opt/openoffice.org/ure/share/java/ridl.jar也引入。我的Eclipse未报此错误,而我的同事Eclipse却报这个错误。本人猜测可能是同事安装的环境或MAINFEST.MF描述不同引起的,未进一步找出原因。
3) 考虑到多线程应用,重写初始化XCompoentContext对象方法
JAVA代码片段:
[code]
</p>
/**
* 创建一个XComponentContext对象
*
* @return
* @throws Exception
*/
private static XComponentContext createContext(int port) throws Exception {
return BootstrapSocketConnector.bootstrap(HXConstants.OOSYSPATH,"localhost",port);
}
<p align="left">
[/code]
新增传入端口参数,可以支持打开多个openoffice,如果线程多个,需要为每个线程提供不同的端口。
新增传入端口参数,可以支持打开多个openoffice,如果线程多个,需要为每个线程提供不同的端口。
4) 转换类型
输入文档不同,最好选择不同的打印方式,java代码实现
<div>
public static String getConvertType(String extension){
if(extension.matches("doc|docs|txt|rtf|html|htm|xml|odt|wps|wpd")){
return "writer_pdf_Export";
}
if(extension.matches("xls|xlsb|xlsx|ods")){
return "calc_pdf_Export";
}
if(extension.matches("ppt|pptx|odp")){
return "impress_pdf_Export";
}
return "writer_pdf_Export";
}
</div>
<div>[/code]
4.PDF转成SWF的Java实现
代码片段
<div>
/**
* 将pdf文件转化成swf文件
* @param fileName 文件的绝对路径(含文件名和扩展名)
* @param destPath 目标路径 (目标文件夹,不含文件名)
* @return -1:源文件不存在,-2:格式不正确,-3:发生异常,0:转化成功;1:无法打开文件(Process.exitValue())
* @author dongbai
*/
public static int convertPdfToSwf(String fileName,String destPath){
if(null != fileName && fileName.length() > 0){
// String destName = "";
String fileExt = "";
StringBuffer command = new StringBuffer();
Process pro;
BufferedReader buffer;
fileExt = fileName.substring(fileName.lastIndexOf(".")+1, fileName.length()).toLowerCase();
try{
File file = new File(fileName);
if(!file.exists()){//判断源文件是否存在
return ERROR_FILE_NOT_EXIST;
}else if(!fileExt.equals("pdf")){//判断文件是否是pdf格式的文件
return ERROR_WRONG_EXT_NAME;
}
else{
//" -Q 300"参数只在linux下有效
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");
pro = Runtime.getRuntime().exec(command.toString());
buffer = new BufferedReader(new InputStreamReader(pro.getInputStream()));
while(buffer.readLine()!=null);
int rtstate = pro.waitFor();
return rtstate;
}
}catch (Exception e){
System.out.println(e.getMessage());
return ERROR_HAS_EXCEPTION;
}finally{
command=null;
pro=null;
buffer=null;
}
}else{
return ERROR_FILE_NOT_EXIST;
}
}
</div>
<div>[/code]
代码片段说明:
(1)其中一些常量,可以自行定义,HXConstants.PDF2SWF_PATH、HXConstants.LANGDIR分别定义swftool安装路径、中文支持安装路径,为了移植方便,可以配置在properties配置文件里,如:
oosyspath=C:/Program Files/OpenOffice.org 3/program/
pdf2swf=D:/SWFTools/
langdir=/usr/share/xpdf/xpdf-chinese-simplified
发布到linux环境后,修改配置文件即可。
(2)根据需要,可以追加参数,参考本文pdf2swf Tool参数详细说明。
(3) pro.waitFor()与pro.exitValue()的区别,pro.exitValue可以异步处理,你可以根据需求而定。
5.Concurrent线程池实现
1)整体业务描述
(1)首先前台用户提交文档上传。
(2)后台异步处理上传文档。
(3)前台检查后台处理状态,处理完毕显示flexpaper效果,未处理完毕显示其他提示或处于加载中。
2)Concurrent实现任务线程池
(1)实现抓取待处理的任务,放入BlockingQueue,避免重复抓取;
(2)实现多线程处理文档,线程从BlockingQueeu取出一个任务,处理完后把对应的文档数据置成处理完成状态。
见博客”一个任务队列的BlockingQueue实现”。
6.FlexPaper源码初步说明及改造
1)研究历程
FlexPaper是一套开源系统,用于展示swftool生成的swf,通过参数设置能达到比较好的展示效果,FlexPaper遵循GNU GPL协议。项目地址:
http://code.google.com/p/flexpaper/
源码地址:
http://flexpaper.googlecode.com/svn/trunk/
如果你不介意FlexPaper播放的时候带有其自带的logo标签,下载trunk下的Example,里面有详细的例子。如果你要对播放器进行一些修改,比如要去掉其自带的logo,那就要对FlexPaper进行重新编译。可以看到trunk下有FlexPaper项目和FlexPaper_SDK4项目,两者的区别主要是Flex SDK版本,前者使用Flex SDK3.5,后者使用Flex SDK4及以上版本,其次FlexPaper_SDK4在我下载时还只有beta版,下载后导入4.0对应的FlexPaper_SDK4.swc编译不能通过,因此当前时间还是选择FlexPaper项目比较稳妥。在Eclipse(安装Flash Builder插件)下通过svn检出项目即可,检出后会自动成了Flex库项目,完成编译后,可以看到在目录bin下编译产生的FlexPaper.swc文件。
提示: 如果在编译过程中报错:1046: 找不到类型,或者它不是编译时常数: Vector。
把Flex编译器Adobe Flash Player选项选种:使用特定版本(v):10.0.0,而Flex3.5默认的设置是9.0.0
还需要在资源加入local\{local},如果编译还报local错误,那就把local直接拷贝到sdks\3.5.0\frameworks\local下。
弯路1:本人一开始以为直接生成FlexPaperViewer.swf,对检出Flex库项目很纳闷,然后就自己创建Flash web类型的项目,再通过svn检出,又手动把项目下的FlexPaperViewer.mxml设置成默认运行,这样是生成了FlexPaperViewer.swf,但打开FlexPaperViewer.swf发现只有灰色或黑色的背景。在浪费大半天时间后,在同事提醒下才搞明白原来此FlexPaperViewer.mxml非Example项目下直接编译生成的FlexPaperViewer.swf。这该死的命名,对刚接触的人来说是太容易产生联想了。
弯路2:那就自己写一个FlexPaperViewer.mxml,或者干脆不要取这个名也可以,容易产生混淆。网上找到一个,引入重新编译过的FlexPaper.swc,编译成功,打开后界面也出来了。但在加载指定的SwfFile时一直加载不出来,右上角的菊花一直在转。怀疑是不是自编译的FlexPaper.swc有问题,上官网下载官方的FlexPaper.swc,还是不行……,周末后家里的开发环境又折腾了大半天,中间还下了个flash反编译软件,打算对Example下的FlexPaperView.swf进行反编译,可惜目前大多反编译软件只有反编译成.fla或.as,最终反编译也只能作罢。回到正路,终于找到比较完整的FlexPaperViewr.mxml。
2) FlexPaperView.mxml的实现
完整代码:
<div>
<?xml version="1.0" encoding="utf-8"?>
<mx:Application xmlns:mx="<a href="http://www.adobe.com/2006/mxml">http://www.adobe.com/2006/mxml</a>"
xmlns:fp="com.devaldi.controls.flexpaper.*"
layout="absolute" width="100%" height="100%"
applicationComplete="initApp();">
<mx:Script>
<![CDATA[
import mx.controls.Alert;
public var _aid = 0;//文档ID
[Bindable]
public var _Scale:Number = 1;//缩放比例
[Bindable]
public var _SwfFile:String = "";//SWF文件路径
[Bindable]
public var _ZoomTransition:String = "easeOut";
[Bindable]
public var _ZoomTime:Number = 0.6;
[Bindable]
public var _ZoomInterval:Number = 0.1;
[Bindable]
public var _FitPageOnLoad:Boolean = false;//加载后适合高度
[Bindable]
public var _FitWidthOnLoad:Boolean = false;//加载后适合宽度
[Bindable]
public var _PrintEnabled:Boolean = true;//是否支持打印
[Bindable]
public var _FullScreenAsMaxWindow:Boolean = false;//是否支付全屏
[Bindable]
public var _ProgressiveLoading:Boolean = false;//是否延迟加载
[Bindable]
public var _MinZoomSize:Number = 0.3;
[Bindable]
public var _MaxZoomSize:Number = 5;
[Bindable]
public var _SearchMatchAll:Boolean = false;
[Bindable]
public var _ViewModeToolsVisible:Boolean = true;
[Bindable]
public var _ZoomToolsVisible:Boolean = true;
[Bindable]
public var _NavToolsVisible:Boolean = true;
[Bindable]
public var _CursorToolsVisible:Boolean = true;
[Bindable]
public var _SearchToolsVisible:Boolean = true;
[Bindable]
public var _localeChain:String = "zh_CN";//语言
private var isFocus:Boolean = false;
//初始化参数
private function initApp():void{
var params:Object = Application.application.parameters;
_Scale = getNumber(params, "Scale", 1);
_SwfFile = getString(params, "SwfFile", "Paper.swf");
_ZoomTransition = getString(params, "ZoomTransition", "easeOut");
_ZoomTime = getNumber(params, "ZoomTime", 0.6);
_ZoomInterval = getNumber(params, "ZoomInterval", 0.1);
_FitPageOnLoad = getBoolean(params, "FitPageOnLoad", false);
_FitWidthOnLoad = getBoolean(params, "FitWidthOnLoad", false);
_PrintEnabled = getBoolean(params, "PrintEnabled", true);
_FullScreenAsMaxWindow = getBoolean(params, "FullScreenAsMaxWindow", false);
_ProgressiveLoading = getBoolean(params, "ProgressiveLoading", true);
_MinZoomSize = getNumber(params, "MinZoomSize", 0.3);
_MaxZoomSize = getNumber(params, "MaxZoomSize", 5);
_SearchMatchAll = getBoolean(params, "SearchMatchAll", true);
_ViewModeToolsVisible = getBoolean(params, "ViewModeToolsVisible", true);
_ZoomToolsVisible = getBoolean(params, "ZoomToolsVisible", true);
_NavToolsVisible=getBoolean(params,"NavToolsVisible",true);
_CursorToolsVisible=getBoolean(params,"_CursorToolsVisible",true);
_SearchToolsVisible=getBoolean(params,"_SearchToolsVisible",true);
_localeChain = params["localeChain"];
//注册事件监听
this.addEventListener(MouseEvent.MOUSE_OVER, onMouseOver);
this.addEventListener(MouseEvent.MOUSE_OUT, onMouseOut);
//开放给外部(javascript)调用
ExternalInterface.addCallback("hasFocus", hasFocus);
//ExternalInterface.addCallback("focus", focus);
ExternalInterface.addCallback("setViewerFocus", setViewerFocus);
}
private function onMouseOver(event:MouseEvent):void{
this.isFocus = true;
}
private function onMouseOut(event:MouseEvent):void{
this.isFocus = false;
}
public function hasFocus():Boolean{
//Alert.show("hasFocus");
return isFocus;
}
public function setViewerFocus(isFocus:Boolean):void{
//Alert.show("setViewerFocus");
this.paperViewer.setViewerFocus();
}
/**
*
* 获取String类型参数
* 如果没有,则返回默认值
**/
private function getString(params:Object, name:String, def:String):String{
if(params[name] != null){
return params[name];
}
return def;
}
private function getNumber(params:Object, name:String, def:Number):Number{
if(params[name] != null){
return params[name];
}
return def;
}
private function getBoolean(params:Object, name:String, def:Boolean):Boolean{
//Alert.show("比较:"+name);
if(params[name] != null){
return params[name] == "true";
}
return def;
}
]]>
</mx:Script>
<!–mx:Panel x="165" y="76" width="250" height="200" layout="absolute" title="一个人">
<mx:Label x="59" y="37" text="{Scale}" width="88"/>
</mx:Panel–>
<fp:FlexPaperViewer id="paperViewer"
width="100%"
height="100%"
Scale="{_Scale}"
SwfFile="{_SwfFile}"
ZoomTransition="{_ZoomTransition}"
ZoomTime="{_ZoomTime}"
ZoomInterval="{_ZoomInterval}"
FitPageOnLoad="{_FitPageOnLoad}"
FitWidthOnLoad="{_FitWidthOnLoad}"
FullScreenAsMaxWindow="{_FullScreenAsMaxWindow}"
ProgressiveLoading="{_ProgressiveLoading}"
MinZoomSize="{_MinZoomSize}"
MaxZoomSize="{_MaxZoomSize}"
SearchMatchAll="{_SearchMatchAll}"
ViewModeToolsVisible="{_ViewModeToolsVisible}"
ZoomToolsVisible="{_ZoomToolsVisible}"
NavToolsVisible="{_NavToolsVisible}"
CursorToolsVisible="{_CursorToolsVisible}"
SearchToolsVisible="{_SearchToolsVisible}"
/>
</mx:Application>
</div>
<div>[/code]
3)FlexPaper去掉logo实现
右上方的Logo修改:在FlexPaper项目的FlexPaperView.xml做修改,很容易找到;
右下方的Logo修改:在FlexPaper项目的Viewer.as,主要对成员变量_skinImgDo做注释,其中有一行代码addChildAt改成addChildAt (_paperContainer,1);
重新编译后,再次编译FlexPaperView.xml,在FlexPaperView.html传入正确的SwfFile参数,右角的转动菊花终于消失了,看到了想要的效果。
发布到正式环境问题的暴露及校正
在布署到正式环境过程中,发现两个问题
1)虽然openoffice通过rpm方式来安装都未出错,而且服务也能正常起来,但在java应用在执行调用createContext(int port)会出现退出线程的情况。查找了各种原因后,最后发现是因为测试环境安装了xwindow的原因,看来图形相关包的支持是必须的,如下:
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服务需要启动
在linux,安装完openoffice后,需要启动soffice服务:/opt/openoffice.org3/program/soffice -headless -accept=”socket,host=127.0.0.1,port=8100;urp;”
-nofirststartwizard & 如没有启动服务,执行文档转换服务会出错。
Linux find查找文件及grep查找文件内容
Linux 下提供完善的文件及文件内容查找命令,分别介绍如下:
文件查找命令find
find 命令用于查找文件系统中的指定文件,其命令格式为:
find 要查找的路径表达式
例如:
find . -name 1.txt 在当前目录及其子目录下查找文件 “1.txt”;
find /tmp -name 1.txt 在 “/tmp” 目录及其子目录下查找文件“1.txt”。
文件内容查找命令grep
grep 命令用于查找指定的模式匹配,格式为:
grep [命令选项] 要查找的匹配模式 [要查找的文件]
例如:
grep cams test.txt 在 “test.txt” 文件中查找cams 字符串;
grep -r cams /root/cams 在 “/root/cams” 目录及其子目录下的所有文件中,查找cams 字符串;
grep 命令除了能够查找文件外,还能够将任意输出流重定向到grep 进行查找:
ps -ef | grep ora 查找进程名中包含 “ora” 的所有进程信息。
Linux 查看目录大小及文件数量命令
查看当前目录大小:
查看指定目录大小:
查看当前目录文件总数:
查看指定目录文件总数:
查看当前目录的目录总数:
查看指定目录的目录总数:
Linux下查看用户列表
俺的centos vps上面不知道添加了多少个账户,今天想清理一下,但是以前还未查看过linux用户列表,google了一下,找到方便的放:
一般情况下是
w 可以查看当前活跃的用户列表
cat /etc/group 查看用户组
但是这样出来的结果一大堆,看起来嘿负责,于是继续google
找到个简明的layout命令
linux文件和文件夹权限
快餐阅读的年代,继续用简约的几句话来描述。
linux下,每个文件和文件夹都是有权限的,他们分为可读、可写和可执行,默认的权限并不是和window一样:可读+可写+可执行;
linux下用户的对文件的控制是非常严格的,所以文件若需要任何人都可写,必须设置成 可读+可写,可读+可写的数字组合就是4+2=6 (所有人6 组成员6 公共成员6),即设置成0666;
linux下文件的可执行和win不一样,不靠后缀名来区分,因此linux下需要对可执行文件赋予可执行属性数字即为1,可以可读+可写+可执行=4+2+1,那么给三种用户都设置全属性就是 0777;
文件夹的打开即可理解成象文件夹发送了执行命令,所以文件夹没有可执行的属性,其他用户是无法打开的;
重要的来了,大家在ftp下或者在shell中用简单的chmod 0777 dir来对一个文件夹进行修改,记住,<strong>该文件夹下的所有文件不会自动继承0777属性</strong>,这个和你在windows下设置共享文件夹不是一样的效果,很多朋友犯了这样的错误,还理直气壮的说我已经把web根目录属性都设置成了0777,为何我的wordpress后台还无法在线更改。答案很简单:那是因为你所更改的那个php文件依然不是公共可读写属性,即0777;
即使文件夹属性为0777,也并不表示该文件夹下的所有文件就可以随意读写,这些文件依然有他们自身的属性,所以你必须将你需要修改的文件设置成0666;
记住:web根目录不要设置成0777,这有安全隐患。有php文件的目录也最好不要设置成0777.
此日志结束,不懂的在评论中留言,高手也请出山指点!
linux目录树结构
/ 根目录
│
├boot/ Linux的内核及系统引导程序所需要的文件目录
│ └grub/ Grub引导器相关的文件
│
├dev/ 设备文件存储目录,比如声卡、磁盘…
├proc/ 内核与进程镜像
│
├mnt/ 临时挂载
├media/ 挂载媒体设备
│
├root/ root用户的$HOME目录
├home/ 普通用户的$HOME目录
│ ├user/
│ └…/
│
├bin/ 程序命令所在目录 功能和/usr/bin类似
├sbin/ 系统管理员常用指令
├lib/ 系统程序库文件
├etc/ 系统程序和大部分应用程序的全局配置文件
│ ├init.d/ SystemV风格的启动脚本
│ ├rcX.d/ 启动脚本的链接,定义运行级别
│ ├network/ 网络配置文件
│ ├X11/ 图形界面配置文件
│
├usr/ 系统存放程序的目录 包含很多目录
│ ├bin/ 应用程序
│ ├sbin/ 管理员应用程序
│ ├lib/ 应用程序库文件
│ ├share/ 应用程序资源文件
│ ├src/ 应用程序源代码
│ ├local/
│ │ ├soft/ 用户程序
│ │ └…/ 通常使用单独文件夹
│ ├X11R6/ 图形界面系统
│
├var/ 动态数据 摆放系统记录文件的地方 这个目录的内容是经常变动的
│
├temp/ 临时文件
├lost+found/ 摆放系统不正常产生错误时丢失的片段
linode linux vps配置apache伪静态wordpress教程(centos)
刚刚在测试安装wordpress程序后一切正常,但是伪静态实现不了。看来之前apache的伪静态没有配置完善。查找资料及朋友帮忙,终于解决。需要配置如下步骤:
第一.修改apache配置 开启加载(rewrite)重写模块
1. cd /etc/httpd/conf/
2. vi httpd.conf
3. 找到其中的LoadModule rewrite_module modules/mod_rewrite.so
4. 如果没有或者前面带有“#”,则相应的添加此行或者取消注释#
第二,修改AllowOverride属性
Options FollowSymLinks
AllowOverride None 改为All
重启apach.去你的WORDPRESS后台更新固定链接即可。自动会在根目录生成.htaccess文件的。
本文来自: 美国主机评论博客(www.yd631.com) 详细出处参考:http://www.yd631.com/linux-vps-apache-rewrite/
Linux VPS/服务器 网站及数据库自动本地备份并FTP上传备份脚本
从VPS侦探建站之初就一直在重申一定要备份好自己的数据,因为太多的不确定性可能会造成数据库丢失,而且大部分VPS服务商也不可能提供每天备份数据。
原来VPS侦探提供过一个VPS备份方法,只是略微说了一下,可能部分新手会不太好入手。今天VPS侦探分享一个自己的备份脚本。
准备工作:
需要提前在VPS安装好lftp,lftp功能上比较强大,CentOS直接执行:yum install lftp,Debian执行:apt-get install lftp 。
需要在VPS上创建/home/backup/ 目录,在FTP上创建backup目录。
如果VPS上数据库不多的话使用Godaddy的免费空间就可以(10GB空间,300GB流量),只要注册个域名就免费送。
下面将备份脚本进行部分注释:
#!/bin/bash
#Funciont: Backup website and mysql database
#Author: licess
#Website: http://lnmp.org
#IMPORTANT!!!Please Setting the following Values!
######~Set Directory you want to backup~######将下面的目录修改成自己要备份的目录,一般按我的都是在/home/wwwroot/下面所有直接写了需要备份的目录。可以继续再加:Backup_Dir5=你的目录 ,Backup_Dir后面的数字依次递增。如果不足4个,直接删除不需要的就可以,同时修改下面tar zcf 部分。
Backup_Dir1=vpser.net
Backup_Dir2=lnmp.org
Backup_Dir3=licess.org
Backup_Dir4=jungehost.com
######~Set MySQL UserName and password~######设置MySQL的用户名和密码,最好是root,其他用户可能因为权限问题无法导出部分数据库。
MYSQL_UserName=root
MYSQL_PassWord=yourmysqlrootpassword
######~Set MySQL Database you want to backup~######设置要部分的数据库,可以继续再加:Backup_Database_Name5=数据库名,Backup_Database_Name后面的数字依次递增。
Backup_Database_Name1=vpser
Backup_Database_Name2=licess
Backup_Database_Name3=junge
Backup_Database_Name4=vpserorg
######~Set FTP Information~######设置用来存放备份数据的FTP信息
FTP_HostName=184.168.192.43 //FTP服务器的IP或者域名
FTP_UserName=vpsernet //FTP服务器用户名
FTP_PassWord=yourftppassword //FTP服务器用户对应的密码
FTP_BackupDir=backup //备份到FTP上的目录,需要提前创建好。
#Values Setting END!
TodayWWWBackup=www-*-$(date +"%Y%m%d").tar.gz
TodayDBBackup=db-*-$(date +"%Y%m%d").sql
OldWWWBackup=www-*-$(date -d -3day +"%Y%m%d").tar.gz
OldDBBackup=db-*-$(date -d -3day +"%Y%m%d").sql
tar zcf /home/backup/www-$Backup_Dir1-$(date +"%Y%m%d").tar.gz -C /home/wwwroot/ $Backup_Dir1 –exclude=soft
tar zcf /home/backup/www-$Backup_Dir2-$(date +"%Y%m%d").tar.gz -C /home/wwwroot/ $Backup_Dir2
tar zcf /home/backup/www-$Backup_Dir3-$(date +"%Y%m%d").tar.gz -C /home/wwwroot/ $Backup_Dir3 –exclude=test
tar zcf /home/backup/www-$Backup_Dir4-$(date +"%Y%m%d").tar.gz -C /home/wwwroot/ $Backup_Dir4
###上面为备份网站文件数据,因为我的网站比较零散,而且网站目录下面有些目录属于临时目录并不需要备份,所以可以在上面加上–exclude=不备份的目录。如果在前面加了Backup_Dir5=yourdir,则再加tar zcf /home/backup/www-$Backup_Dir5-$(date +"%Y%m%d").tar.gz -C
/home/wwwroot/ $Backup_Dir5 。如果多余则删除多余行。
/usr/local/mysql/bin/mysqldump -u$MYSQL_UserName -p$MYSQL_PassWord $Backup_Database_Name1 > /home/backup/db-$Backup_Database_Name1-$(date +"%Y%m%d").sql
/usr/local/mysql/bin/mysqldump -u$MYSQL_UserName -p$MYSQL_PassWord $Backup_Database_Name2 > /home/backup/db-$Backup_Database_Name2-$(date +"%Y%m%d").sql
/usr/local/mysql/bin/mysqldump -u$MYSQL_UserName -p$MYSQL_PassWord $Backup_Database_Name3 > /home/backup/db-$Backup_Database_Name3-$(date +"%Y%m%d").sql
/usr/local/mysql/bin/mysqldump -u$MYSQL_UserName -p$MYSQL_PassWord $Backup_Database_Name4 > /home/backup/db-$Backup_Database_Name4-$(date +"%Y%m%d").sql
###上面为备份MySQL数据库,如果在前面加了Backup_Database_Name5=yourdatabasename,则再加/usr/local/mysql/bin/mysqldump -u$MYSQL_UserName -p$MYSQL_PassWord $Backup_Database_Name5 > /home/backup/db-$Backup_Database_Name5-$(date +"%Y%m%d").sql 。如果多余则删除多余行。
rm $OldWWWBackup
rm $OldDBBackup
###删除3天前的备份###
cd /home/backup/
###下面为自动上传部分,不得不说lftp很强大,抛弃ftp吧####
lftp $FTP_HostName -u $FTP_UserName,$FTP_PassWord << EOF
cd $FTP_BackupDir
mrm $OldWWWBackup
mrm $OldDBBackup
mput $TodayWWWBackup
mput $TodayDBBackup
bye
EOF
脚本下载地址:http://soft.vpser.net/lnmp/backup.sh
下载脚本,将脚本放到/root/ 下面,按上面的注释修改脚本中的参数,并保存,如果不熟悉vi或者nano编辑器,可以用winscp,执行:chmod +x /root/backup.sh 为脚本添加执行权限,执行:crontab -e 添加定时执行
在crontab中加入:0 3 * * * /root/backup.sh
凌晨3点自动执行/root/bakcup.sh 脚本,备份vps上的数据并上传到FTP上。
如果在使用过程中有任何问题请直接留言,或到VPS论坛发贴。原创文章,禁止转载!
>>转载请注明出处:VPS侦探 本文链接地址:http://www.vpser.net/security/linux-autobackup-ftp.html