参考:仿百度文库解决方案(四)——利用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实现文件在线预览的更多相关文章

  1. 文件在线预览doc,docx转换pdf(一)

    文件在线预览doc,docx转换pdf(一) 1. 前言 文档转换是一个是一块硬骨头,但是也是必不可少的,我们正好做的知识库产品中,也面临着同样的问题,文档转换,精准的全文搜索,知识的转换率,是知识库 ...

  2. asp.net word ecxel类型文件在线预览

    asp.net word ecxel类型文件在线预览 首先得引用COM: Microsoft Excel 10 Object Library Microsoft Word 10 Object Libr ...

  3. 使用PDF.JS实现pdf文件在线预览时,报文件被损坏的错误

    首先大概说明一下问题出现的背景:我用PDF.JS实现文件在线预览,参考网上的办法,在jsp文件中使用 <iframe src="<c:url value="js/gen ...

  4. 网页中动态嵌入PDF文件/在线预览PDF内容https://www.cnblogs.com/xgyy/p/6119459.html

    #网页中动态嵌入PDF文件/在线预览PDF内容# 摘要:在web开发时我们有时会需要在线预览PDF内容,在线嵌入pdf文件: 问题1:如何网页中嵌入PDF: 在网页中: 常用的几种PDF预览代码片段如 ...

  5. C# WebAPI 文件在线预览

    最近在写一个移动端API接口,其中有一个需求:接口返回附件url地址让手机端调用实现文件在线预览.大体实现思路:把doc.xls等文本格式文件转换为pdf,转换后的pdf文件存放在服务器上面,方便第二 ...

  6. kkfileview v2.0 发布,文件在线预览项目方案

    kkfileview文件在线预览 此项目为文件文档在线预览项目解决方案,项目使用流行的spring boot搭建,易上手和部署,部署好后可以独立提供预览服务,使用http接口访问,不需要和应用集成,具 ...

  7. 基于开源方案构建统一的文件在线预览与office协同编辑平台的架构与实现历程

    大家好,又见面了. 在构建业务系统的时候,经常会涉及到对附件的支持,继而又会引申出对附件在线预览.在线编辑.多人协同编辑等种种能力的诉求. 对于人力不是特别充裕.或者项目投入预期规划不是特别大的公司或 ...

  8. Java+FlexPaper+swfTools 文档在线预览demo

    1.概述 主要原理 1.通过第三方工具openoffice,将word.excel.ppt.txt等文件转换为pdf文件 2.通过swfTools将pdf文件转换成swf格式的文件 3.通过FlexP ...

  9. office文件在线预览,模仿网易邮箱在线预览的

    最近研究了半天,代码是倾情奉送啊,C#,asp.net的 这个原理是office文件转换为PDF文件,然后再转换成SWF文件,FlexPaper+swfTools. 有个问题,需要在web.confi ...

随机推荐

  1. 堆分配与栈分配---SAP C++电面(5)/FEI

    一直以来总是对这个问题的认识比较朦胧,我相信很多朋友也是这样的,总是听到内存一会在栈上分配,一会又在堆上分配,那么它们之间到底是怎么的区别呢?为了说明这个问题,我们先来看一下内存内部的组织情况. 从上 ...

  2. Oracle包的概念

    转自:http://www.cnblogs.com/lovemoon714/archive/2012/02/29/2373695.html 1.为什么要使用包?       答: 在一个大型项目中,可 ...

  3. [转] jQuery 操作 JSON 数据

    jquery下json数组的操作用法实例: jquery中操作JSON数组的情况中遍历方法用的比较多,但用添加移除这些好像就不是太多了. 试过json[i].remove(),json.remove( ...

  4. Fiddler [Fiddler] Connection to localhost. failed.

    原文地址:http://blog.chinaunix.net/uid-20675015-id-1899931.html 在用Fiddler调试本机的网站时,即访问http://localhost,返回 ...

  5. mysql常见错误码

    1062 - Duplicate entry '1' for key 1 唯一性错误

  6. 在PADS LAYOUT中修改所有元件字体的大小,怎么修改?

    1.选中一个字符,Ctrl+Q查看一下属性,是在哪一层. 2.Ctrl+Alt+F(Filter)打开滤波器选项,点Layer,将除字符所在层之外的层全部关掉,即将其前面的"√"去 ...

  7. nested exception is org.springframework.beans.factory.NoSuchBeanDefinitionException

    You should autowire interface AbstractManager instead of class MailManager. If you have different im ...

  8. sublime的20个插件

    SublimeText是一款非常精巧的文本编辑器,适合编写代码.做笔记.写文章.它用户界面十分整洁,功能非同凡响,性能快得出奇.这些非常棒的特性 包括任意跳转(Goto Anything).多重选择( ...

  9. HDU 5145 NPY and girls(莫队算法+乘法逆元)

    [题目链接] http://acm.hdu.edu.cn/showproblem.php?pid=5145 [题目大意] 给出一个数列,每次求一个区间数字的非重排列数量.答案对1e9+7取模. [题解 ...

  10. 实验记录一 初步接触cortex-M3

    应该说老早就在接触cortex-M3了.曾经没想到会接触嵌入式,结果由于导师的缘故.在选择项目管理时,就呵呵了.不废话.搭配环境非常easy,纯粹傻瓜式.可由于自己的马虎,却让自己一直困惑. 记得在前 ...