用java实现,office文件转成pdf文件

news/2024/11/30 13:31:41/

实现环境:要求可以在linux环境下运行,开源插件 , 跨平台

以下有五种方法:

 

 结论:

office不支持跨平台,

aspose收费,

基于pio+itext转换后会严重失真,

基于libreOffice不支持插入图形,否则会造成文本发生走样

而openOffice各种效果,效率……都是未测的。。。。

总结:目前仅考虑openOffice和libreOffice

openOffice实战

原理:

通过第三方工具openOffice,将word、excel、ppt、txt等文件转换为pdf文件

先安装openOffice软件(Windows或Linux有提供软件)

使用JODConverter的Java的OpenDocument 文件转换器API操作Office系列文件转换为PDF文件

优点:

转换效果比较好。是比较主流的做法

缺点:

服务器需要安装openOffice,比较负重。启动服务时效率不是很高

具体实现:

1.下载安装软件

1)Openoffice:Apache下的一个开放免费的文字处理软件

下载地址:Apache OpenOffice - 下载

2)JODConverter一个Java的OpenDocument 文件转换器,只用到它的jar包

下载地址:JODConverter - Browse /JODConverter at SourceForge.net

安装openoffice

1.安装linux的openoffice

1.Apache OpenOffice - 下载 去官网链接下载linux版本的openOffice 以4.1.2 版本为例。

2.将压缩包上传至服务器上,并进行解压安装。

1  tar -zxvf  对应的压缩包名字
2  cd 进入解压后的 /zh-cn/RPMS
3  yum localinstall *.rpm
4  cd desktop-integration
5  rpm -ivh 含redhat的

  默认会安装在/opt目录下会出现openoffice4。

  3.启动服务

1 /opt/openoffice4/program/soffice -headless -accept="socket,host=127.0.0.1,port=8100;urp;" -nofirststartwizard  临时启动
2 nohup /opt/openoffice4/program/soffice -headless -accept="socket,host=127.0.0.1,port=8100;urp;" -nofirststartwizard &  后台启动

  端口号根据自己项目实际来确定。

后台启动会一直占用内存,据各路大神说 大概100M,我自己没测过具体值不清楚。

  有的程序是需要预先启动openOffice 服务的,有的则在代码里自己启动服务。

  4.查看进程

netstat -lnp |grep 端口号

  大概显示成这样就算启动完了。

`tcp        0      0 127.0.0.1:8100              0.0.0.0:*                   LISTEN      14362``/soffice``.bin`

2.安装window的openoffice

    比linux的更简单,安装好后,只需要在C:\Program Files (x86)\OpenOffice 4\program执行下面的命令就可以了// soffice -headless -accept="socket,host=127.0.0.1,port=8100;urp;" -nofirststa

linux开机,重启openoffice服务(linux下openoffice启动和自动启动设置(centos)_resolute123的博客-CSDN博客_linux openoffice重启)

编辑vi /etc/rc.local

添加如下命令

soffice -headless -accept="socket,host=127.0.0.1,port=8100;urp;" -nofirststartwizard &

重启linux,命令reboot netstat -lnp |grep 8100 - - - 查看是否会出现以下信息,表示成功 tcp 0 0 127.0.0.1:8100 0.0.0.0:* LISTEN 8220/soffice.bin

2.Java实现

依赖

<?xml version="1.0" encoding="UTF-8"?>
<project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 https://maven.apache.org/xsd/maven-4.0.0.xsd"><modelVersion>4.0.0</modelVersion><parent><groupId>org.springframework.boot</groupId><artifactId>spring-boot-starter-parent</artifactId><version>2.5.4</version><relativePath/> <!-- lookup parent from repository --></parent><groupId>com.officetopdf</groupId><artifactId>officetopdf</artifactId><version>0.0.1-SNAPSHOT</version><name>officetopdf</name><packaging>war</packaging><description>Demo project for Spring Boot</description><properties><java.version>1.8</java.version></properties><dependencies><dependency><groupId>org.springframework.boot</groupId><artifactId>spring-boot-starter-web</artifactId></dependency>
​<dependency><groupId>org.springframework.boot</groupId><artifactId>spring-boot-starter-test</artifactId><scope>test</scope></dependency>
​<dependency><groupId>com.google.code.gson</groupId><artifactId>gson</artifactId><version>2.8.5</version></dependency><dependency><groupId>com.alibaba</groupId><artifactId>fastjson</artifactId><version>1.2.60</version></dependency>
​<!--        office转pdf需要的依赖--><dependency><groupId>com.itextpdf</groupId><artifactId>itextpdf</artifactId><version>5.5.0</version></dependency>
​<dependency><groupId>com.itextpdf</groupId><artifactId>itext-pdfa</artifactId><version>5.5.0</version></dependency>
​<dependency><groupId>com.itextpdf</groupId><artifactId>itext-asian</artifactId><version>5.2.0</version></dependency>
​<dependency><groupId>com.itextpdf.tool</groupId><artifactId>xmlworker</artifactId><version>5.5.0</version></dependency>
​
​<dependency><groupId>org.jodconverter</groupId><artifactId>jodconverter-local</artifactId><version>4.1.0</version></dependency>
​<dependency><groupId>org.xhtmlrenderer</groupId><artifactId>flying-saucer-pdf</artifactId><version>9.0.7</version></dependency>
​<dependency><groupId>com.artofsolving</groupId><artifactId>jodconverter</artifactId><version>2.2.1</version></dependency>
​<dependency><groupId>com.github.livesense</groupId><artifactId>jodconverter-core</artifactId><version>1.0.5</version></dependency>
​<dependency><groupId>org.jodconverter</groupId><artifactId>jodconverter-core</artifactId><version>4.1.0</version></dependency><dependency><groupId>org.jodconverter</groupId><artifactId>jodconverter-local</artifactId><version>4.1.0</version></dependency><dependency><groupId>org.jodconverter</groupId><artifactId>jodconverter-spring-boot-starter</artifactId><version>4.1.0</version></dependency><dependency><groupId>org.libreoffice</groupId><artifactId>juh</artifactId><version>5.4.2</version></dependency><dependency><groupId>org.libreoffice</groupId><artifactId>jurt</artifactId><version>5.4.2</version></dependency><dependency><groupId>org.libreoffice</groupId><artifactId>ridl</artifactId><version>5.4.2</version></dependency><dependency><groupId>org.libreoffice</groupId><artifactId>unoil</artifactId><version>5.4.2</version></dependency>
​<dependency><groupId>org.springframework</groupId><artifactId>spring-webmvc</artifactId><version>5.3.9</version></dependency>
​<dependency><groupId>org.libreoffice</groupId><artifactId>officebean</artifactId><version>6.4.2</version></dependency>
​<!--使用HttpClient远程发送请求  --><dependency><groupId>org.apache.httpcomponents</groupId><artifactId>httpclient</artifactId></dependency>
​<dependency><groupId>commons-io</groupId><artifactId>commons-io</artifactId><version>2.11.0</version></dependency>
​<dependency><groupId>javax.servlet</groupId><artifactId>jstl</artifactId></dependency><dependency><groupId>org.apache.tomcat.embed</groupId><artifactId>tomcat-embed-jasper</artifactId><scope>provided</scope></dependency><dependency><groupId>org.springframework.boot</groupId><artifactId>spring-boot-starter-tomcat</artifactId><scope>provided</scope></dependency><dependency><groupId>javax.servlet</groupId><artifactId>javax.servlet-api</artifactId><scope>provided</scope></dependency>
​<dependency><groupId>org.apache.tomcat.embed</groupId><artifactId>tomcat-embed-jasper</artifactId><scope>provided</scope></dependency>
​
​
​</dependencies>
​<build><plugins><plugin><groupId>org.springframework.boot</groupId><artifactId>spring-boot-maven-plugin</artifactId></plugin></plugins></build>
​
</project>
​

转换代码

package com.officetopdf.officetopdf.transform;
​
import java.io.*;
import java.text.DateFormat;
import java.text.SimpleDateFormat;
import java.util.Date;
import java.util.HashMap;
import java.util.Map;
​
import com.google.gson.Gson;
import com.officetopdf.officetopdf.utils.HttpClientUtils;
import com.officetopdf.officetopdf.utils.ResultUtils;
​
import com.artofsolving.jodconverter.DocumentConverter;
import com.artofsolving.jodconverter.openoffice.connection.OpenOfficeConnection;
import com.artofsolving.jodconverter.openoffice.connection.SocketOpenOfficeConnection;
import com.artofsolving.jodconverter.openoffice.converter.StreamOpenOfficeDocumentConverter;
import org.springframework.web.bind.annotation.RequestBody;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.ResponseBody;
import org.springframework.web.bind.annotation.RestController;
​
​
/*** office文件转pdf文件的方法*/
@RestController
@ResponseBody
@RequestMapping("/start")
public class PDFDemo {
​
​@RequestMapping("/topdf")public static ResultUtils officeToPDF(@RequestBody Map<String, Object> map) {/*** 从map里面接收参数*/String sourceFile = (String) map.get("sourceFile");//源文件,officeString targetFile = (String) map.get("targetFile");//pdf文件String successCallback = (String) map.get("successCallback");//转换成功,回调的接口String failCallback = (String) map.get("failCallback");//转换失败,回调的接口String id = (String) map.get("id");String token = (String) map.get("token");
​
​try {//对sourceFile,targetFile进行处理File inputFile = new File(sourceFile);if (!inputFile.exists()) { // 找不到源文件, 则返回falsereturn ResultUtils.error("找不到源文件");}
​
​File outputFile = new File(targetFile);if (!outputFile.getParentFile().exists()) {//如果目标路径不存在,则创建outputFile.getParentFile().mkdirs();}
​
​if (outputFile.exists()) {//如果目标文件存在,则删除outputFile.delete();}
​
​
​
​/*** 开启线程,进行连接,转换,断开并且返回相应的数据*/new Thread(new Runnable() {@Overridepublic void run() {DateFormat df = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss");OpenOfficeConnection connection = new SocketOpenOfficeConnection();//如果在此处报错,可能需要启动openoffice服务// windows启动命令//cd C:\Program Files (x86)\OpenOffice 4\program//执行命令: soffice -headless -accept="socket,host=127.0.0.1,port=8100;urp;" -nofirststa// linux启动命令// /opt/openoffice4/program/soffice -headless -accept="socket,host=127.0.0.1,port=8100;urp;" -nofirststartwizard  临时启动// nohup /opt/openoffice4/program/soffice -headless -accept="socket,host=127.0.0.1,port=8100;urp;" -nofirststartwizard &  后台启动try {connection.connect();
​//用于测试openOffice连接时间Date time1 = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss").parse(df.format(new Date()));System.out.println("连接时间:" + time1);DocumentConverter converter = new StreamOpenOfficeDocumentConverter(connection);
​converter.convert(inputFile, outputFile);
​//测试word转PDF的转换时间Date time2 = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss").parse(df.format(new Date()));System.out.println("转换时间:" + time2);
​long time = time2.getTime() - time1.getTime();System.out.println("totalTime:" + time + "ms");connection.disconnect();
​/***  操作结束之后,返回数据*///转换成功返回的数据PostEntity postEntity=new PostEntity();postEntity.setId(id);postEntity.setSuccessCallback(successCallback);postEntity.setSourceFile(sourceFile);postEntity.setTargetFile(targetFile);postEntity.setToken(token);
​/* Map<String, String> params1 = new HashMap<>();params1.put("id", id);params1.put("sourceFile", sourceFile);params1.put("targetFile", targetFile);params1.put("token", token);params1.put("successCallback", successCallback);*/HttpClientUtils.doPost(successCallback, new Gson().toJson(postEntity), token);
​} catch (Exception e) {e.printStackTrace();System.err.println("openOffice连接失败!请检查IP,端口");//转换失败返回的数据Map<String, String> params2 = new HashMap<>();params2.put("id", id);params2.put("sourceFile", sourceFile);params2.put("targetFile", targetFile);params2.put("token", token);params2.put("failCallback", failCallback);// HttpClientUtils.doPost(failCallback, params2, token);}}}).start();
​
​return ResultUtils.success("success");
​} catch (Exception e) {e.printStackTrace();}return ResultUtils.error("转换失败");}
​
​
​
​
​
//    @RequestMapping("/topdf2")
//    public static ResultUtils officeToPDF2(@RequestBody Map<String, Object> map) {
//        System.out.println(map);
//        return ResultUtils.success("success");
//    }
​
}
​

转换问题--不兼容docx和pptx

我这里使用的jodconverter是2.2.1的,不兼容docx和pptx,而jodconverter-2.2.2是兼容的。想要使用2.2.1版本,需要修改一下 BasicDocumentFormatRegistry 类中的 getFormatByFileExtension方法:

新建包 com.artofsolving.jodconverter 新建类BasicDocumentFormatRegistry,复制下面代码

​
import java.util.ArrayList;
import java.util.Iterator;
import java.util.List;
​
public class BasicDocumentFormatRegistry implements DocumentFormatRegistry {private List documentFormats = new ArrayList();
​public BasicDocumentFormatRegistry() {}
​public void addDocumentFormat(DocumentFormat documentFormat) {this.documentFormats.add(documentFormat);}
​protected List getDocumentFormats() {return this.documentFormats;}
​public DocumentFormat getFormatByFileExtension(String extension) {if (extension == null) {return null;} else {if (extension.indexOf("doc") >= 0) {extension = "doc";}if (extension.indexOf("ppt") >= 0) {extension = "ppt";}if (extension.indexOf("xls") >= 0) {extension = "xls";}String lowerExtension = extension.toLowerCase();Iterator it = this.documentFormats.iterator();
​DocumentFormat format;do {if (!it.hasNext()) {return null;}
​format = (DocumentFormat)it.next();} while(!format.getFileExtension().equals(lowerExtension));
​return format;}}
​public DocumentFormat getFormatByMimeType(String mimeType) {Iterator it = this.documentFormats.iterator();
​DocumentFormat format;do {if (!it.hasNext()) {return null;}
​format = (DocumentFormat)it.next();} while(!format.getMimeType().equals(mimeType));
​return format;}
}
​

 

运行

此代码在linux和window都可以运行

1.linux,将该项目,clear -> package后,将jar上传到linux,然后再使用java -jar xxx.jar,然后在浏览器访问项目的转换路径,就可以实现转换了

2.window,可以在浏览器访问该转换路径。但建议使用postman进行接口测试访问

postman进行接口测试访问

 

巩固Linux常用命令

cd / - - - 返回根目录

cd .. - - - 返回上一级

cd 某文件夹 - - - 进入某文件夹

rm -rf - - - 删除某文件夹或文件

rz - - - 从window系统上传文件到linux

sz - - - 从linux系统上传文件到window

3、openoffice乱码问题解决方法

步骤1 cd /usr/share/fonts 在这个目录下新建一个chinese文件夹 mkdir chinese

步骤2 把自己电脑的字体打包上传到这个文件夹

步骤3 执行下面几条命令 mkfontscale mkfontdir fc-cache -fv

步骤4 ps -ef|grep openoffice 查看当前office进程,杀死进程,kill -9 进程id

步骤5 重新启动 office nohup /opt/openoffice4/program/soffice -headless - accept="socket,host=127.0.0.1,port=8100;urp;" -nofirststartwizard &


http://www.ppmy.cn/news/706251.html

相关文章

openOffice + jobConverter 实现Word转PDF。完美解决方案

一.资源准备 openOffice 下载地址&#xff1a;http://www.openoffice.org/download/index.html jobConverter 相关jar包下载地址&#xff1a;https://download.csdn.net/download/mufeng633/10741295 二. 安装openOffice window安装&#xff0c;直接傻瓜式安装即可。 Linux安…

让Java与OpenOffice调情(转)

你在困扰于word文档&#xff0c;Excel文档&#xff0c;各种各样的Office文档处理么&#xff1f; 你在羡慕DotNet程序员可以自如操作MS Office底层接口么&#xff1f; 你在四处翻腾纯java的PDF文件转换方案么&#xff1f; 欢迎来到OpenOffice.Org的世界&#xff0c;在这儿&…

Java利用OpenOffice将word等office文档转换成PDF

OpenOffice.org 是一套跨平台的办公室软件套件&#xff0c;能在 Windows、Linux、MacOS X (X11)、和 Solaris 等操作系统上执行。它与各个主要的办公室软件套件兼容。OpenOffice.org 是自由软件&#xff0c;任何人都可以免费下载、使用、及推广它。 OpenOffice org 的 API 以 U…

JS打印 PDF

JS打印 PDF 利用iframe打印pdf ( 但是这种方法会造成跨域不太好解决 ) goPrint(data) {let iframe document.createElement("IFRAME");iframe.style.visibility "hidden";iframe.src data; //data 是后台返给的pdf线上地址document.body.appendChild(i…

onlyoffice 在线编辑

文章目录 一、拉取镜像,启动二、配置onlyoffice三、编写保存接口四、添加中文字体 一、拉取镜像,启动 要使用onlyoffice的在线编辑,需要从docker拉取镜像 onlyoffice/documentserver docker pull onlyoffice/documentserver启动onlyoffice docker run --name onlyoffice -i …

JodConverter 4.1.0 + OpenOffice 4.1.4 文档转换(Spring boot 1.5.8)

注&#xff1a;本实例最终在 CentOS 7 上运行&#xff0c;Spring boot 最好是1.5.7 以上&#xff01; 1、Maven 配置&#xff0c;最基本 JAR 包&#xff0c;当然还有可能需要其他包&#xff0c;根据提示或项目情况导入&#xff1a; <dependency><groupId>org.jodc…

onlyoffice-api

onlyoffice-api 下载 官网 配置文档 安装文档 demo下载

java引入openoffice,实现在线预览功能

注&#xff1a;代码相关openoffice jar包下载地址&#xff1a;jar包地址 注:欢迎关注vuespringbootshiro开发的项目 官网地址&#xff1a;进入官网 package com.sk.controller.onlineread;import net.sf.json.JSONObject; import org.apache.commons.io.FilenameUtils; impor…