vue 實(shí)現(xiàn) word、excel文件在線查看(利用aspose轉(zhuǎn)換為pdf文件)

前言:項(xiàng)目是vue+spring Boot項(xiàng)目帕涌,原本有直接查看PDF文件的功能(利用vue-pdf組件實(shí)現(xiàn))噩茄,現(xiàn)在需要增加上傳word下面、excel文件以及之后的查看、打印等一系列功能绩聘,此時vue-pdf組件也無法直接查看word/excel文件沥割,于是在網(wǎng)上也查詢了許多直接查看word/excel文件的方法,但是都有各種局限性凿菩,綜合考慮之后有了如下思路

思路:

  1. 上傳word/excel文件至文件系統(tǒng)(使用的ftp服務(wù)器)時机杜,同時保存一份在本地,將本地的文件轉(zhuǎn)換為同名的pdf文件衅谷,此時生成的pdf文件也在本地椒拗;
  2. 緊接著上傳該本地pdf文件至文件系統(tǒng),與原word/excel文件同一文件夾;
  3. 刪除保存在本地的文件及生成的pdf文件蚀苛;
  4. 在線查看文件時進(jìn)行判斷在验,如為pdf文件直接查看,如為word枉阵、excel(后綴為doc/docx/xls/xlsx)文件译红,則將文件名后綴替換為 .pdf 后再進(jìn)行查看。

該思路步驟確實(shí)比較繁瑣兴溜,但是結(jié)合項(xiàng)目實(shí)際以及網(wǎng)上找到的解決方案,處理起來比較合適耻陕,以下是解決的詳細(xì)步驟:

1. 利用aspose將上傳的word/excel文件轉(zhuǎn)換為pdf文件(通過后綴判斷文件格式)

  • 下載aspose相關(guān)jar包:鏈接:https://pan.baidu.com/s/1EcWi5TU_Lqwr_EKTooi-cA
    提取碼:xcnv
  • 將下載的jar包導(dǎo)入項(xiàng)目(這里是用maven管理的)拙徽,先在項(xiàng)目模塊下新建lib文件夾,將jar包放進(jìn)去后配置pom.xml文件使jar包可使用


    jar包
      <dependency>
        <groupId>com.aspose</groupId>
            <artifactId>aspose-slides</artifactId>
            <version>15.8.0</version>
            <scope>system</scope>
            <systemPath>${basedir}/lib/aspose.slides-15.8.0.jar</systemPath>
        </dependency>
        <dependency>
            <groupId>com.aspose</groupId>
            <artifactId>aspose-cells</artifactId>
            <version>8.5.2</version>
            <scope>system</scope>
            <systemPath>${basedir}/lib/aspose-cells-8.5.2.jar</systemPath>
        </dependency>
        <dependency>
            <groupId>com.aspose</groupId>
            <artifactId>aspose-words</artifactId>
            <version>16.8.0</version>
            <scope>system</scope>
            <systemPath>${basedir}/lib/aspose-words-16.8.0.jar</systemPath>
        </dependency>
  • 引入license.xml授權(quán)配置文件至靜態(tài)文件(resources)目錄
<License>
    <Data>
        <Products>
            <Product>Aspose.Total for Java</Product>
            <Product>Aspose.Words for Java</Product>
        </Products>
        <EditionType>Enterprise</EditionType>
        <SubscriptionExpiry>20991231</SubscriptionExpiry>
        <LicenseExpiry>20991231</LicenseExpiry>
        <SerialNumber>8bfe198c-7f0c-4ef8-8ff0-acc3237bf0d7</SerialNumber>
    </Data>
    <Signature>sNLLKGMUdF0r8O1kKilWAGdgfs2BvJb/2Xp8p5iuDVfZXmhppo+d0Ran1P9TKdjV4ABwAgKXxJ3jcQTqE/2IRfqwnPf8itN8aFZlV3TJPYeD3yWE7IT55Gz6EijUpC7aKeoohTb4w2fpox58wWoF3SNp6sK6jDfiAUGEHYJ9pjU=</Signature>
</License>
  • 將word文件轉(zhuǎn)為pdf的方法
@Slf4j
public class WordToPDF {

    //實(shí)現(xiàn)匹配文件授權(quán)
    public static boolean matchLicense() {
        boolean result = false;
        InputStream is = WordToPDF.class.getClassLoader().getResourceAsStream("license.xml");
        License wordLicense = new License();
        try {
            wordLicense.setLicense(is);
            result = true;
        } catch (Exception e) {
            log.error("載入excel授權(quán)文件失敗");
            e.printStackTrace();
        }
        return result;
    }

    public static void convert2PDF(File sourceFile, File targetFile) {
        if (!matchLicense()){
            throw new RuntimeException("匹配文件授權(quán)失斒膘怕!");
        }
        FileOutputStream os = null;
        try {
            os = new FileOutputStream(targetFile);
            Document doc = new Document(sourceFile.getAbsolutePath());
            doc.save(os, SaveFormat.PDF);
        } catch (FileNotFoundException e) {
            log.error("輸出到"+sourceFile.getAbsolutePath()+"錯誤:"+e);
        } catch (Exception e) {
            log.error("轉(zhuǎn)換word出錯:"+e);
        }finally {
            if(os!=null) {
                try {
                    os.close();
                } catch (IOException e) {
                    log.error("關(guān)閉輸出流出錯:"+e);
                }
            }
        }
    }
}
  • 將excel文件轉(zhuǎn)為pdf的方法
@Slf4j
public class ExcelToPDF {

    protected static boolean matchLicense() {
        boolean result = false;
        InputStream is = ExcelToPDF.class.getClassLoader().getResourceAsStream("license.xml");
        License excelLicense = new License();
        try {
            excelLicense.setLicense(is);
            result = true;
        } catch (Exception e) {
            System.err.println("載入excel授權(quán)文件失敗");
            e.printStackTrace();
        }
        return result;
    }

    public static void convert2PDF(File sourceFile, File targetFile) {
        if (!matchLicense()){
            throw new RuntimeException("匹配文件授權(quán)失敗召庞!");
        }
        FileOutputStream fileOs = null;
        Workbook wb = null;
        try {
            fileOs = new FileOutputStream(targetFile);
            wb = new Workbook(sourceFile.getAbsolutePath());
            wb.save(fileOs, SaveFormat.PDF);
        } catch (FileNotFoundException e) {
            log.error("輸出到"+sourceFile.getAbsolutePath()+"錯誤:"+e);
            e.getStackTrace();
        } catch (Exception e) {
            log.error("轉(zhuǎn)換word出錯:"+e);
        }finally {
            if(fileOs!=null) {
                try {
                    fileOs.close();
                } catch (IOException e) {
                    log.error("關(guān)閉輸出流出錯:"+e);
                }
            }
        }
    }
}
  1. 此時在項(xiàng)目文件夾就會生成轉(zhuǎn)換后的pdf文件岛心,我們這里使用到的是ftp服務(wù)器,需要利用ftp的方法將該文件上轉(zhuǎn)至文件系統(tǒng)篮灼;
  2. 刪除本地的文件們忘古;
  3. 此時用vue-pdf組件直接查看上傳的pdf文件即可達(dá)到目的;
  4. 如需刪除原上傳文件诅诱,同時也應(yīng)該刪除轉(zhuǎn)化后的pdf文件髓堪。

目前發(fā)現(xiàn)的缺點(diǎn):

  • 在Linux系統(tǒng)下word轉(zhuǎn)換的pdf文件會亂碼,但網(wǎng)上也有很多解決方案
  • excel轉(zhuǎn)pdf時娘荡,如原excel文件沒有繪制單元格邊框干旁,則預(yù)覽及之后打印的文件無單元格格子

以上便是我在實(shí)現(xiàn)vue在線查看word、excel文件所找到的方法炮沐,步驟確實(shí)稍為復(fù)雜争群,后面幾步也沒怎么貼代碼,寫該文章只是為了記錄自己解決這個問題時熬的兩天的過程大年。由于當(dāng)時網(wǎng)上找的解決方法太多了换薄,這里也沒有貼出原網(wǎng)址,如文章寫得有不合適地方的或者大佬們有更好的處理方法鲜戒,歡迎賜教专控!

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
  • 序言:七十年代末,一起剝皮案震驚了整個濱河市遏餐,隨后出現(xiàn)的幾起案子伦腐,更是在濱河造成了極大的恐慌,老刑警劉巖失都,帶你破解...
    沈念sama閱讀 221,635評論 6 515
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件柏蘑,死亡現(xiàn)場離奇詭異幸冻,居然都是意外死亡,警方通過查閱死者的電腦和手機(jī)咳焚,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 94,543評論 3 399
  • 文/潘曉璐 我一進(jìn)店門洽损,熙熙樓的掌柜王于貴愁眉苦臉地迎上來,“玉大人革半,你說我怎么就攤上這事碑定。” “怎么了又官?”我有些...
    開封第一講書人閱讀 168,083評論 0 360
  • 文/不壞的土叔 我叫張陵延刘,是天一觀的道長。 經(jīng)常有香客問我六敬,道長碘赖,這世上最難降的妖魔是什么? 我笑而不...
    開封第一講書人閱讀 59,640評論 1 296
  • 正文 為了忘掉前任外构,我火速辦了婚禮普泡,結(jié)果婚禮上,老公的妹妹穿的比我還像新娘审编。我一直安慰自己撼班,他們只是感情好,可當(dāng)我...
    茶點(diǎn)故事閱讀 68,640評論 6 397
  • 文/花漫 我一把揭開白布割笙。 她就那樣靜靜地躺著权烧,像睡著了一般。 火紅的嫁衣襯著肌膚如雪伤溉。 梳的紋絲不亂的頭發(fā)上般码,一...
    開封第一講書人閱讀 52,262評論 1 308
  • 那天,我揣著相機(jī)與錄音乱顾,去河邊找鬼板祝。 笑死,一個胖子當(dāng)著我的面吹牛走净,可吹牛的內(nèi)容都是我干的券时。 我是一名探鬼主播,決...
    沈念sama閱讀 40,833評論 3 421
  • 文/蒼蘭香墨 我猛地睜開眼伏伯,長吁一口氣:“原來是場噩夢啊……” “哼橘洞!你這毒婦竟也來了?” 一聲冷哼從身側(cè)響起说搅,我...
    開封第一講書人閱讀 39,736評論 0 276
  • 序言:老撾萬榮一對情侶失蹤炸枣,失蹤者是張志新(化名)和其女友劉穎,沒想到半個月后,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體适肠,經(jīng)...
    沈念sama閱讀 46,280評論 1 319
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡霍衫,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 38,369評論 3 340
  • 正文 我和宋清朗相戀三年,在試婚紗的時候發(fā)現(xiàn)自己被綠了侯养。 大學(xué)時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片敦跌。...
    茶點(diǎn)故事閱讀 40,503評論 1 352
  • 序言:一個原本活蹦亂跳的男人離奇死亡,死狀恐怖逛揩,靈堂內(nèi)的尸體忽然破棺而出柠傍,到底是詐尸還是另有隱情,我是刑警寧澤息尺,帶...
    沈念sama閱讀 36,185評論 5 350
  • 正文 年R本政府宣布携兵,位于F島的核電站,受9級特大地震影響搂誉,放射性物質(zhì)發(fā)生泄漏。R本人自食惡果不足惜静檬,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 41,870評論 3 333
  • 文/蒙蒙 一炭懊、第九天 我趴在偏房一處隱蔽的房頂上張望。 院中可真熱鬧拂檩,春花似錦侮腹、人聲如沸。這莊子的主人今日做“春日...
    開封第一講書人閱讀 32,340評論 0 24
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽。三九已至望抽,卻和暖如春加矛,著一層夾襖步出監(jiān)牢的瞬間,已是汗流浹背煤篙。 一陣腳步聲響...
    開封第一講書人閱讀 33,460評論 1 272
  • 我被黑心中介騙來泰國打工斟览, 沒想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留,地道東北人辑奈。 一個月前我還...
    沈念sama閱讀 48,909評論 3 376
  • 正文 我出身青樓苛茂,卻偏偏與公主長得像,于是被迫代替她去往敵國和親鸠窗。 傳聞我的和親對象是個殘疾皇子妓羊,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 45,512評論 2 359