参考:仿百度文库解决方案(四)——利用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. C#实现多态之一抽象

    1. 抽象类.抽象方法.抽象属性的特点 (1)      关键字:abstract (2)      抽象类只能是其他类的基类 (3)      抽象成员必须存在于抽象类中,但抽象类可以没有抽象成员, ...

  2. linq中的cast<T>()及OfType<T>()

    DataTable dt=...........//获取从数据库中取出的数据(假设只有一条记录) //Cast<T>()用来将非泛型的序列转换为泛型的序列 DataRow row=dt.R ...

  3. Android 利用摄像头指尖测试心率

    过摄像头来获得心率,搜了一下这个技术真不是噱头,据说在iPhone早有实现,主要原理是:当打开软件时,手机的闪光灯也会被自动打开,用户将手指放在摄像头上时,指尖皮下血管由于有血液被压入,被光源照射的手 ...

  4. 0622 python 基础05

    使用双重for循环,打印 0~100 # -*- coding: utf-8 -*- # D:\python\test.py def printOneToHundred():     for i in ...

  5. 关于scanf("%c",&ch)直接跳过的问题

    有时候scanf("%c",&ch)本应该阻塞等待用户输入一个char型数据的,但为什么会跳过呢? 例:在该程序段中,  int year;    printf(" ...

  6. codeblock编译Object-C

    http://blog.csdn.net/ldl22847/article/details/7482971 http://www.cnblogs.com/qingyuan/p/3524791.html ...

  7. Visual Studio 中用管理员权限运行、调试程序

    原文:Visual Studio 中用管理员权限运行.调试程序 一个Sample小程序,用于验证WoW64的Windows Registry的读写访问.在Visual Studio 2010中调试运行 ...

  8. 使用LAMP创建基于wordpress的个从博客站点

    參考: http://blog.csdn.net/ck_boss/article/details/27866117 一.mysql配置 1.安装mysql yum install mysql-serv ...

  9. linux内核之网络协议栈

    https://www.ibm.com/developerworks/cn/linux/l-ntflt/

  10. JS+canvas实现人机大战之五子棋

    效果图: html代码如下: <!DOCTYPE html><html>    <head>        <meta charset="utf-8 ...