? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ?原創(chuàng)者:文思
閑話少說,直接上干貨。
應(yīng)用背景:
針對(duì)一些有價(jià)值文檔的處理使用,怎么保護(hù)內(nèi)容不被盜用與擴(kuò)散,是互聯(lián)網(wǎng)應(yīng)用中常遇到的一種情景,一般兩種思路:
1、服務(wù)器端進(jìn)行加密,然后客戶端本地解密或者調(diào)用服務(wù)器進(jìn)行解密后再瀏覽或者下載。
? ? ? 缺點(diǎn):在線加解密效率低,有延時(shí),無法解決客戶端人為錄屏獲取資料的行為。
2、將文檔轉(zhuǎn)換成pdf并且加載產(chǎn)權(quán)水印,用戶在線預(yù)覽不允許下載??梢员苊庠诰€解密的效率問題與客戶端錄屏問題。
一、各種文檔轉(zhuǎn)換成pdf的工具選擇:
jacob與jodconvert
前者只支持windows環(huán)境下word,ppt,excel,txt等文件的pdf轉(zhuǎn)換
后者windows和linux都支持。
從在windows上的執(zhí)行效率上來說,jacob略高于jodconvert。
二、使用jacob的demo
1、設(shè)置處理線程隊(duì)列及數(shù)量,根據(jù)文檔類型跳轉(zhuǎn)到不同轉(zhuǎn)換方法中

文檔轉(zhuǎn)換工具類,wordQueue為文檔的服務(wù)線程處理調(diào)度器隊(duì)列,根據(jù)需求的應(yīng)用場景有可能的并發(fā)性來設(shè)置大小,與MQ機(jī)制類似。WORDSIZE為設(shè)置的文檔處理最大線程數(shù)量,即wordQueue的容量,當(dāng)一個(gè)請(qǐng)求來到時(shí),wordQueue中處理線程為空時(shí),進(jìn)行創(chuàng)建服務(wù)處理線程調(diào)度器,并放入到wordQueue隊(duì)列中。
2、具體的文檔轉(zhuǎn)換pdf的處理方法,兩大步:2.1獲取處理調(diào)度器getWordDoc(), 2.2處理文檔開始Dispatch.call(...)
2.1

其中獲取調(diào)度器getWordDoc分兩步:1startAllWord創(chuàng)建調(diào)度器并加入隊(duì)列中,2隊(duì)列中取第一個(gè)調(diào)度器,如下兩個(gè)圖:

startAllWord()創(chuàng)建好3個(gè)處理調(diào)度并放入wordQueue隊(duì)列后,將從wordQueue中取第一個(gè)處理調(diào)度。其中創(chuàng)建調(diào)度的startAllWord()程序如下:

總結(jié)描述:如果服務(wù)線程調(diào)度程序在隊(duì)列中沒有,最上面已經(jīng)把隊(duì)列容量調(diào)度器線程設(shè)置為了3,則創(chuàng)建3個(gè)處理調(diào)度器并加入到隊(duì)列中,并wordQueue.poll()獲取并移除此隊(duì)列的頭(即拿到隊(duì)列中的第一個(gè)調(diào)度器)。
2.2

三、使用jodconvert的demo
大戲開始:
convert2.2(com)與3.1(org)版本的比較:

通過上面的對(duì)比,除了org支持更多格式之外在速度上沒有優(yōu)勢(shì),并且轉(zhuǎn)換出來的文字清晰度比com低了一點(diǎn)點(diǎn)。還有org即3.1版本吧支持office2007,而2.1comg只支持到2003.具體看兩個(gè)版本的DefaultDocumentFormatRegistry類的源碼。
代碼編寫:
3.1mq消息獲取,調(diào)用文檔轉(zhuǎn)換前的消息業(yè)務(wù)處理:


3.2獲取文件,并進(jìn)行文檔轉(zhuǎn)換:

#oss配置
oss.accessKeyId=********
oss.secretAccessKey=********
oss.endpoint=********
oss.bucketName=pbu-private



3.3編寫獲取文檔處理轉(zhuǎn)換器的連接池文件OfficeDocumentConverter converter = OpenOfficePool.getConvertSingle();

以上是啟動(dòng)1個(gè)端口1個(gè)openoffice服務(wù)。以下是啟動(dòng)多個(gè)端口多個(gè)openoffice服務(wù),建議使用以下:

設(shè)置全局OfficeManager,如果為空,則啟動(dòng)openoffice程序并新建返回一個(gè)OfficeManager。
startAll:啟動(dòng)openoffice程序并新建返回一個(gè)OfficeManager
getConvert:調(diào)用者
---------------------------------------------------------
openoffice配置:
#openOffice信息
office.service=http://10.10.16.146
#office.home=D:\\OpenOffice 4\\OpenOffice 4\\
office.home=/opt/openoffice4/
#起始端口
office.port=8100
#端口啟動(dòng)增量
office.portsize=10
#失敗補(bǔ)償次數(shù)
office.converttimes=3
3.4通過其它外部微服務(wù)接口調(diào)用回寫轉(zhuǎn)換后的結(jié)果給消息發(fā)送方:

以上是程序部分,以下是發(fā)布過程中遇到的小坑及填坑:
程序無法啟動(dòng)openoffice服務(wù)


使用jodconverter-core將文檔轉(zhuǎn)pdf還需要commons-io包
根據(jù)其它錯(cuò)誤提示發(fā)現(xiàn)百度:http://blog.csdn.net/zhizaibide1987/article/details/30035723

還需要juh、jurt、unoil、ridl這4個(gè)包。添加后然后程序仍然無法啟動(dòng)office后,嘗試手工在服務(wù)器上啟動(dòng):

報(bào): no suitable windowing system found, exiting.錯(cuò)誤.
百度:http://blog.csdn.net/cuker919/article/details/46389449

安裝X Window System:yum groupinstall "X Window System"

安裝成功后啟動(dòng)

啟動(dòng)成功。關(guān)閉此進(jìn)程后程序調(diào)用啟動(dòng)并轉(zhuǎn)pdf成功
注意一點(diǎn):使用boot的MQ接收處理時(shí),一定要捕獲異常且將當(dāng)前mq消息,變自動(dòng)應(yīng)答為手工(即程序處理干預(yù))應(yīng)答,且放在消息隊(duì)列的最后面,否則對(duì)消息的業(yè)務(wù)處理失敗后mq的機(jī)制會(huì)重新拿起這條消息放到隊(duì)列的最前面再次執(zhí)行,這樣就形成了:隊(duì)列第一條消息執(zhí)行-->業(yè)務(wù)處理失敗-->放到消息隊(duì)列最前面第一條-->再執(zhí)行-->再失敗-->再放到隊(duì)列最前面第一條里,這樣無限下去死循環(huán),從而引發(fā)消息阻塞,業(yè)務(wù)中斷,所以大家一定要注意,才catch中捕獲異常并放在消息隊(duì)列的最后面,具體
