{"id":26367533,"url":"https://github.com/litongjava/java-libreoffice-server","last_synced_at":"2025-03-16T21:17:34.816Z","repository":{"id":274156373,"uuid":"922075274","full_name":"litongjava/java-libreoffice-server","owner":"litongjava","description":null,"archived":false,"fork":false,"pushed_at":"2025-01-25T09:27:29.000Z","size":19,"stargazers_count":0,"open_issues_count":0,"forks_count":0,"subscribers_count":1,"default_branch":"main","last_synced_at":"2025-01-25T10:21:06.989Z","etag":null,"topics":[],"latest_commit_sha":null,"homepage":null,"language":"Java","has_issues":true,"has_wiki":null,"has_pages":null,"mirror_url":null,"source_name":null,"license":"mit","status":null,"scm":"git","pull_requests_enabled":true,"icon_url":"https://github.com/litongjava.png","metadata":{"files":{"readme":"readme-cn.md","changelog":null,"contributing":null,"funding":null,"license":"LICENSE","code_of_conduct":null,"threat_model":null,"audit":null,"citation":null,"codeowners":null,"security":null,"support":null,"governance":null,"roadmap":null,"authors":null,"dei":null,"publiccode":null,"codemeta":null}},"created_at":"2025-01-25T08:48:46.000Z","updated_at":"2025-01-25T09:27:32.000Z","dependencies_parsed_at":"2025-01-25T10:21:24.386Z","dependency_job_id":"3e2a4cf5-4e82-4854-826d-4eb6ccc4f917","html_url":"https://github.com/litongjava/java-libreoffice-server","commit_stats":null,"previous_names":["litongjava/java-libreoffice-server"],"tags_count":0,"template":false,"template_full_name":null,"repository_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/litongjava%2Fjava-libreoffice-server","tags_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/litongjava%2Fjava-libreoffice-server/tags","releases_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/litongjava%2Fjava-libreoffice-server/releases","manifests_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/litongjava%2Fjava-libreoffice-server/manifests","owner_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/owners/litongjava","download_url":"https://codeload.github.com/litongjava/java-libreoffice-server/tar.gz/refs/heads/main","host":{"name":"GitHub","url":"https://github.com","kind":"github","repositories_count":243933450,"owners_count":20370988,"icon_url":"https://github.com/github.png","version":null,"created_at":"2022-05-30T11:31:42.601Z","updated_at":"2022-07-04T15:15:14.044Z","host_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub","repositories_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories","repository_names_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repository_names","owners_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/owners"}},"keywords":[],"created_at":"2025-03-16T21:17:34.248Z","updated_at":"2025-03-16T21:17:34.808Z","avatar_url":"https://github.com/litongjava.png","language":"Java","funding_links":[],"categories":[],"sub_categories":[],"readme":"# java-libreoffice-server\n\n一个基于 Java、TIO-boot、JODConverter 和 LibreOffice 构建的轻量级高效文件转换工具。该工具允许用户通过简单的 HTTP API 将各种 Office 文档格式转换为 PDF。\n\n## 目录\n\n- [技术栈](#技术栈)\n- [功能特性](#功能特性)\n- [安装](#安装)\n- [配置](#配置)\n- [使用方法](#使用方法)\n- [API 文档](#api文档)\n  - [端点](#端点)\n  - [请求参数](#请求参数)\n  - [响应格式](#响应格式)\n- [API 示例](#api示例)\n  - [使用 cURL](#使用-curl)\n  - [使用 Postman](#使用-postman)\n- [贡献指南](#贡献指南)\n- [许可证](#许可证)\n\n## 技术栈\n\n- **Java：** 用于开发应用程序的主要编程语言。\n- **TIO-boot：** 一个轻量级高性能的基于 Java 的 Web 服务器框架。\n- **JODConverter：** Java OpenDocument Converter，利用 LibreOffice 进行文档转换的库。\n- **LibreOffice：** 一个开源办公套件，JODConverter 使用它来将各种文档格式转换为 PDF。\n\n## 功能特性\n\n- **多格式支持：** 支持将包括 PPT/PPTX、DOC/DOCX、XLS/XLSX、ODT、ODS 和 ODP 在内的多种 Office 文档格式转换为 PDF。\n- **轻量级：** 最小化的依赖和高效的处理确保转换快速可靠。\n- **HTTP API：** 简单直接的 API 端点，便于与其他应用程序或服务集成。\n- **临时文件管理：** 自动处理临时文件的创建和删除，确保最佳性能和安全性。\n- **错误处理：** 提供有意义的错误消息和状态码，便于调试和提升用户体验。\n\n## 安装\n\n### 前置条件\n\n- **Java 8 或更高版本：** 确保系统上已安装 Java。可以通过以下命令验证 Java 版本：\n  ```bash\n  java -version\n  ```\n- **Maven：** 用于构建项目。可以通过以下命令检查是否已安装 Maven：\n  ```bash\n  mvn -v\n  ```\n\n### 步骤\n\n1. **克隆仓库：**\n   ```bash\n   git clone https://github.com/litongjava/java-libreoffice-server.git\n   cd java-libreoffice-server\n   ```\n\n2. **构建项目：**\n   ```bash\n   mvn clean install\n   ```\n\n3. **运行应用程序：**\n   ```bash\n   mvn spring-boot:run\n   ```\n   服务器将默认在 `http://localhost:8080` 启动。\n\n## 配置\n\n应用程序使用适用于大多数环境的默认设置。不过，您可以通过修改位于 `src/main/resources` 目录下的 `application.properties` 文件来自定义配置，例如服务器端口、LibreOffice 安装路径等。\n\n示例 `application.properties`：\n```properties\nserver.port=8080\nlibreoffice.installation.path=/usr/lib/libreoffice\n```\n\n## 使用方法\n\n服务器运行后，您可以使用提供的 API 端点将 Office 文档转换为 PDF。API 接受包含要转换文件的 `multipart/form-data` POST 请求。\n\n## API 文档\n\n### 端点\n\n| 端点               | 方法 | 描述                                   | 支持格式                             |\n|--------------------|------|----------------------------------------|--------------------------------------|\n| `/hello`           | GET  | 简单的健康检查或问候端点。             | 不适用                               |\n| `/api/ppt/pdf`     | POST | 将 PPT/PPTX 文件转换为 PDF。           | PPT, PPTX                            |\n| `/api/doc/pdf`     | POST | 将 DOC/DOCX 文件转换为 PDF。           | DOC, DOCX                            |\n| `/api/xls/pdf`     | POST | 将 XLS/XLSX 文件转换为 PDF。           | XLS, XLSX                            |\n| `/api/odt/pdf`     | POST | 将 ODT 文件转换为 PDF。                 | ODT                                  |\n| `/api/ods/pdf`     | POST | 将 ODS 文件转换为 PDF。                 | ODS                                  |\n| `/api/odp/pdf`     | POST | 将 ODP 文件转换为 PDF。                 | ODP                                  |\n| `/api/convert/pdf` | POST | 将多种支持的格式转换为 PDF。            | DOC, DOCX, PPT, PPTX, XLS, XLSX, ODT, ODS, ODP |\n\n### 请求参数\n\n所有转换端点（除了 `/hello`）接受一个 `multipart/form-data` POST 请求，包含以下参数：\n\n- **file**（必需）：要转换的 Office 文档文件。\n\n### 响应格式\n\n- **成功：** 返回转换后的 PDF 文件作为可下载附件，`Content-Type` 为 `application/pdf`。\n- **失败：** 返回包含错误消息的 JSON 响应。\n\n#### 成功响应示例\n\n- **头部：**\n  ```\n  Content-Type: application/pdf\n  Content-Disposition: attachment; filename=\"converted-file.pdf\"\n  ```\n- **正文：** PDF 文件的二进制内容。\n\n#### 错误响应示例\n\n- **头部：**\n  ```\n  Content-Type: application/json\n  ```\n- **正文：**\n  ```json\n  {\n    \"status\": \"fail\",\n    \"message\": \"详细说明失败原因的错误消息。\"\n  }\n  ```\n\n## API 示例\n\n### 使用 cURL\n\n#### 1. 将 PPTX 转换为 PDF\n\n```bash\ncurl -F \"file=@1.pptx\" http://127.0.0.1/api/ppt/pdf -o 1.pdf\n```\n\n**解释：**\n- `-F \"file=@1.pptx\"`：上传名为 `1.pptx` 的文件，表单字段名为 `file`。\n- `http://127.0.0.1/api/ppt/pdf`：用于将 PPT/PPTX 文件转换为 PDF 的 API 端点。\n- `-o 1.pdf`：将返回的 PDF 保存为 `1.pdf`。\n\n---\n\n#### 2. 将 DOCX 转换为 PDF\n\n```bash\ncurl -F \"file=@example.docx\" http://127.0.0.1/api/doc/pdf -o example.pdf\n```\n\n**解释：**\n- `-F \"file=@example.docx\"`：上传名为 `example.docx` 的文件。\n- `http://127.0.0.1/api/doc/pdf`：用于将 DOC/DOCX 文件转换为 PDF 的 API 端点。\n- `-o example.pdf`：将返回的 PDF 保存为 `example.pdf`。\n\n---\n\n#### 3. 将 XLSX 转换为 PDF\n\n```bash\ncurl -F \"file=@financial_report.xlsx\" http://127.0.0.1/api/xls/pdf -o financial_report.pdf\n```\n\n**解释：**\n- `-F \"file=@financial_report.xlsx\"`：上传名为 `financial_report.xlsx` 的文件。\n- `http://127.0.0.1/api/xls/pdf`：用于将 XLS/XLSX 文件转换为 PDF 的 API 端点。\n- `-o financial_report.pdf`：将返回的 PDF 保存为 `financial_report.pdf`。\n\n---\n\n#### 4. 将 ODT 转换为 PDF\n\n```bash\ncurl -F \"file=@example.odt\" http://127.0.0.1/api/odt/pdf -o example.pdf\n```\n\n**解释：**\n- `-F \"file=@example.odt\"`：上传名为 `example.odt` 的文件。\n- `http://127.0.0.1/api/odt/pdf`：用于将 ODT 文件转换为 PDF 的 API 端点。\n- `-o example.pdf`：将返回的 PDF 保存为 `example.pdf`。\n\n---\n\n#### 5. 使用通用端点将多种格式转换为 PDF\n\n```bash\ncurl -F \"file=@presentation.pptx\" http://127.0.0.1/api/convert/pdf -o presentation.pdf\n```\n\n**解释：**\n- `-F \"file=@presentation.pptx\"`：上传名为 `presentation.pptx` 的文件。\n- `http://127.0.0.1/api/convert/pdf`：用于将多种支持格式转换为 PDF 的通用 API 端点。\n- `-o presentation.pdf`：将返回的 PDF 保存为 `presentation.pdf`。\n\n---\n\n### 其他注意事项\n\n1. **文件路径：**\n   - 确保提供给 `@` 符号的文件路径是正确的。如果文件位于运行 cURL 命令的当前目录，可以像上面示例那样直接使用文件名。\n   - 对于位于不同目录的文件，请提供绝对路径或相对路径。例如：\n     ```bash\n     curl -F \"file=@/path/to/your/file/example.docx\" http://127.0.0.1/api/doc/pdf -o example.pdf\n     ```\n     在 Windows 上，您可以使用双反斜杠或正斜杠：\n     ```bash\n     curl -F \"file=@C:\\\\documents\\\\example.docx\" http://127.0.0.1/api/doc/pdf -o example.pdf\n     ```\n     或\n     ```bash\n     curl -F \"file=@C:/documents/example.docx\" http://127.0.0.1/api/doc/pdf -o example.pdf\n     ```\n\n2. **输出文件命名：**\n   - `-o` 选项允许您指定输出 PDF 文件的名称。您可以根据需要命名，以反映源文件或任何其他命名约定。\n\n3. **处理文件名中的空格：**\n   - 如果文件名包含空格，请将整个 `@` 路径用引号括起来。例如：\n     ```bash\n     curl -F \"file=@\\\"Chapter 1 Lecture Slides Set 1.pptx\\\"\" http://127.0.0.1/api/ppt/pdf -o \"Chapter1_Lecture_Slides_Set_1.pdf\"\n     ```\n\n4. **保存到特定目录：**\n   - 您可以为输出文件指定目录路径。例如：\n     ```bash\n     curl -F \"file=@presentation.pptx\" http://127.0.0.1/api/convert/pdf -o /path/to/save/presentation.pdf\n     ```\n     在 Windows 上：\n     ```bash\n     curl -F \"file=@presentation.pptx\" http://127.0.0.1/api/convert/pdf -o \"C:/Users/YourName/Documents/presentation.pdf\"\n     ```\n\n5. **自动化多文件转换：**\n   - 如果需要一次转换多个文件，可以考虑在 shell 中使用循环或编写简单的脚本。例如，在类 Unix shell 中：\n     ```bash\n     for file in *.pptx *.docx *.xlsx *.odt; do\n         base=$(basename \"$file\" | cut -d. -f1)\n         curl -F \"file=@$file\" http://127.0.0.1/api/convert/pdf -o \"${base}.pdf\"\n     done\n     ```\n\n6. **错误处理：**\n   - 要处理错误并查看更详细的输出，可以添加 `-v` 标志：\n     ```bash\n     curl -v -F \"file=@example.docx\" http://127.0.0.1/api/doc/pdf -o example.pdf\n     ```\n\n7. **重定向输出和错误：**\n   - 您可以在保存 PDF 的同时将标准错误重定向到日志文件：\n     ```bash\n     curl -F \"file=@example.docx\" http://127.0.0.1/api/doc/pdf -o example.pdf 2\u003eerror.log\n     ```\n\n### 使用 Postman\n\n1. **打开 Postman** 并创建一个新的 `POST` 请求。\n2. **设置 URL** 为其中一个转换端点，例如：`http://127.0.0.1/api/ppt/pdf`。\n3. **导航到 `Body` 标签**，选择 `form-data`。\n4. **添加一个键**，命名为 `file`，将类型设置为 `File`，并**上传您的 Office 文档**。\n5. **发送请求**。\n6. **从响应中下载 PDF**。\n\n## python 调用示例\n``` python\nimport requests\n\nurl = \"https://java-libreoffice-server.fly.dev/api/ppt/pdf\"\nfile_path = r'C:\\Users\\Administrator\\Downloads\\Accounting Basics.ppt'\n\nwith open(file_path, 'rb') as file:\n    files = {\n        'file': ('Accounting Basics.ppt', file, 'application/vnd.ms-powerpoint')\n    }\n    response = requests.post(url, files=files)\n\nprint(response.text)\n\n```\n\n## java调用示例\n```Java\npackage com.litongjava.libreoffice;\n\nimport java.io.File;\nimport java.io.IOException;\nimport java.nio.file.Files;\nimport java.nio.file.Paths;\n\nimport org.junit.Test;\n\nimport com.litongjava.model.http.response.ResponseVo;\nimport com.litongjava.tio.utils.environment.EnvUtils;\nimport com.litongjava.tio.utils.hutool.FileUtil;\n\npublic class LibreofficeClientTest {\n\n  @Test\n  public void test() {\n    EnvUtils.load();\n    try {\n      byte[] bytes = Files.readAllBytes(Paths.get(\"F:\\\\document\\\\subject-docs\\\\04_Chemistry\\\\CHEM_161\\\\ch1\\\\Chapter 1 Lectture Slides Set 1.pptx\"));\n      ResponseVo responseVo = LibreOfficeClient.convertToPdf(bytes, \"Chapter 1 Lectture Slides Set 1.pptx\");\n      if (responseVo.isOk()) {\n        FileUtil.writeBytes(responseVo.getBodyBytes(), new File(\"Chapter 1 Lectture Slides Set 1.pdf\"));\n      } else {\n        System.err.print(responseVo.getBodyString());\n      }\n    } catch (IOException e) {\n      e.printStackTrace();\n    }\n  }\n}\n\n```\n## 贡献指南\n\n欢迎贡献！请按照以下步骤操作：\n\n1. **Fork 仓库**\n2. **创建功能分支**\n   ```bash\n   git checkout -b feature/YourFeature\n   ```\n3. **提交您的更改**\n   ```bash\n   git commit -m \"添加您的功能\"\n   ```\n4. **推送到分支**\n   ```bash\n   git push origin feature/YourFeature\n   ```\n5. **打开 Pull Request**\n\n请确保您的代码遵循项目的编码标准并包含适当的测试。\n\n## 许可证\n\n该项目基于 [MIT 许可证](LICENSE) 进行授权。","project_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2Flitongjava%2Fjava-libreoffice-server","html_url":"https://awesome.ecosyste.ms/projects/github.com%2Flitongjava%2Fjava-libreoffice-server","lists_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2Flitongjava%2Fjava-libreoffice-server/lists"}