摘要:基于實現(xiàn)的文檔轉(zhuǎn)換項目,無框架依賴,即插即用項目源代碼技術棧功能使用安裝配置獲取依賴編輯配置文件執(zhí)行轉(zhuǎn)換按照文件路徑轉(zhuǎn)換按照輸入輸出流轉(zhuǎn)換按照文件轉(zhuǎn)換圖片處理按照文件路徑處理按照文件處理添加水印按照文件路徑添加水印按照流添加水印按照添加水
基于libreoffice實現(xiàn)的文檔轉(zhuǎn)換項目,無框架依賴,即插即用
項目源代碼:github/workable-converter
1. 技術棧
2. 功能
3. 使用
3.1 安裝配置LibreOffice6.2.3
3.2 獲取依賴
3.3 編輯配置文件
3.4 執(zhí)行轉(zhuǎn)換
3.4.1 按照文件路徑轉(zhuǎn)換
3.4.2 按照輸入輸出流轉(zhuǎn)換
3.4.3 按照文件Base64轉(zhuǎn)換
3.5 圖片處理
3.5.1 按照文件路徑處理
3.5.2 按照文件Base64處理
3.6 添加水印
3.6.1 按照文件路徑添加水印
3.6.2 按照流添加水印
3.6.3 按照base64添加水印
4. 待辦事項
5. 注意事項
6. 參考鏈接
1. 技術棧LibreOffice:v6.2.3
jodconverter:4.2.2
PDFBox:2.0.12
cglib動態(tài)代理 + 懶漢工廠模式 + 策略模式 + 裝飾器模式
qtools-property管理配置文件(application.yml、bootstrap.yml、workable-converter.yml三種命名的配置文件任意包含一種即可)
2. 功能支持doc、docx、html、ppt、png、pdf等等類型的文件互相轉(zhuǎn)換
支持按照文件路徑、字節(jié)輸入輸出流、Base64等不同姿勢轉(zhuǎn)換
不依賴第三方框架,即插即用,支持application.yml、bootstrap.yml、workable-converter.yml三種配置(自己項目中具體配置一個即可)
3. 使用 3.1 安裝配置LibreOffice6.2.3CentOS請直接參考這篇文章:CentOS7安裝LibreOffice6.2.3
windows跟Mac同樣可以在上述文章中拿到下載鏈接
安裝完成后,請記住您的LibreOffice的Home目錄,后面需要用到
默認目錄:
CentOS: /opt/libreoffice6.2/
Mac: /Applications/LibreOffice.app/Contents/
Windows: C:Program FilesLibreOffice
3.2 獲取依賴Maven
com.liumapp.workable.converter workable-converter v1.2.0
Gradle
compile group: "com.liumapp.workable.converter", name: "workable-converter", version: "v1.2.0"3.3 編輯配置文件
在項目的resources目錄下,創(chuàng)建一個yml配置文件,需要確保文件名稱為application.yml、bootstrap.yml或workable-converter.yml三種命名任意一個即可
添加以下配置:
com: liumapp: workable-converter: libreofficePath: "/Applications/LibreOffice.app/Contents"
libreofficePath的值為LibreOffice:6.2.3的安裝目錄
完整的配置項列表如下
參數(shù)名 | 解釋 | 默認值 |
---|---|---|
libreofficePath | LibreOffice安裝目錄 | (String) 無默認值,該項必填 |
libreofficePort | LibreOffice監(jiān)聽端口 | (int) 2002 |
tmpPath | 臨時存儲目錄 | (String) "./data/" |
以doc轉(zhuǎn)PDF為例
WorkableConverter converter = new WorkableConverter();//實例化的同時,初始化配置項,配置項的校驗通過Decorator裝飾 ConvertPattern pattern = ConvertPatternManager.getInstance(); pattern.fileToFile("./data/test.doc", "./data/pdf/result1.pdf"); //test.doc為待轉(zhuǎn)換文件路徑,result1.pdf為轉(zhuǎn)換結(jié)果存儲路徑 pattern.setSrcFilePrefix(DefaultDocumentFormatRegistry.DOC); pattern.setDestFilePrefix(DefaultDocumentFormatRegistry.PDF); converter.setConverterType(CommonConverterManager.getInstance());//策略模式,后續(xù)實現(xiàn)了新的轉(zhuǎn)換策略后,在此處更換,圖片轉(zhuǎn)換將考慮使用新的策略來完成 boolean result = converter.convert(pattern.getParameter();
如果要用html轉(zhuǎn)PDF,將上述代碼的
pattern.setSrcFilePrefix(DefaultDocumentFormatRegistry.DOC); pattern.setDestFilePrefix(DefaultDocumentFormatRegistry.PDF);
改為
pattern.setSrcFilePrefix(DefaultDocumentFormatRegistry.HTML); pattern.setDestFilePrefix(DefaultDocumentFormatRegistry.PDF);
其他類型的同理
3.4.2 按照輸入輸出流轉(zhuǎn)換以doc轉(zhuǎn)pdf為例
// you can also choice not use proxy WorkableConverter converter = new WorkableConverter(); ConvertPattern pattern = ConvertPatternManager.getInstance(); pattern.streamToStream(new FileInputStream("./data/test.doc"), new FileOutputStream("./data/pdf/result1_2.pdf")); // attention !!! convert by stream must set prefix. pattern.setSrcFilePrefix(DefaultDocumentFormatRegistry.DOC); pattern.setDestFilePrefix(DefaultDocumentFormatRegistry.PDF); converter.setConverterType(CommonConverterManager.getInstance()); boolean result = converter.convert(pattern.getParameter();
跟上例基本相同,唯一的變化是通過pattern.streamToStream()來設置輸入輸出流,轉(zhuǎn)換源文件數(shù)據(jù)從輸入流中讀取,轉(zhuǎn)換結(jié)果會直接寫入輸出流中,
同時要切換轉(zhuǎn)換格式,跟上例一樣設置不同的prefix即可
3.4.3 按照文件Base64轉(zhuǎn)換仍以doc轉(zhuǎn)pdf為例
WorkableConverter converter = new WorkableConverter(); ConvertPattern pattern = ConvertPatternManager.getInstance(); pattern.base64ToBase64(Base64FileTool.FileToBase64(new File("./data/test.doc"))); // attention !!! convert by base64 must set prefix. pattern.setSrcFilePrefix(DefaultDocumentFormatRegistry.DOC); pattern.setDestFilePrefix(DefaultDocumentFormatRegistry.PDF); converter.setConverterType(CommonConverterManager.getInstance()); boolean result = converter.convert(pattern.getParameter(); String destBase64 = pattern.getBase64Result();
輸入base64執(zhí)行轉(zhuǎn)換,首先通過pattern.base64ToBase64()來設置轉(zhuǎn)換源的base64值
轉(zhuǎn)換結(jié)果result仍然是一個boolean類型,通過pattern.getBase64Result來獲取轉(zhuǎn)換結(jié)果的base64值
要切換轉(zhuǎn)換格式,跟上例一樣設置不同的prefix即可
3.5 圖片處理目前對于圖片的處理,只支持將PDF轉(zhuǎn)PNG圖片(如果1份pdf文件有20頁,那么將會轉(zhuǎn)換為20張png圖片),該功能的實現(xiàn)基于PDFBox:2.0.12
3.5.1 按照文件路徑處理pattern.fileToFiles()第一個參數(shù)為待轉(zhuǎn)換的pdf文件路徑,第二個參數(shù)為轉(zhuǎn)換后的圖片存儲路徑
WorkableConverter converter = new WorkableConverter(); ConvertPattern pattern = ConvertPatternManager.getInstance(); pattern.fileToFiles("./data/test5.pdf", "./data/"); pattern.setSrcFilePrefix(DefaultDocumentFormatRegistry.PDF); pattern.setDestFilePrefix(DefaultDocumentFormatRegistry.PNG); converter.setConverterType(PdfBoxConverterManager.getInstance()); // pdf box converter manager only support pdf to png assertEquals(true, converter.convert(pattern.getParameter())); assertEquals(true, FileTool.isFileExists("./data/test5_0.png")); assertEquals(true, FileTool.isFileExists("./data/test5_1.png")); assertEquals(true, FileTool.isFileExists("./data/test5_2.png")); assertEquals(true, FileTool.isFileExists("./data/test5_3.png"));3.5.2 按照文件Base64處理
pattern.base64ToBase64()的參數(shù)為待轉(zhuǎn)換pdf文件的base64值
轉(zhuǎn)換結(jié)束后,通過List
WorkableConverter converter = new WorkableConverter(); ConvertPattern pattern = ConvertPatternManager.getInstance(); pattern.base64ToBase64(Base64FileTool.FileToBase64(new File("./data/test5.pdf"))); pattern.setSrcFilePrefix(DefaultDocumentFormatRegistry.PDF); pattern.setDestFilePrefix(DefaultDocumentFormatRegistry.PNG); converter.setConverterType(PdfBoxConverterManager.getInstance()); // pdf box converter manager only support pdf to png boolean result = converter.convert(pattern.getParameter()); List3.6 添加水印resultBase64 = pattern.getBase64Results(); assertEquals(true, result); assertEquals(4, resultBase64.size());
水印的轉(zhuǎn)換策略為WaterMarkConverter
添加水印注意事項
請確保輸入源文件后綴為PDF,輸出源文件后綴也為PDF
水印參數(shù)需要new一個WaterMarkRequire來設置
setWaterMarkPage(int page)代表在哪一頁上添加水印,如果為0,則表示所有頁面
水印本身為一個PDF文件,該文件只需要一頁,其第一頁的內(nèi)容將被視為水印添加到源文件中
比如說,要添加透明度為0.3的文本作為水印的話,自己使用word等工具繪制透明度為0.3的字體(或者上包含透明度的png圖片也可以)并另存為一個watermark.pdf文件
然后使用waterMarkRequire.setWaterMarkPDFBase64(Base64FileTool.FileToBase64(new File("./data/watermark.pdf")))
或者waterMarkRequire.setWaterMarkPDFBytes(FileUtils.readFileToByteArray(new File("./data/watermark.pdf")))將該文件的base64或者bytes值輸入即可
具體使用可以分為三種方式
3.6.1 按照文件路徑添加水印WorkableConverter converter = new WorkableConverter(); converter.setConverterType(WaterMarkConverterManager.getInstance());//選擇具體的水印轉(zhuǎn)換策略 ConvertPattern pattern = ConvertPatternManager.getInstance(); WaterMarkRequire waterMarkRequire = new WaterMarkRequire();//創(chuàng)建水印所需要的參數(shù) //指定在具體的哪一頁添加水印,0的話則在所有頁面添加水印 waterMarkRequire.setWaterMarkPage(0);//0 means all age waterMarkRequire.setWaterMarkPDFBase64(Base64FileTool.FileToBase64(new File("./data/watermark.pdf"))); pattern.setWaterMarkRequire(waterMarkRequire); pattern.setSrcFilePrefix(DefaultDocumentFormatRegistry.PDF); pattern.setDestFilePrefix(DefaultDocumentFormatRegistry.PDF); pattern.fileToFile("./data/test5.pdf", "./data/test5_with_mark01.pdf");//添加水印后的文件保存在./data/目錄下,名為test5_with_mark01.pdf boolean result = converter.convert(pattern.getParameter()); assertEquals(true, result);3.6.2 按照流添加水印
WorkableConverter converter = new WorkableConverter(); converter.setConverterType(WaterMarkConverterManager.getInstance()); ConvertPattern pattern = ConvertPatternManager.getInstance(); WaterMarkRequire waterMarkRequire = new WaterMarkRequire(); waterMarkRequire.setWaterMarkPage(0);//0 means all age waterMarkRequire.setWaterMarkPDFBytes(FileUtils.readFileToByteArray(new File("./data/watermark.pdf"))); pattern.setWaterMarkRequire(waterMarkRequire); pattern.setSrcFilePrefix(DefaultDocumentFormatRegistry.PDF); pattern.setDestFilePrefix(DefaultDocumentFormatRegistry.PDF); pattern.streamToStream(new FileInputStream("./data/test5.pdf"), new FileOutputStream("./data/test5_with_mark02.pdf")); boolean result = converter.convert(pattern.getParameter()); assertEquals(true, result);3.6.3 按照base64添加水印
WorkableConverter converter = new WorkableConverter(); converter.setConverterType(WaterMarkConverterManager.getInstance()); ConvertPattern pattern = ConvertPatternManager.getInstance(); WaterMarkRequire waterMarkRequire = new WaterMarkRequire(); waterMarkRequire.setWaterMarkPage(0);//0 means all age waterMarkRequire.setWaterMarkPDFBase64(Base64FileTool.FileToBase64(new File("./data/watermark.pdf"))); pattern.setWaterMarkRequire(waterMarkRequire); pattern.setSrcFilePrefix(DefaultDocumentFormatRegistry.PDF); pattern.setDestFilePrefix(DefaultDocumentFormatRegistry.PDF); pattern.base64ToBase64(Base64FileTool.FileToBase64(new File("./data/test5.pdf"))); boolean result = converter.convert(pattern.getParameter()); String base64Result = pattern.getBase64Result(); Base64FileTool.saveBase64File(base64Result, "./data/test5_with_mark03.pdf"); assertEquals(true, result);4. 待辦事項
已經(jīng)測試通過的有doc、docx、html 按照不同姿勢轉(zhuǎn)PDF,其他類型的并沒有編寫測試單元,后續(xù)考慮增加
目前只支持yml配置,后續(xù)考慮添加其他類型的配置支持(xml、properties等)
目前Markdown格式很流行,考慮實現(xiàn)markdown格式的字符串轉(zhuǎn)PDF(markdown -> html -> pdf)
5. 注意事項因為需要LibreOffice的支持,所以不建議在Docker等容器內(nèi)運行(LibreOffice暫無Docker穩(wěn)定發(fā)行版的鏡像)
轉(zhuǎn)換亂碼、轉(zhuǎn)換耗時過長,請檢查服務器是否安裝有中文字體
項目啟動后,在執(zhí)行第一次轉(zhuǎn)換任務時,因為涉及到與LibreOffice建立連接等操作,所以會耗時較長,第二次任務及以后穩(wěn)定在0.5秒以內(nèi)(具體時間因機器配置會有所差異)
6. 參考鏈接https://www.libreoffice.org/d...
https://api.libreoffice.org/
https://github.com/sbraconnie...
https://memorynotfound.com/ap...
文章版權(quán)歸作者所有,未經(jīng)允許請勿轉(zhuǎn)載,若此文章存在違規(guī)行為,您可以聯(lián)系管理員刪除。
轉(zhuǎn)載請注明本文地址:http://specialneedsforspecialkids.com/yun/75820.html
摘要:文檔基金會已經(jīng)宣布推出標簽下的日志,這是辦公套件的一個重要的新版本,帶有大量的互操作性改進,以更好地支持微軟格式,如和。新的更新還增加了對蘋果芯片的原生支持,不過,出于穩(wěn)定性考慮,建議用戶使用舊的二進制類型。另外的來自于名個人志愿者。The Document Foundation(文檔基金會)已經(jīng)宣布推出 LibreOffice 7.2,這是辦公套件的一個重要的新版本,帶有大量的互操作性改進...
摘要:用將文檔轉(zhuǎn)換本例使用。在和環(huán)境下測試通過。轉(zhuǎn)換命令源文件放在或者封裝了一組轉(zhuǎn)換命令,通過調(diào)用相關服務。安裝檢查已有字體庫復制字體新建文件夾把系統(tǒng)的字體復制進去。 用LibreOffice將Office文檔轉(zhuǎn)換PDF 本例使用 LibreOffice-6.0.4、jodconverter-4.2.0、spring-boot-1.5.9.RELEASE。 在CentOS7 + ope...
摘要:在這里,老蔣推薦這款辦公套裝,完全是免費開源且跨平臺的辦公軟件。因為老蔣是測試這款辦公軟件的,我就不選擇單獨的軟件路徑,直接默認。這樣,正如有些網(wǎng)友說的,在一定程度上還是可以取代微軟軟件的。一般來說,我們購買的電腦是自帶正版WIN系統(tǒng)的會同時自帶正版Microsoft Office套件辦公軟件,這樣我們就無需購買或者尋找免費的辦公軟件。但是,我們有些朋友的電腦系統(tǒng)并非正版的,或者我們在使用m...
摘要:項目需求在前端頁面中實現(xiàn)預覽表格的功能,上網(wǎng)了解之后大致總結(jié)為一下幾種方法。第四種方法把表格打開后,另存為格式的文件。在網(wǎng)頁上預覽效果和表格一致。 項目需求在前端頁面中實現(xiàn)預覽excel表格的功能,上網(wǎng)了解之后大致總結(jié)為一下幾種方法。 1.office文檔轉(zhuǎn)換為pdf,再轉(zhuǎn)swf,然后通過網(wǎng)頁加載flash進行預覽 2.通過 xlsx.js,jszip.js插件 3.django xl...
閱讀 1317·2021-11-24 10:24
閱讀 4145·2021-11-22 15:29
閱讀 1088·2019-08-30 15:53
閱讀 2794·2019-08-30 10:54
閱讀 1981·2019-08-29 17:26
閱讀 1287·2019-08-29 17:08
閱讀 608·2019-08-28 17:55
閱讀 1583·2019-08-26 14:01