使用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這一步,失敗率較高。


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM