# libreoffice_study **Repository Path**: luochunhai/libreoffice_study ## Basic Information - **Project Name**: libreoffice_study - **Description**: libreoffice 将文件转为 pdf - **Primary Language**: Unknown - **License**: Not specified - **Default Branch**: master - **Homepage**: None - **GVP Project**: No ## Statistics - **Stars**: 0 - **Forks**: 1 - **Created**: 2024-12-05 - **Last Updated**: 2024-12-05 ## Categories & Tags **Categories**: Uncategorized **Tags**: None ## README ## 简介 LibreOffice 是一款开放源代码的自由免费全能办公软件,可运行于 Microsoft Windows, GNU/Linux 以及 macOS 等操作系统上。它包含了 Writer, Calc, Impress, Draw, Math 以及 Base 等组件,可分别用于文本文档、电子表格、幻灯片演示文稿、绘图文档、数学公式编辑、数据库管理等工作。 LibreOffice 支持各种文档格式。除了它原生支持的开放文档格式 (OpenDocument Format, ODF) 外,它还支持许多的非开放格式,比如微软的 Microsoft® Word, Excel, PowerPoint 以及 Publisher 的格式等。https://blog.csdn.net/weixin_45020617/article/details/129985431 ## 安装 ### windows 1、下载并安装 libreoffice 2、进入安装目录 ```bash D:\Program Files\LibreOffice\program ``` 3、启动 LibreOffice,这样就运行在 8100 端口了 ```bash soffice -headless -accept="socket,host=127.0.0.1,port=8100;urp;" -nofirststartwizard ``` ### Linux 1、下载 官方地址:https://zh-cn.libreoffice.org/download/libreoffice 2、将下载好的linux版本的文件上传至服务器的某个目录,然后解压文件 ```bash tar -zxvf LibreOffice_7.1.7_Linux_x86-64_rpm.tar.gz ``` 3、上面的文件解压之后会产生一个RPMS文件,使用以下命令进入到RPMS目录并进行安装 ```bash cd /LibreOffice_7.1.7_Linux_x86-64_rpm/RPMSyum localinstall *.rpm ``` 4、安装libreoffice-headless(安装这个东西,需要java环境,可以先安装一下java环境) ```bash yum install libreoffice-headless ``` 5、执行完上面的代码就安装成功了。可以输入libreoffice测试一下。 ```bash /opt/libreoffice7.1 --convert-to pdf:writer_pdf_Export /目录/文件名.pptx --outdir /目录/ ``` ## spring集成libreoffice 1、项目添加依赖 ```xml com.artofsolving jodconverter 2.2.1 org.apache.commons commons-lang3 3.7 ``` 2、创建工具类 ```java package com.example.libreoffice_study.util; import com.artofsolving.jodconverter.DefaultDocumentFormatRegistry; import com.artofsolving.jodconverter.DocumentConverter; import com.artofsolving.jodconverter.DocumentFormat; import com.artofsolving.jodconverter.openoffice.connection.OpenOfficeConnection; import com.artofsolving.jodconverter.openoffice.connection.SocketOpenOfficeConnection; import com.artofsolving.jodconverter.openoffice.converter.StreamOpenOfficeDocumentConverter; import java.io.*; import java.net.HttpURLConnection; import java.net.URL; import java.net.URLConnection; /** * 文件格式转换工具类 */ public class FileConvertUtil { /** * 默认转换后文件后缀 */ private static final String DEFAULT_SUFFIX = "pdf"; /** * openoffice_port */ private static final Integer OPENOFFICE_PORT = 8100; /** * 方法描述 office文档转换为PDF(处理本地文件) * @param sourcePath 源文件路径 * @param suffix 源文件后缀 * @return byte[] 转换后文件 */ public static byte[] convertLocaleFile(String sourcePath, String suffix) throws Exception { File inputFile = new File(sourcePath); InputStream inputStream = new FileInputStream(inputFile); return covertCommonByStream(inputStream, suffix); } /** * 方法描述 office文档转换为PDF(处理网络文件) * @param netFileUrl 网络文件路径 * @param suffix 文件后缀 * @return byte[] 转换后文件 */ public static byte[] convertNetFile(String netFileUrl, String suffix) throws Exception { // 创建URL URL url = new URL(netFileUrl); // 试图连接并取得返回状态码 URLConnection urlconn = url.openConnection(); urlconn.connect(); HttpURLConnection httpconn = (HttpURLConnection) urlconn; int httpResult = httpconn.getResponseCode(); if (httpResult == HttpURLConnection.HTTP_OK) { InputStream inputStream = urlconn.getInputStream(); return covertCommonByStream(inputStream, suffix); } return null; } /** * 方法描述 将文件以流的形式转换 * * @param inputStream 源文件输入流 * @param suffix 源文件后缀 * @return OutputStream 转换后文件 */ public static byte[] covertCommonByStream(InputStream inputStream, String suffix) throws Exception { ByteArrayOutputStream out = new ByteArrayOutputStream(); OpenOfficeConnection connection = new SocketOpenOfficeConnection(OPENOFFICE_PORT); connection.connect(); DocumentConverter converter = new StreamOpenOfficeDocumentConverter(connection); DefaultDocumentFormatRegistry formatReg = new DefaultDocumentFormatRegistry(); DocumentFormat targetFormat = formatReg.getFormatByFileExtension(DEFAULT_SUFFIX); DocumentFormat sourceFormat = formatReg.getFormatByFileExtension(suffix); converter.convert(inputStream, sourceFormat, out, targetFormat); connection.disconnect(); return out.toByteArray(); } /** * 方法描述 outputStream转inputStream */ public static ByteArrayInputStream outputStreamConvertInputStream(final OutputStream out) throws Exception { ByteArrayOutputStream baos = (ByteArrayOutputStream) out; return new ByteArrayInputStream(baos.toByteArray()); } } ``` 3、测试 ```java @RestController public class TestController { @RequestMapping("/test") public void test(@RequestParam("file") String file, @RequestParam("type") String type) throws Exception { byte[] docs = FileConvertUtil.convertLocaleFile(file, type); ByteArrayOutputStream outputStream = new ByteArrayOutputStream(); outputStream.write(docs); FileOutputStream out = new FileOutputStream("D://test.pdf"); outputStream.writeTo(out); outputStream.close(); out.close(); System.out.println("装换完成"); } } ``` 4、文件默认的类型配置如下(应该也可以自定义吧) ![img.png](img.png) 注意默认的类型没有 docx 和 pptx 等类型,但可以使用 doc 和 ppt 替代,装换效果如下 ![img_1.png](img_1.png)