您的位置:首页 > 编程语言 > ASP

PDF在线预览 (flexpaper+swftools+saveaspdfandxps)

2013-11-07 15:24 501 查看
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,然后实现在线浏览。

view source

print?

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
 
};
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: