您好,登錄后才能下訂單哦!
小編給大家分享一下如何基于LibreOffice實現文檔操作,相信大部分人都還不怎么了解,因此分享這篇文章給大家參考一下,希望大家閱讀完這篇文章后大有收獲,下面讓我們一起去了解一下吧!
基于libreoffice實現的文檔轉換項目,無框架依賴,即插即用
LibreOffice:v6.2.3
jodconverter:4.2.2
PDFBox:2.0.12
cglib動態代理 + 懶漢工廠模式 + 策略模式 + 裝飾器模式
qtools-property管理配置文件(application.yml、bootstrap.yml、workable-converter.yml三種命名的配置文件任意包含一種即可)
支持doc、docx、html、ppt、png、pdf等等類型的文件互相轉換
支持按照文件路徑、字節輸入輸出流、Base64等不同姿勢轉換
不依賴第三方框架,即插即用,支持application.yml、bootstrap.yml、workable-converter.yml三種配置(自己項目中具體配置一個即可)
CentOS請直接參考這篇文章:CentOS7安裝LibreOffice6.2.3
windows跟Mac同樣可以在上述文章中拿到下載鏈接
安裝完成后,請記住您的LibreOffice的Home目錄,后面需要用到
默認目錄:
CentOS: /opt/libreoffice6.2/
Mac: /Applications/LibreOffice.app/Contents/
Windows: C:\Program Files\LibreOffice\
Maven
<dependency> <groupId>com.liumapp.workable.converter</groupId> <artifactId>workable-converter</artifactId> <version>v1.2.0</version> </dependency>
Gradle
compile group: 'com.liumapp.workable.converter', name: 'workable-converter', version: 'v1.2.0'
在項目的resources目錄下,創建一個yml配置文件,需要確保文件名稱為application.yml、bootstrap.yml或workable-converter.yml三種命名任意一個即可
添加以下配置:
com: liumapp: workable-converter: libreofficePath: "/Applications/LibreOffice.app/Contents"
libreofficePath的值為LibreOffice:6.2.3的安裝目錄
完整的配置項列表如下
<table> <tr><th>參數名</th><th>解釋</th><th>默認值</th></tr> <tr><td>libreofficePath</td><td>LibreOffice安裝目錄</td><td>(String) 無默認值,該項必填</td></tr> <tr><td>libreofficePort</td><td>LibreOffice監聽端口</td><td>(int) 2002</td></tr> <tr><td>tmpPath</td><td>臨時存儲目錄</td><td>(String) "./data/"</td></tr> </table>
以doc轉PDF為例
WorkableConverter converter = new WorkableConverter();//實例化的同時,初始化配置項,配置項的校驗通過Decorator裝飾 ConvertPattern pattern = ConvertPatternManager.getInstance(); pattern.fileToFile("./data/test.doc", "./data/pdf/result1.pdf"); //test.doc為待轉換文件路徑,result1.pdf為轉換結果存儲路徑 pattern.setSrcFilePrefix(DefaultDocumentFormatRegistry.DOC); pattern.setDestFilePrefix(DefaultDocumentFormatRegistry.PDF); converter.setConverterType(CommonConverterManager.getInstance());//策略模式,后續實現了新的轉換策略后,在此處更換,圖片轉換將考慮使用新的策略來完成 boolean result = converter.convert(pattern.getParameter();
如果要用html轉PDF,將上述代碼的
pattern.setSrcFilePrefix(DefaultDocumentFormatRegistry.DOC); pattern.setDestFilePrefix(DefaultDocumentFormatRegistry.PDF);
改為
pattern.setSrcFilePrefix(DefaultDocumentFormatRegistry.HTML); pattern.setDestFilePrefix(DefaultDocumentFormatRegistry.PDF);
其他類型的同理
以doc轉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()來設置輸入輸出流,轉換源文件數據從輸入流中讀取,轉換結果會直接寫入輸出流中,
同時要切換轉換格式,跟上例一樣設置不同的prefix即可
仍以doc轉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執行轉換,首先通過pattern.base64ToBase64()來設置轉換源的base64值
轉換結果result仍然是一個boolean類型,通過pattern.getBase64Result來獲取轉換結果的base64值
要切換轉換格式,跟上例一樣設置不同的prefix即可
目前對于圖片的處理,只支持將PDF轉PNG圖片(如果1份pdf文件有20頁,那么將會轉換為20張png圖片),該功能的實現基于PDFBox:2.0.12
pattern.fileToFiles()第一個參數為待轉換的pdf文件路徑,第二個參數為轉換后的圖片存儲路徑
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"));
pattern.base64ToBase64()的參數為待轉換pdf文件的base64值
轉換結束后,通過List<String> resultBase64 = pattern.getBase64Results()
獲取轉換后的圖片base64值的集合
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()); List<String> resultBase64 = pattern.getBase64Results(); assertEquals(true, result); assertEquals(4, resultBase64.size());
水印的轉換策略為WaterMarkConverter
添加水印注意事項
請確保輸入源文件后綴為PDF,輸出源文件后綴也為PDF
水印參數需要new一個WaterMarkRequire來設置
setWaterMarkPage(int page)代表在哪一頁上添加水印,如果為0,則表示所有頁面
水印本身為一個PDF文件,該文件只需要一頁,其第一頁的內容將被視為水印添加到源文件中
比如說,要添加透明度為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值輸入即可
具體使用可以分為三種方式
WorkableConverter converter = new WorkableConverter(); converter.setConverterType(WaterMarkConverterManager.getInstance());//選擇具體的水印轉換策略 ConvertPattern pattern = ConvertPatternManager.getInstance(); WaterMarkRequire waterMarkRequire = new WaterMarkRequire();//創建水印所需要的參數 //指定在具體的哪一頁添加水印,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);
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);
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);
已經測試通過的有doc、docx、html 按照不同姿勢轉PDF,其他類型的并沒有編寫測試單元,后續考慮增加
目前只支持yml配置,后續考慮添加其他類型的配置支持(xml、properties等)
目前Markdown格式很流行,考慮實現markdown格式的字符串轉PDF(markdown -> html -> pdf)
因為需要LibreOffice的支持,所以不建議在Docker等容器內運行(LibreOffice暫無Docker穩定發行版的鏡像)
轉換亂碼、轉換耗時過長,請檢查服務器是否安裝有中文字體
項目啟動后,在執行第一次轉換任務時,因為涉及到與LibreOffice建立連接等操作,所以會耗時較長,第二次任務及以后穩定在0.5秒以內(具體時間因機器配置會有所差異)
以上是“如何基于LibreOffice實現文檔操作”這篇文章的所有內容,感謝各位的閱讀!相信大家都有了一定的了解,希望分享的內容對大家有所幫助,如果還想學習更多知識,歡迎關注億速云行業資訊頻道!
免責聲明:本站發布的內容(圖片、視頻和文字)以原創、轉載和分享為主,文章觀點不代表本網站立場,如果涉及侵權請聯系站長郵箱:is@yisu.com進行舉報,并提供相關證據,一經查實,將立刻刪除涉嫌侵權內容。