成人国产在线小视频_日韩寡妇人妻调教在线播放_色成人www永久在线观看_2018国产精品久久_亚洲欧美高清在线30p_亚洲少妇综合一区_黄色在线播放国产_亚洲另类技巧小说校园_国产主播xx日韩_a级毛片在线免费

資訊專欄INFORMATION COLUMN

工具庫-基于LibreOffice實(shí)現(xiàn)文檔操作

ZoomQuiet / 1271人閱讀

摘要:基于實(shí)現(xiàn)的文檔轉(zhuǎn)換項(xiàng)目,無框架依賴,即插即用項(xiàng)目源代碼技術(shù)棧功能使用安裝配置獲取依賴編輯配置文件執(zhí)行轉(zhuǎn)換按照文件路徑轉(zhuǎn)換按照輸入輸出流轉(zhuǎn)換按照文件轉(zhuǎn)換圖片處理按照文件路徑處理按照文件處理添加水印按照文件路徑添加水印按照流添加水印按照添加水

基于libreoffice實(shí)現(xiàn)的文檔轉(zhuǎn)換項(xiàng)目,無框架依賴,即插即用

項(xiàng)目源代碼:github/workable-converter

1. 技術(shù)棧

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. 待辦事項(xiàng)

5. 注意事項(xiàng)

6. 參考鏈接

1. 技術(shù)棧

LibreOffice:v6.2.3

jodconverter:4.2.2

PDFBox:2.0.12

cglib動(dòng)態(tài)代理 + 懶漢工廠模式 + 策略模式 + 裝飾器模式

qtools-property管理配置文件(application.yml、bootstrap.yml、workable-converter.yml三種命名的配置文件任意包含一種即可)

2. 功能

支持doc、docx、html、ppt、png、pdf等等類型的文件互相轉(zhuǎn)換

支持按照文件路徑、字節(jié)輸入輸出流、Base64等不同姿勢(shì)轉(zhuǎn)換

不依賴第三方框架,即插即用,支持application.yml、bootstrap.yml、workable-converter.yml三種配置(自己項(xiàng)目中具體配置一個(gè)即可)

3. 使用 3.1 安裝配置LibreOffice6.2.3

CentOS請(qǐng)直接參考這篇文章:CentOS7安裝LibreOffice6.2.3

windows跟Mac同樣可以在上述文章中拿到下載鏈接

安裝完成后,請(qǐng)記住您的LibreOffice的Home目錄,后面需要用到

默認(rèn)目錄:

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 編輯配置文件

在項(xiàng)目的resources目錄下,創(chuàng)建一個(gè)yml配置文件,需要確保文件名稱為application.yml、bootstrap.yml或workable-converter.yml三種命名任意一個(gè)即可

添加以下配置:

com:
  liumapp:
    workable-converter:
      libreofficePath: "/Applications/LibreOffice.app/Contents"

libreofficePath的值為L(zhǎng)ibreOffice:6.2.3的安裝目錄

完整的配置項(xiàng)列表如下

參數(shù)名 解釋 默認(rèn)值
libreofficePath LibreOffice安裝目錄 (String) 無默認(rèn)值,該項(xiàng)必填
libreofficePort LibreOffice監(jiān)聽端口 (int) 2002
tmpPath 臨時(shí)存儲(chǔ)目錄 (String) "./data/"
3.4 執(zhí)行轉(zhuǎn)換 3.4.1 按照文件路徑轉(zhuǎn)換

以doc轉(zhuǎn)PDF為例

WorkableConverter converter = new WorkableConverter();//實(shí)例化的同時(shí),初始化配置項(xiàng),配置項(xiàng)的校驗(yàn)通過Decorator裝飾

ConvertPattern pattern = ConvertPatternManager.getInstance();
pattern.fileToFile("./data/test.doc", "./data/pdf/result1.pdf"); //test.doc為待轉(zhuǎn)換文件路徑,result1.pdf為轉(zhuǎn)換結(jié)果存儲(chǔ)路徑
pattern.setSrcFilePrefix(DefaultDocumentFormatRegistry.DOC);
pattern.setDestFilePrefix(DefaultDocumentFormatRegistry.PDF);

converter.setConverterType(CommonConverterManager.getInstance());//策略模式,后續(xù)實(shí)現(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()來設(shè)置輸入輸出流,轉(zhuǎn)換源文件數(shù)據(jù)從輸入流中讀取,轉(zhuǎn)換結(jié)果會(huì)直接寫入輸出流中,

同時(shí)要切換轉(zhuǎn)換格式,跟上例一樣設(shè)置不同的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()來設(shè)置轉(zhuǎn)換源的base64值

轉(zhuǎn)換結(jié)果result仍然是一個(gè)boolean類型,通過pattern.getBase64Result來獲取轉(zhuǎn)換結(jié)果的base64值

要切換轉(zhuǎn)換格式,跟上例一樣設(shè)置不同的prefix即可

3.5 圖片處理

目前對(duì)于圖片的處理,只支持將PDF轉(zhuǎn)PNG圖片(如果1份pdf文件有20頁,那么將會(huì)轉(zhuǎn)換為20張png圖片),該功能的實(shí)現(xiàn)基于PDFBox:2.0.12

3.5.1 按照文件路徑處理

pattern.fileToFiles()第一個(gè)參數(shù)為待轉(zhuǎn)換的pdf文件路徑,第二個(gè)參數(shù)為轉(zhuǎn)換后的圖片存儲(chǔ)路徑

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 resultBase64 = pattern.getBase64Results()獲取轉(zhuǎn)換后的圖片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 resultBase64 = pattern.getBase64Results();
assertEquals(true, result);
assertEquals(4, resultBase64.size());
3.6 添加水印

水印的轉(zhuǎn)換策略為WaterMarkConverter

添加水印注意事項(xiàng)

請(qǐng)確保輸入源文件后綴為PDF,輸出源文件后綴也為PDF

水印參數(shù)需要new一個(gè)WaterMarkRequire來設(shè)置

setWaterMarkPage(int page)代表在哪一頁上添加水印,如果為0,則表示所有頁面

水印本身為一個(gè)PDF文件,該文件只需要一頁,其第一頁的內(nèi)容將被視為水印添加到源文件中

比如說,要添加透明度為0.3的文本作為水印的話,自己使用word等工具繪制透明度為0.3的字體(或者上包含透明度的png圖片也可以)并另存為一個(gè)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. 待辦事項(xiàng)

已經(jīng)測(cè)試通過的有doc、docx、html 按照不同姿勢(shì)轉(zhuǎn)PDF,其他類型的并沒有編寫測(cè)試單元,后續(xù)考慮增加

目前只支持yml配置,后續(xù)考慮添加其他類型的配置支持(xml、properties等)

目前Markdown格式很流行,考慮實(shí)現(xiàn)markdown格式的字符串轉(zhuǎn)PDF(markdown -> html -> pdf)

5. 注意事項(xiàng)

因?yàn)樾枰狶ibreOffice的支持,所以不建議在Docker等容器內(nèi)運(yùn)行(LibreOffice暫無Docker穩(wěn)定發(fā)行版的鏡像)

轉(zhuǎn)換亂碼、轉(zhuǎn)換耗時(shí)過長(zhǎng),請(qǐng)檢查服務(wù)器是否安裝有中文字體

項(xiàng)目啟動(dòng)后,在執(zhí)行第一次轉(zhuǎn)換任務(wù)時(shí),因?yàn)樯婕暗脚cLibreOffice建立連接等操作,所以會(huì)耗時(shí)較長(zhǎng),第二次任務(wù)及以后穩(wěn)定在0.5秒以內(nèi)(具體時(shí)間因機(jī)器配置會(huì)有所差異)

6. 參考鏈接

https://www.libreoffice.org/d...

https://api.libreoffice.org/

https://github.com/sbraconnie...

https://memorynotfound.com/ap...

文章版權(quán)歸作者所有,未經(jīng)允許請(qǐng)勿轉(zhuǎn)載,若此文章存在違規(guī)行為,您可以聯(lián)系管理員刪除。

轉(zhuǎn)載請(qǐng)注明本文地址:http://systransis.cn/yun/75820.html

相關(guān)文章

  • LibreOffice 7.2 正式發(fā)布:原生適配蘋果 M1 芯片,更好兼容微軟 Office 文檔

    摘要:文檔基金會(huì)已經(jīng)宣布推出標(biāo)簽下的日志,這是辦公套件的一個(gè)重要的新版本,帶有大量的互操作性改進(jìn),以更好地支持微軟格式,如和。新的更新還增加了對(duì)蘋果芯片的原生支持,不過,出于穩(wěn)定性考慮,建議用戶使用舊的二進(jìn)制類型。另外的來自于名個(gè)人志愿者。The Document Foundation(文檔基金會(huì))已經(jīng)宣布推出 LibreOffice 7.2,這是辦公套件的一個(gè)重要的新版本,帶有大量的互操作性改進(jìn)...

    loonggg 評(píng)論0 收藏0
  • SpringBoot使用LibreOffice轉(zhuǎn)換PDF

    摘要:用將文檔轉(zhuǎn)換本例使用。在和環(huán)境下測(cè)試通過。轉(zhuǎn)換命令源文件放在或者封裝了一組轉(zhuǎn)換命令,通過調(diào)用相關(guān)服務(wù)。安裝檢查已有字體庫復(fù)制字體新建文件夾把系統(tǒng)的字體復(fù)制進(jìn)去。 用LibreOffice將Office文檔轉(zhuǎn)換PDF 本例使用 LibreOffice-6.0.4、jodconverter-4.2.0、spring-boot-1.5.9.RELEASE。 在CentOS7 + ope...

    mcterry 評(píng)論0 收藏0
  • LibreOffice – 免費(fèi)跨平臺(tái)辦公套件可替代Microsoft Office套件

    摘要:在這里,老蔣推薦這款辦公套裝,完全是免費(fèi)開源且跨平臺(tái)的辦公軟件。因?yàn)槔鲜Y是測(cè)試這款辦公軟件的,我就不選擇單獨(dú)的軟件路徑,直接默認(rèn)。這樣,正如有些網(wǎng)友說的,在一定程度上還是可以取代微軟軟件的。一般來說,我們購買的電腦是自帶正版WIN系統(tǒng)的會(huì)同時(shí)自帶正版Microsoft Office套件辦公軟件,這樣我們就無需購買或者尋找免費(fèi)的辦公軟件。但是,我們有些朋友的電腦系統(tǒng)并非正版的,或者我們?cè)谑褂胢...

    The question 評(píng)論0 收藏0
  • 在網(wǎng)頁中預(yù)覽excel表格文件

    摘要:項(xiàng)目需求在前端頁面中實(shí)現(xiàn)預(yù)覽表格的功能,上網(wǎng)了解之后大致總結(jié)為一下幾種方法。第四種方法把表格打開后,另存為格式的文件。在網(wǎng)頁上預(yù)覽效果和表格一致。 項(xiàng)目需求在前端頁面中實(shí)現(xiàn)預(yù)覽excel表格的功能,上網(wǎng)了解之后大致總結(jié)為一下幾種方法。 1.office文檔轉(zhuǎn)換為pdf,再轉(zhuǎn)swf,然后通過網(wǎng)頁加載flash進(jìn)行預(yù)覽 2.通過 xlsx.js,jszip.js插件 3.django xl...

    Honwhy 評(píng)論0 收藏0

發(fā)表評(píng)論

0條評(píng)論

最新活動(dòng)
閱讀需要支付1元查看
<