参考:仿百度文库解决方案(四)——利用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. R与数据分析旧笔记(六)多元线性分析 上

    > x=iris[which(iris$Species=="setosa"),1:4] > plot(x) 首先是简单的肉眼观察数据之间相关性 多元回归相较于一元回归的 ...

  2. 容易被误解的overflow:hidden

    http://www.ofcss.com/2011/03/20/misunderstood-of-overflow-hidden.html(转) 容易被误解的overflow:hidden 15条评论 ...

  3. CSS3里面的高级属性

    -webkit-tap-highlight-color 这个属性只用于iOS (iPhone和iPad).当你点击一个链接或者通过Javascript定义的可点击元素的时候,它就会出现一个半透明的灰色 ...

  4. java简易编辑器

    package peng_jun; import java.awt.*; import java.awt.event.*; import javax.swing.*; import javax.swi ...

  5. PHP学习(前言)

    PHP学习(前言) 都说做IT技术的都该写写博客,以前没写过,现在开始写写吧.不是给别人看,就当是自己的学习笔记了. 大三结束了,该找工作了,对web前端感兴趣,想从事前端工作,自然要会一门后台语言了 ...

  6. 五年26个版本:Linux系统内核全程回顾

    Phoronix.com今天将他们对Linux系统的研究发挥到了极致:从2005年年中的2.6.12,到正在开发中的2.6.37,五年多来的26个Linux内核版本来了个“群英荟萃”! 完成如此庞大规 ...

  7. JAVA泛型-自动包装机制不能应用于泛型数据的测试

    <thinging in java>中指出自动包装机制不能应用于泛型数据,自己写的测试代码如下: package com.xt.thinks15_11_1; import java.uti ...

  8. Android 三大图片缓存原理、特性对比

    这是我在 MDCC 上分享的内容(略微改动),也是源码解析第一期发布时介绍的源码解析后续会慢慢做的事. 从总体设计和原理上对几个图片缓存进行对比,没用到他们的朋友也可以了解他们在某些特性上的实现. 上 ...

  9. nginx 1.4.7 发送日志到rsyslog

    <pre name="code" class="html">tar -xzf nginx-1.4.7.tar.gz # cd nginx-1.4.7 ...

  10. Android企业级程序完全退出的解决方案【转】

    http://blog.csdn.net/wangjinyu501/article/details/8763552 问题描述 在平常开发的过程中可以发现,很多开发者对于程序的退出都没有去认真的解决.一 ...