基于libreoffice实现的文档转换项目,无框架依赖,即插即用html
项目源代码:github/workable-converterjava
CentOS请直接参考这篇文章:CentOS7安装LibreOffice6.2.3windows
windows跟Mac一样能够在上述文章中拿到下载连接api
安装完成后,请记住您的LibreOffice的Home目录,后面须要用到服务器
默认目录:markdown
<dependency> <groupId>com.liumapp.workable.converter</groupId> <artifactId>workable-converter</artifactId> <version>v1.2.0</version> </dependency>
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的安装目录
完整的配置项列表以下
参数名 | 解释 | 默认值 |
---|---|---|
libreofficePath | LibreOffice安装目录 | (String) 无默认值,该项必填 |
libreofficePort | LibreOffice监听端口 | (int) 2002 |
tmpPath | 临时存储目录 | (String) "./data/" |
以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文件,该文件只须要一页,其第一页的内容将被视为水印添加到源文件中
好比说,要添加透明度为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);