{"id":17724565,"url":"https://github.com/liumapp/workable-converter","last_synced_at":"2025-04-15T21:23:24.326Z","repository":{"id":37718052,"uuid":"183131604","full_name":"liumapp/workable-converter","owner":"liumapp","description":"基于libreoffice实现的文档转换项目，无框架依赖，即插即用","archived":false,"fork":false,"pushed_at":"2022-02-11T03:54:47.000Z","size":44176,"stargazers_count":101,"open_issues_count":6,"forks_count":45,"subscribers_count":5,"default_branch":"master","last_synced_at":"2024-01-24T09:39:49.321Z","etag":null,"topics":["convert","doc","docx","java","library","libreoffice","maven","pdf","ppt"],"latest_commit_sha":null,"homepage":"","language":"Java","has_issues":true,"has_wiki":null,"has_pages":null,"mirror_url":null,"source_name":null,"license":"gpl-3.0","status":null,"scm":"git","pull_requests_enabled":true,"icon_url":"https://github.com/liumapp.png","metadata":{"files":{"readme":"README.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}},"created_at":"2019-04-24T02:28:02.000Z","updated_at":"2023-12-25T11:14:19.000Z","dependencies_parsed_at":"2022-08-30T09:11:28.381Z","dependency_job_id":null,"html_url":"https://github.com/liumapp/workable-converter","commit_stats":null,"previous_names":[],"tags_count":7,"template":false,"template_full_name":null,"repository_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/liumapp%2Fworkable-converter","tags_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/liumapp%2Fworkable-converter/tags","releases_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/liumapp%2Fworkable-converter/releases","manifests_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/liumapp%2Fworkable-converter/manifests","owner_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/owners/liumapp","download_url":"https://codeload.github.com/liumapp/workable-converter/tar.gz/refs/heads/master","host":{"name":"GitHub","url":"https://github.com","kind":"github","repositories_count":249155125,"owners_count":21221543,"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":["convert","doc","docx","java","library","libreoffice","maven","pdf","ppt"],"created_at":"2024-10-25T15:47:14.230Z","updated_at":"2025-04-15T21:23:24.302Z","avatar_url":"https://github.com/liumapp.png","language":"Java","readme":"# workable-converter\n\n基于libreoffice实现的文档转换项目，无框架依赖，即插即用\n\n\u003ca title=\"Hits\" target=\"_blank\" href=\"https://github.com/liumapp/workable-converter\"\u003e\u003cimg src=\"https://hits.b3log.org/b3log/hits.svg\"\u003e\u003c/a\u003e\n\n* [1. 技术栈](#1-技术栈)\n* [2. 功能](#2-功能)\n* [3. 使用](#3-使用)\n    * [3.1 安装配置LibreOffice6.2.3](#31-安装配置libreoffice623)\n    * [3.2 获取依赖](#32-获取依赖)\n    * [3.3 编辑配置文件](#33-编辑配置文件)\n    * [3.4 执行转换](#34-执行转换)\n        * [3.4.1 按照文件路径转换](#341-按照文件路径转换)\n        * [3.4.2 按照输入输出流转换](#342-按照输入输出流转换)\n        * [3.4.3 按照文件Base64转换](#343-按照文件base64转换)\n    * [3.5 图片处理](#35-图片处理)    \n        * [3.5.1 按照文件路径处理](#351-按照文件路径处理)\n        * [3.5.2 按照文件Base64处理](#352-按照文件base64处理)\n    * [3.6 添加水印](#36-添加水印)\n        * [3.6.1 按照文件路径添加水印](#361-按照文件路径添加水印)\n        * [3.6.2 按照流添加水印](#362-按照流添加水印)\n        * [3.6.3 按照base64添加水印](#363-按照base64添加水印)\n    * [3.7 itext7编辑pdf](#37-itext7编辑pdf)\n        * [3.7.1 按照文件路径编辑pdf](#371-按照文件路径编辑pdf)\n        * [3.7.2 按照base64编辑pdf](#372-按照base64编辑pdf)\n    * [3.8 使用Itext7 HTML转PDF文件](#38-使用Itext7-HTML转PDF文件)\n        * [3.8.1 按照base64方式](#381-按照base64方式)                \n* [4. 待办事项](#4-待办事项)\n* [5. 注意事项](#5-注意事项)\n* [6. 参考链接](#6-参考链接)\n\n## 1. 技术栈\n\n* LibreOffice:v6.2.3\n\n* jodconverter:4.2.2\n\n* PDFBox:2.0.12\n\n* cglib动态代理 + 懒汉工厂模式 + 策略模式 + 装饰器模式\n\n* qtools-property管理配置文件(applicatpwdion.yml、bootstrap.yml、workable-converter.yml三种命名的配置文件任意包含一种即可)\n\n## 2. 功能\n\n* 支持doc、docx、html、ppt、png、pdf等等类型的文件**互相转换**\n\n* 支持按照文件路径、字节输入输出流、Base64等不同姿势转换\n\n* 不依赖第三方框架，即插即用，支持application.yml、bootstrap.yml、workable-converter.yml三种配置（自己项目中具体配置一个即可）\n\n## 3. 使用\n\n### 3.1 安装配置LibreOffice6.2.3\n\nCentOS请直接参考这篇文章：[CentOS7安装LibreOffice6.2.3](http://www.liumapp.com/articles/2019/04/25/1556178926172.html)\n\nwindows跟Mac同样可以在上述文章中拿到下载链接\n\n安装完成后，请记住您的LibreOffice的Home目录，后面需要用到\n\n默认目录：\n\n* CentOS: /opt/libreoffice6.2/\n\n* Mac: /Applications/LibreOffice.app/Contents/\n\n* Windows: C:\\\\Program Files\\\\LibreOffice\\\\\n\n### 3.2 获取依赖\n\n* Maven\n\n```` mxml\n\u003cdependency\u003e\n  \u003cgroupId\u003ecom.liumapp.workable.converter\u003c/groupId\u003e\n  \u003cartifactId\u003eworkable-converter\u003c/artifactId\u003e\n  \u003cversion\u003ev1.4.2\u003c/version\u003e\n\u003c/dependency\u003e\n````\n* Gradle\n\n````yaml\ncompile group: 'com.liumapp.workable.converter', name: 'workable-converter', version: 'v1.2.0'\n````\n\n### 3.3 编辑配置文件\n\n在项目的resources目录下，创建一个yml配置文件，需要确保文件名称为application.yml、bootstrap.yml或workable-converter.yml三种命名任意一个即可\n\n添加以下配置：\n\n````yaml\ncom:\n  liumapp:\n    workable-converter:\n      libreofficePath: \"/Applications/LibreOffice.app/Contents\"\n````\n\nlibreofficePath的值为LibreOffice:6.2.3的安装目录\n\n完整的配置项列表如下\n\n\u003ctable\u003e\n\u003ctr\u003e\u003cth\u003e参数名\u003c/th\u003e\u003cth\u003e解释\u003c/th\u003e\u003cth\u003e默认值\u003c/th\u003e\u003c/tr\u003e\n\u003ctr\u003e\u003ctd\u003elibreofficePath\u003c/td\u003e\u003ctd\u003eLibreOffice安装目录\u003c/td\u003e\u003ctd\u003e(String) 无默认值，该项必填\u003c/td\u003e\u003c/tr\u003e\n\u003ctr\u003e\u003ctd\u003elibreofficePort\u003c/td\u003e\u003ctd\u003eLibreOffice监听端口\u003c/td\u003e\u003ctd\u003e(int) 2002\u003c/td\u003e\u003c/tr\u003e\n\u003ctr\u003e\u003ctd\u003etmpPath\u003c/td\u003e\u003ctd\u003e临时存储目录\u003c/td\u003e\u003ctd\u003e(String) \"./data/\"\u003c/td\u003e\u003c/tr\u003e\n\u003c/table\u003e\n\n### 3.4 执行转换\n\n#### 3.4.1 按照文件路径转换\n\n以doc转PDF为例\n\n````java\nWorkableConverter converter = new WorkableConverter();//实例化的同时，初始化配置项，配置项的校验通过Decorator装饰\n\nConvertPattern pattern = ConvertPatternManager.getInstance();\npattern.fileToFile(\"./data/test.doc\", \"./data/pdf/result1.pdf\"); //test.doc为待转换文件路径，result1.pdf为转换结果存储路径\npattern.setSrcFilePrefix(DefaultDocumentFormatRegistry.DOC);\npattern.setDestFilePrefix(DefaultDocumentFormatRegistry.PDF);\n\nconverter.setConverterType(CommonConverterManager.getInstance());//策略模式，后续实现了新的转换策略后，在此处更换，图片转换将考虑使用新的策略来完成\nboolean result = converter.convert(pattern.getParameter();\n````\n\n如果要用html转PDF，将上述代码的\n\n````java\npattern.setSrcFilePrefix(DefaultDocumentFormatRegistry.DOC);\npattern.setDestFilePrefix(DefaultDocumentFormatRegistry.PDF);\n````\n\n改为\n\n````java\npattern.setSrcFilePrefix(DefaultDocumentFormatRegistry.HTML);\npattern.setDestFilePrefix(DefaultDocumentFormatRegistry.PDF);\n````\n\n其他类型的同理\n\n#### 3.4.2 按照输入输出流转换\n\n以doc转pdf为例\n\n````java\n// you can also choice not use proxy\nWorkableConverter converter = new WorkableConverter();\nConvertPattern pattern = ConvertPatternManager.getInstance();\npattern.streamToStream(new FileInputStream(\"./data/test.doc\"), new FileOutputStream(\"./data/pdf/result1_2.pdf\"));\n// attention !!! convert by stream must set prefix.\npattern.setSrcFilePrefix(DefaultDocumentFormatRegistry.DOC);\npattern.setDestFilePrefix(DefaultDocumentFormatRegistry.PDF);\nconverter.setConverterType(CommonConverterManager.getInstance());\nboolean result = converter.convert(pattern.getParameter();\n````\n\n跟上例基本相同，唯一的变化是通过pattern.streamToStream()来设置输入输出流，转换源文件数据从输入流中读取，转换结果会直接写入输出流中，\n\n同时要切换转换格式，跟上例一样设置不同的prefix即可\n\n#### 3.4.3 按照文件Base64转换  \n\n仍以doc转pdf为例\n\n````java\nWorkableConverter converter = new WorkableConverter();\nConvertPattern pattern = ConvertPatternManager.getInstance();\npattern.base64ToBase64(Base64FileTool.FileToBase64(new File(\"./data/test.doc\")));\n// attention !!! convert by base64 must set prefix.\npattern.setSrcFilePrefix(DefaultDocumentFormatRegistry.DOC);\npattern.setDestFilePrefix(DefaultDocumentFormatRegistry.PDF);\nconverter.setConverterType(CommonConverterManager.getInstance());\nboolean result = converter.convert(pattern.getParameter();\nString destBase64 = pattern.getBase64Result();\n````\n\n输入base64执行转换，首先通过pattern.base64ToBase64()来设置转换源的base64值\n\n转换结果result仍然是一个boolean类型，通过pattern.getBase64Result来获取转换结果的base64值\n\n要切换转换格式，跟上例一样设置不同的prefix即可\n\n### 3.5 图片处理\n\n目前对于图片的处理，只支持将PDF转PNG图片(如果1份pdf文件有20页，那么将会转换为20张png图片)，该功能的实现基于PDFBox:2.0.12\n\n#### 3.5.1 按照文件路径处理\n\npattern.fileToFiles()第一个参数为待转换的pdf文件路径，第二个参数为转换后的图片存储路径\n\n````java\nWorkableConverter converter = new WorkableConverter();\nConvertPattern pattern = ConvertPatternManager.getInstance();\npattern.fileToFiles(\"./data/test5.pdf\", \"./data/\");\npattern.setSrcFilePrefix(DefaultDocumentFormatRegistry.PDF);\npattern.setDestFilePrefix(DefaultDocumentFormatRegistry.PNG);\nconverter.setConverterType(PdfBoxConverterManager.getInstance()); // pdf box converter manager only support pdf to png\nassertEquals(true, converter.convert(pattern.getParameter()));\nassertEquals(true, FileTool.isFileExists(\"./data/test5_0.png\"));\nassertEquals(true, FileTool.isFileExists(\"./data/test5_1.png\"));\nassertEquals(true, FileTool.isFileExists(\"./data/test5_2.png\"));\nassertEquals(true, FileTool.isFileExists(\"./data/test5_3.png\"));\n````\n\n#### 3.5.2 按照文件Base64处理\n\npattern.base64ToBase64()的参数为待转换pdf文件的base64值\n\n转换结束后，通过```List\u003cString\u003e resultBase64 = pattern.getBase64Results()```获取转换后的图片base64值的集合\n\n````java\nWorkableConverter converter = new WorkableConverter();\nConvertPattern pattern = ConvertPatternManager.getInstance();\npattern.base64ToBase64(Base64FileTool.FileToBase64(new File(\"./data/test5.pdf\")));\npattern.setSrcFilePrefix(DefaultDocumentFormatRegistry.PDF);\npattern.setDestFilePrefix(DefaultDocumentFormatRegistry.PNG);\nconverter.setConverterType(PdfBoxConverterManager.getInstance()); // pdf box converter manager only support pdf to png\nboolean result = converter.convert(pattern.getParameter());\nList\u003cString\u003e resultBase64 = pattern.getBase64Results();\nassertEquals(true, result);\nassertEquals(4, resultBase64.size());\n````\n\n### 3.6 添加水印\n\n水印的转换策略为WaterMarkConverter\n\n添加水印注意事项\n\n* 请确保输入源文件后缀为PDF，输出源文件后缀也为PDF\n\n* 水印参数需要new一个WaterMarkRequire来设置\n\n* setWaterMarkPage(int page)代表在哪一页上添加水印，如果为0，则表示所有页面\n\n* 水印本身为一个PDF文件，该文件只需要一页，其第一页的内容将被视为水印添加到源文件中\n\n    比如说，要添加透明度为0.3的文本作为水印的话，自己使用word等工具绘制透明度为0.3的字体（或者上包含透明度的png图片也可以）并另存为一个watermark.pdf文件\n    \n    然后使用waterMarkRequire.setWaterMarkPDFBase64(Base64FileTool.FileToBase64(new File(\"./data/watermark.pdf\")))\n    \n    或者waterMarkRequire.setWaterMarkPDFBytes(FileUtils.readFileToByteArray(new File(\"./data/watermark.pdf\")))将该文件的base64或者bytes值输入即可\n        \n具体使用可以分为三种方式\n\n### 3.6.1 按照文件路径添加水印\n\n````java\nWorkableConverter converter = new WorkableConverter();\nconverter.setConverterType(WaterMarkConverterManager.getInstance());//选择具体的水印转换策略\n\nConvertPattern pattern = ConvertPatternManager.getInstance();\nWaterMarkRequire waterMarkRequire = new WaterMarkRequire();//创建水印所需要的参数\n\n//指定在具体的哪一页添加水印，0的话则在所有页面添加水印\nwaterMarkRequire.setWaterMarkPage(0);//0 means all age\nwaterMarkRequire.setWaterMarkPDFBase64(Base64FileTool.FileToBase64(new File(\"./data/watermark.pdf\")));\n\npattern.setWaterMarkRequire(waterMarkRequire);\npattern.setSrcFilePrefix(DefaultDocumentFormatRegistry.PDF);\npattern.setDestFilePrefix(DefaultDocumentFormatRegistry.PDF);\npattern.fileToFile(\"./data/test5.pdf\", \"./data/test5_with_mark01.pdf\");//添加水印后的文件保存在./data/目录下，名为test5_with_mark01.pdf\n\nboolean result = converter.convert(pattern.getParameter());\nassertEquals(true, result);\n````\n\n### 3.6.2 按照流添加水印\n\n````java\nWorkableConverter converter = new WorkableConverter();\nconverter.setConverterType(WaterMarkConverterManager.getInstance());\n\nConvertPattern pattern = ConvertPatternManager.getInstance();\nWaterMarkRequire waterMarkRequire = new WaterMarkRequire();\n\nwaterMarkRequire.setWaterMarkPage(0);//0 means all age\nwaterMarkRequire.setWaterMarkPDFBytes(FileUtils.readFileToByteArray(new File(\"./data/watermark.pdf\")));\n\npattern.setWaterMarkRequire(waterMarkRequire);\npattern.setSrcFilePrefix(DefaultDocumentFormatRegistry.PDF);\npattern.setDestFilePrefix(DefaultDocumentFormatRegistry.PDF);\npattern.streamToStream(new FileInputStream(\"./data/test5.pdf\"), new FileOutputStream(\"./data/test5_with_mark02.pdf\"));\n\nboolean result = converter.convert(pattern.getParameter());\nassertEquals(true, result);\n````\n\n### 3.6.3 按照base64添加水印\n\n````java\nWorkableConverter converter = new WorkableConverter();\nconverter.setConverterType(WaterMarkConverterManager.getInstance());\n\nConvertPattern pattern = ConvertPatternManager.getInstance();\nWaterMarkRequire waterMarkRequire = new WaterMarkRequire();\n\nwaterMarkRequire.setWaterMarkPage(0);//0 means all age\nwaterMarkRequire.setWaterMarkPDFBase64(Base64FileTool.FileToBase64(new File(\"./data/watermark.pdf\")));\n\npattern.setWaterMarkRequire(waterMarkRequire);\npattern.setSrcFilePrefix(DefaultDocumentFormatRegistry.PDF);\npattern.setDestFilePrefix(DefaultDocumentFormatRegistry.PDF);\npattern.base64ToBase64(Base64FileTool.FileToBase64(new File(\"./data/test5.pdf\")));\n\nboolean result = converter.convert(pattern.getParameter());\nString base64Result = pattern.getBase64Result();\nBase64FileTool.saveBase64File(base64Result, \"./data/test5_with_mark03.pdf\");\nassertEquals(true, result);\n````\n\n### 3.7 itext7编辑pdf\n\nitext7编辑pdf策略为TextConverter\n\n编辑pdf注意事项\n\n* 请在配置文件添加 com.liumapp.workable-converter=fontsPath: 字体文件目录，resources文件下有所需字体文件\n\n* 请确保输入源文件后缀为PDF，输出源文件后缀也为PDF\n\n* 编辑pdf参数需要new一个TextRequire来设置\n\n#### 3.7.1 按照文件路径编辑pdf\n\n````java\n        WorkableConverter converter = new WorkableConverter();\n        converter.setConverterType(TextConverterManager.getInstance());\n\n        ConvertPattern pattern = ConvertPatternManager.getInstance();\n        TextRequire templateRequire = new TextRequire();\n\n        List\u003cPdfEditDTO\u003e pdfEditDTOList = new ArrayList\u003c\u003e();\n\n        PdfEditDTO pdfEditDTO = new PdfEditDTO();\n        pdfEditDTO.setFieldName(\"one\");\n        pdfEditDTO.setFontSize(18);\n        pdfEditDTO.setFontType(FontType.SIMYOU);\n        pdfEditDTO.setPositionX(0f);\n        pdfEditDTO.setPositionY(10f);\n        pdfEditDTO.setText(\"Hello World I am One Field\");\n        pdfEditDTO.setWidth(250);\n        pdfEditDTO.setHeitht(20);\n        pdfEditDTO.setPageNum(1);\n\n        pdfEditDTOList.add(pdfEditDTO);\n\n        PdfEditDTO pdfEditDTO2 = new PdfEditDTO();\n        pdfEditDTO2.setFieldName(\"two\");\n        pdfEditDTO2.setFontSize(18);\n        pdfEditDTO2.setFontType(FontType.STKAITI);\n        pdfEditDTO2.setPositionX(0f);\n        pdfEditDTO2.setPositionY(820f);\n        pdfEditDTO2.setText(\"Hello World I am Two Field\");\n        pdfEditDTO2.setWidth(250);\n        pdfEditDTO2.setHeitht(20);\n        pdfEditDTO2.setPageNum(2);\n\n        pdfEditDTOList.add(pdfEditDTO2);\n\n        templateRequire.setPdfEditDTOList(pdfEditDTOList);\n\n        pattern.setTextRequire(templateRequire);\n        pattern.setSrcFilePrefix(DefaultDocumentFormatRegistry.PDF);\n        pattern.setDestFilePrefix(DefaultDocumentFormatRegistry.PDF);\n        pattern.fileToFile(\"./data/txt.pdf\",\"./data/txt2.pdf\");\n\n        boolean result = converter.convert(pattern.getParameter());\n        assertEquals(true, result);\n````\n\n#### 3.7.2 按照base64编辑pdf\n\n```java\nWorkableConverter converter = new WorkableConverter();\n        converter.setConverterType(TextConverterManager.getInstance());\n\n        ConvertPattern pattern = ConvertPatternManager.getInstance();\n        TextRequire templateRequire = new TextRequire();\n\n        List\u003cPdfEditDTO\u003e pdfEditDTOList = new ArrayList\u003c\u003e();\n\n        PdfEditDTO pdfEditDTO = new PdfEditDTO();\n        pdfEditDTO.setFieldName(\"one\");\n        pdfEditDTO.setFontSize(18);\n        pdfEditDTO.setFontType(FontType.SIMYOU);\n        pdfEditDTO.setPositionX(0f);\n        pdfEditDTO.setPositionY(10f);\n        pdfEditDTO.setText(\"Hello World I am One Field\");\n        pdfEditDTO.setWidth(250);\n        pdfEditDTO.setHeitht(20);\n        pdfEditDTO.setPageNum(1);\n\n        pdfEditDTOList.add(pdfEditDTO);\n\n        PdfEditDTO pdfEditDTO2 = new PdfEditDTO();\n        pdfEditDTO2.setFieldName(\"two\");\n        pdfEditDTO2.setFontSize(18);\n        pdfEditDTO2.setFontType(FontType.STKAITI);\n        pdfEditDTO2.setPositionX(0f);\n        pdfEditDTO2.setPositionY(820f);\n        pdfEditDTO2.setText(\"Hello World I am Two Field\");\n        pdfEditDTO2.setWidth(250);\n        pdfEditDTO2.setHeitht(20);\n        pdfEditDTO2.setPageNum(2);\n\n        pdfEditDTOList.add(pdfEditDTO2);\n\n        templateRequire.setPdfEditDTOList(pdfEditDTOList);\n\n        pattern.setTextRequire(templateRequire);\n        pattern.setSrcFilePrefix(DefaultDocumentFormatRegistry.PDF);\n        pattern.setDestFilePrefix(DefaultDocumentFormatRegistry.PDF);\n        pattern.base64ToBase64(Base64FileTool.FileToBase64(new File(\"./data/txt.pdf\")));\n\n        boolean result = converter.convert(pattern.getParameter());\n        String base64Result = pattern.getBase64Result();\n        Base64FileTool.saveBase64File(base64Result,\"./data/txt2.pdf\");\n```\n\n\n### 3.8 使用Itext7 HTML转PDF文件\n\n增加ItextConverter策略;\n\n#### 3.8.1 按照base64方式\n\n```java\n\npublic class ItextConverterTest {\n    @Test\n    public void testItextConverter() throws ConvertFailedException, IOException {\n        WorkableConverter converter = new WorkableConverter();\n        converter.setConverterType(HtmlToPdfByItextConverterManager.getInstance());\n        ConvertPattern pattern = ConvertPatternManager.getInstance();\n        EditorRequire editorRequire = new EditorRequire();\n        editorRequire.setContent(\"\u003chtml\u003e\u003cdiv\u003e你好,word\u003c/div\u003e\u003c/html\u003e\");\n        pattern.setEditorRequire(editorRequire);\n        pattern.setSrcFilePrefix(DefaultDocumentFormatRegistry.HTML);\n        pattern.setDestFilePrefix(DefaultDocumentFormatRegistry.PDF);\n        String base64 = Base64.getEncoder().encodeToString(editorRequire.getContent().getBytes());\n        pattern.base64ToBase64(base64);\n        assertEquals(true,converter.convert(pattern.getParameter()));\n        String base64Result = pattern.getBase64Result();\n        Base64FileTool.saveBase64File(base64Result,\"./data/test2.pdf\");\n    }\n}\n```\n参数介绍:\n\n   EditorRequire: 在这个对象中的`content`为html内容;\n   \n   base64Result: 为转换结果的PDF文件内容的base64值;   \n\n## 4. 待办事项\n\n* 已经测试通过的有doc、docx、html 按照不同姿势转PDF，其他类型的并没有编写测试单元，后续考虑增加\n\n* 目前只支持yml配置，后续考虑添加其他类型的配置支持（xml、properties等）\n\n* 目前Markdown格式很流行，考虑实现markdown格式的字符串转PDF(markdown -\u003e html -\u003e pdf)\n\n## 5. 注意事项\n\n* 因为需要LibreOffice的支持，所以不建议在Docker等容器内运行(LibreOffice暂无Docker稳定发行版的镜像)\n\n* 转换乱码、转换耗时过长，请检查服务器是否安装有中文字体\n\n* 项目启动后，在执行第一次转换任务时，因为涉及到与LibreOffice建立连接等操作，所以会耗时较长，第二次任务及以后稳定在0.5秒以内（具体时间因机器配置会有所差异）\n\n## 6. 参考链接\n\n* https://www.libreoffice.org/download/download/?type=rpm-x86_64\u0026version=6.2.3\u0026lang=zh-CN\n\n* https://api.libreoffice.org/\n\n* https://github.com/sbraconnier/jodconverter/\n\n* https://memorynotfound.com/apache-pdfbox-add-watermark-pdf-document/\n\n","funding_links":[],"categories":[],"sub_categories":[],"project_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2Fliumapp%2Fworkable-converter","html_url":"https://awesome.ecosyste.ms/projects/github.com%2Fliumapp%2Fworkable-converter","lists_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2Fliumapp%2Fworkable-converter/lists"}