使用jodconverter和swftools实现文件在线预览
参考:仿百度文库解决方案(四)——利用JODConverter调用OpenOffice.org服务转换文档为PDF
文档在线预览主要用到如下两个工具
1,安装openoffice(同时下载jodconverter.jar,依赖commons-io等包)(将doc/ppt等文档转换为pdf需要用到)
2,安装swftools 0.9.2(依赖gcc/gcc-c++/make等工具)(将pdf转换为swf需要用到) 如果安装swftools出现如下问题: * The following headers/libraries are missing: jpeglib t1lib ungif jpeglib.h freetype t1lib.h gif_lib.h
* Disabling pdf2swf tool...
* Disabling jpeg2swf tool...
* Disabling gif2swf tool... zypper install t1lib-devel freetype2-devel giflib-devel libjpeg-devel
java代码目录如下:
$ ls -R *
com:
test com/test:
DocConverter.class FileUtils.class OpenOfficePDFConverter.class SWFToolsSWFConverter.class TestDocConverter.class
DocConverter.java FileUtils.java OpenOfficePDFConverter.java SWFToolsSWFConverter.java TestDocConverter.java libs:
commons-io-2.4-javadoc.jar commons-io-2.4-test-sources.jar commons-io-2.4.jar juh-3.2.1.jar ridl-3.2.1.jar
commons-io-2.4-sources.jar commons-io-2.4-tests.jar jodconverter-core-3.0-beta-4.jar jurt-3.2.1.jar unoil-3.2.1.jar
核心转换源代码如下:
doc/ppt/xls转pdf
// com/text/OpenOfficePDFConverter.java
package com.test; import java.io.File;
import java.io.FileNotFoundException; import org.artofsolving.jodconverter.OfficeDocumentConverter;
import org.artofsolving.jodconverter.office.DefaultOfficeManagerConfiguration;
import org.artofsolving.jodconverter.office.OfficeManager; import com.test.FileUtils; public class OpenOfficePDFConverter{ private static OfficeManager officeManager;
private static String OFFICE_HOME = "/usr/lib64/libreoffice";
private static int port[] = {8100}; public void convert2PDF(String inputFile, String pdfFile) { if(inputFile.endsWith(".txt")){
String odtFile = FileUtils.getFilePrefix(inputFile)+".odt";
if(new File(odtFile).exists()){
inputFile = odtFile;
}else{
try {
FileUtils.copyFile(inputFile,odtFile);
inputFile = odtFile;
} catch (FileNotFoundException e) {
e.printStackTrace();
}
}
} startService();
OfficeDocumentConverter converter = new OfficeDocumentConverter(officeManager);
converter.convert(new File(inputFile),new File(pdfFile));
stopService();
} public void convert2PDF(String inputFile) {
String pdfFile = FileUtils.getFilePrefix(inputFile)+".pdf";
convert2PDF(inputFile,pdfFile);
} public static void startService(){
DefaultOfficeManagerConfiguration configuration = new DefaultOfficeManagerConfiguration();
try {
configuration.setOfficeHome(OFFICE_HOME);//设置OpenOffice.org安装目录
configuration.setPortNumbers(port); //设置转换端口,默认为8100
configuration.setTaskExecutionTimeout(1000 * 60 * 5L);//设置任务执行超时为5分钟
configuration.setTaskQueueTimeout(1000 * 60 * 60 * 24L);//设置任务队列超时为24小时 officeManager = configuration.buildOfficeManager();
officeManager.start(); //启动服务
} catch (Exception ce) {
System.out.println("office转换服务启动失败!详细信息:" + ce);
}
} public static void stopService(){
if (officeManager != null) {
officeManager.stop();
}
}
}
pdf转swf
// com/test/SWFToolsSWFConverter.java
package com.test; import java.io.File;
import java.io.IOException; import com.test.FileUtils; public class SWFToolsSWFConverter{ private static String PDF2SWF_PATH = "/usr/local/bin/pdf2swf"; public void convert2SWF(String inputFile, String swfFile) {
File pdfFile = new File(inputFile);
File outFile = new File(swfFile);
if(!inputFile.endsWith(".pdf")){
return ;
}
if(!pdfFile.exists()){
return ;
}
if(outFile.exists()){
return ;
}
String command = PDF2SWF_PATH +" "+inputFile+" -o "+swfFile+" -f -T 9 -t -s storeallcharacters";
try {
Runtime.getRuntime().exec(command);
} catch (Exception e) {
e.printStackTrace();
System.out.println("转换文档为swf文件失败!");
} } public void convert2SWF(String inputFile) {
String swfFile = FileUtils.getFilePrefix(inputFile)+".swf";
convert2SWF(inputFile,swfFile);
} }
结合两个转换器
package com.test; import com.test.OpenOfficePDFConverter;
import com.test.SWFToolsSWFConverter; public class TestDocConverter {
public static void main(String[]args){
OpenOfficePDFConverter pdfConverter = new OpenOfficePDFConverter();
SWFToolsSWFConverter swfConverter = new SWFToolsSWFConverter();
DocConverter converter = new DocConverter(pdfConverter, swfConverter);
String pptFile = args[0];
converter.convert(pptFile);
}
}
命令行执行方式如下(生成pdf文件及swf文件)
javac -cp .:libs/* com/test/*.java
java -cp .:libs/* com/test/TestDocConverter uploads/b.txt
(pdf2swf $targetFile -o $targetFile.swf -f -T 9 -t -s storeallcharacters)
注:如果中文乱码,则将simsun.ttc文件放到liboffice的字体目录下,然后如果root用户转pdf不乱码,非root用户乱码,则将字体文件再方一份到/usr/share/font/truetype/
php 上传代码:
<?php //print error msg
ini_set('display_errors',1);
error_reporting(E_ALL); $targetFolder = '/uploads'; // Relative to the root if (!empty($_FILES)) {
$tempFile = $_FILES['Filedata']['tmp_name'];
$targetPath = $_SERVER['DOCUMENT_ROOT'] . $targetFolder;
$targetFile = rtrim($targetPath,'/') . '/' . $_FILES['Filedata']['name']; $fileTypes = array('txt','doc','xls','ppt','docx',
'xlsx','pptx','pdf'); // File extensions
$fileParts = pathinfo($_FILES['Filedata']['name']);
$fileParts2 = pathinfo($tempFile); if (in_array($fileParts['extension'],$fileTypes)) {
$targetFile = rtrim($targetPath,'/') . '/' . $fileParts2["filename"].".".$fileParts['extension'];
move_uploaded_file($tempFile,$targetFile);
if ($fileParts['extension'] != "pdf") {
$ret = system("cd tool;/usr/bin/java -cp .:libs/* com/test/TestDocConverter $targetFile", $res);
$targetFile = str_replace(".".$fileParts['extension'],".swf", $targetFile);
$path = str_replace("/usr/local/nginx/htdocs","",$targetFile);
} else {
exec("pdf2swf $targetFile -o $targetFile.swf -f -T 9 -t -s storeallcharacters");
$path = str_replace("/usr/local/nginx/htdocs","",$targetFile.".swf");
} header("Location: ./view.php?path=".urlencode($path));
echo '1';
} else {
echo 'Invalid file type.';
}
}
?>
用flexpaper显示如下:(view.php)
<script type="text/javascript"> $('#documentViewer').FlexPaperViewer(
{ config : { SWFFile : '<?php
echo urldecode($_GET["path"]);
?>', Scale : 0.9,
ZoomTransition : 'easeOut',
ZoomTime : 0.5,
ZoomInterval : 0.2,
FitPageOnLoad : false,
FitWidthOnLoad : true,
FullScreenAsMaxWindow : true,
ProgressiveLoading : false,
MinZoomSize : 0.2,
MaxZoomSize : 5,
SearchMatchAll : false,
InitViewMode : 'Portrait',
RenderingOrder : 'flash',
StartAtPage : '', ViewModeToolsVisible : false,
ZoomToolsVisible : false,
NavToolsVisible : false,
CursorToolsVisible : false,
SearchToolsVisible : false,
WMode : 'window',
localeChain: 'en_US'
}}
);
</script>
测试了一下转换效果不是很理想,如果文件有中文字体,很容易乱码及文件无法转换的问题,尤其是pdf转swf这一步,失败率较高。
使用jodconverter和swftools实现文件在线预览的更多相关文章
- 文件在线预览doc,docx转换pdf(一)
文件在线预览doc,docx转换pdf(一) 1. 前言 文档转换是一个是一块硬骨头,但是也是必不可少的,我们正好做的知识库产品中,也面临着同样的问题,文档转换,精准的全文搜索,知识的转换率,是知识库 ...
- asp.net word ecxel类型文件在线预览
asp.net word ecxel类型文件在线预览 首先得引用COM: Microsoft Excel 10 Object Library Microsoft Word 10 Object Libr ...
- 使用PDF.JS实现pdf文件在线预览时,报文件被损坏的错误
首先大概说明一下问题出现的背景:我用PDF.JS实现文件在线预览,参考网上的办法,在jsp文件中使用 <iframe src="<c:url value="js/gen ...
- 网页中动态嵌入PDF文件/在线预览PDF内容https://www.cnblogs.com/xgyy/p/6119459.html
#网页中动态嵌入PDF文件/在线预览PDF内容# 摘要:在web开发时我们有时会需要在线预览PDF内容,在线嵌入pdf文件: 问题1:如何网页中嵌入PDF: 在网页中: 常用的几种PDF预览代码片段如 ...
- C# WebAPI 文件在线预览
最近在写一个移动端API接口,其中有一个需求:接口返回附件url地址让手机端调用实现文件在线预览.大体实现思路:把doc.xls等文本格式文件转换为pdf,转换后的pdf文件存放在服务器上面,方便第二 ...
- kkfileview v2.0 发布,文件在线预览项目方案
kkfileview文件在线预览 此项目为文件文档在线预览项目解决方案,项目使用流行的spring boot搭建,易上手和部署,部署好后可以独立提供预览服务,使用http接口访问,不需要和应用集成,具 ...
- 基于开源方案构建统一的文件在线预览与office协同编辑平台的架构与实现历程
大家好,又见面了. 在构建业务系统的时候,经常会涉及到对附件的支持,继而又会引申出对附件在线预览.在线编辑.多人协同编辑等种种能力的诉求. 对于人力不是特别充裕.或者项目投入预期规划不是特别大的公司或 ...
- Java+FlexPaper+swfTools 文档在线预览demo
1.概述 主要原理 1.通过第三方工具openoffice,将word.excel.ppt.txt等文件转换为pdf文件 2.通过swfTools将pdf文件转换成swf格式的文件 3.通过FlexP ...
- office文件在线预览,模仿网易邮箱在线预览的
最近研究了半天,代码是倾情奉送啊,C#,asp.net的 这个原理是office文件转换为PDF文件,然后再转换成SWF文件,FlexPaper+swfTools. 有个问题,需要在web.confi ...
随机推荐
- C#实现多态之一抽象
1. 抽象类.抽象方法.抽象属性的特点 (1) 关键字:abstract (2) 抽象类只能是其他类的基类 (3) 抽象成员必须存在于抽象类中,但抽象类可以没有抽象成员, ...
- linq中的cast<T>()及OfType<T>()
DataTable dt=...........//获取从数据库中取出的数据(假设只有一条记录) //Cast<T>()用来将非泛型的序列转换为泛型的序列 DataRow row=dt.R ...
- Android 利用摄像头指尖测试心率
过摄像头来获得心率,搜了一下这个技术真不是噱头,据说在iPhone早有实现,主要原理是:当打开软件时,手机的闪光灯也会被自动打开,用户将手指放在摄像头上时,指尖皮下血管由于有血液被压入,被光源照射的手 ...
- 0622 python 基础05
使用双重for循环,打印 0~100 # -*- coding: utf-8 -*- # D:\python\test.py def printOneToHundred(): for i in ...
- 关于scanf("%c",&ch)直接跳过的问题
有时候scanf("%c",&ch)本应该阻塞等待用户输入一个char型数据的,但为什么会跳过呢? 例:在该程序段中, int year; printf(" ...
- codeblock编译Object-C
http://blog.csdn.net/ldl22847/article/details/7482971 http://www.cnblogs.com/qingyuan/p/3524791.html ...
- Visual Studio 中用管理员权限运行、调试程序
原文:Visual Studio 中用管理员权限运行.调试程序 一个Sample小程序,用于验证WoW64的Windows Registry的读写访问.在Visual Studio 2010中调试运行 ...
- 使用LAMP创建基于wordpress的个从博客站点
參考: http://blog.csdn.net/ck_boss/article/details/27866117 一.mysql配置 1.安装mysql yum install mysql-serv ...
- linux内核之网络协议栈
https://www.ibm.com/developerworks/cn/linux/l-ntflt/
- JS+canvas实现人机大战之五子棋
效果图: html代码如下: <!DOCTYPE html><html> <head> <meta charset="utf-8 ...