Java使用openOffice对于word的转换及遇到的问题解决

一:需求详情:

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

公司需要存储合同文件,用户上传word文档的合同,通过openOffice去把word转换为pdf、再把pdf转换为图片格式,并分别存储。因为openOffice的转换需要耗费挺大的内存,所以设计为task任务,凌晨自动转换。

记录本次需求完成的时候遇到的问题。

openoffice既有windows版本也有linux版。不用担心生产环境是linux系统。

关于linux系统安装openoffice软件请参照:点击这里

二:过程

1:本地环境编码(windows)

第一步:因为是本地环境的编码而且是Windows环境,所以从安装openOffice开始,到启动服务并没有遇到难题。

第二步:转换所需要的工具包;

 <dependency>
 <groupId>commons-cli</groupId>
 <artifactId>commons-cli</artifactId>
 <version>1.2</version>
 </dependency>

 <dependency>
 <groupId>commons-io</groupId>
 <artifactId>commons-io</artifactId>
 <version>1.4</version>
 </dependency>

 <dependency>
 <groupId>org.openoffice</groupId>
 <artifactId>juh</artifactId>
 <version>3.0.1</version>
 </dependency>

 <dependency>
 <groupId>org.openoffice</groupId>
 <artifactId>jurt</artifactId>
 <version>3.0.1</version>
 </dependency>

 <dependency>
 <groupId>org.openoffice</groupId>
 <artifactId>ridl</artifactId>
 <version>3.0.1</version>
 </dependency>

 <dependency>
 <groupId>org.slf4j</groupId>
 <artifactId>slf4j-api</artifactId>
 </dependency>

 <dependency>
 <groupId>org.slf4j</groupId>
 <artifactId>slf4j-jdk14</artifactId>
 <scope>test</scope>
 </dependency>

 <dependency>
 <groupId>org.openoffice</groupId>
 <artifactId>unoil</artifactId>
 <version>3.0.1</version>
 </dependency>

 <dependency>
 <groupId>com.thoughtworks.xstream</groupId>
 <artifactId>xstream</artifactId>
 <version>1.3.1</version>
 </dependency>

 <dependency>
 <groupId>org.apache.pdfbox</groupId>
 <artifactId>fontbox</artifactId>
 <version>2.0.8</version>
 </dependency>

 <dependency>
 <groupId>org.apache.pdfbox</groupId>
 <artifactId>pdfbox</artifactId>
 <version>2.0.8</version>
 </dependency>

问题1:在这里遇到了第一个问题,就是在maven的中央仓库找不到关键的依赖jar包的问题。

jodconverter-cli   这个jar包中央仓库找不到jar包依赖,jodconverter 版本才到2.2.1(这个版本之前的不能支持docx格式转换,2.2.2及以后才开始支持。)

然后和大牛商量,加入到公司内网自己的maven仓库。

第三步:工具类

 /**
 * @author GH
 * 输入文件
 * 输出文件
 */
 public class WordToPdf {//word转pdf
 public static void docToPdf(File inputFile, File outputFile){
 OpenOfficeConnection connection = new SocketOpenOfficeConnection(8100);
 try{
 connection.connect();
 DocumentConverter converter = new OpenOfficeDocumentConverter(connection);
 converter.convert(inputFile, outputFile);
 }catch(ConnectException cex){
 cex.printStackTrace();
 }finally{
 if(connection!=null){
 connection.disconnect();
 connection = null;
 }
 }
 }
 }
 /**
 * @author GH
 * 参数1:要装换的pdf位置
 * 参数2:转换后的图片存放位置
 * 参数3:中间要拼接的名字
 * return:转换后的img名字集合
 */
 public class PdfToImage {//pdf转img
 public static List<String> pdfToImagePath(String srcFile,String contractFromSrc,String name){
 List<String> list = new ArrayList<>();
 String imagePath;
 File file = new File(srcFile);
 try {
 File f = new File(contractFromSrc);
 if(!f.exists()){
 f.mkdir();
 }
 PDDocument doc = PDDocument.load(file);
 PDFRenderer renderer = new PDFRenderer(doc);
 int pageCount = doc.getNumberOfPages();
 for(int i=0; i<pageCount; i++){
 // 方式1,第二个参数是设置缩放比(即像素)
 // BufferedImage image = renderer.renderImageWithDPI(i, 296);
 // 方式2,第二个参数是设置缩放比(即像素)
 BufferedImage image = renderer.renderImage(i, 2f); //第二个参数越大生成图片分辨率越高,转换时间也就越长
 imagePath = contractFromSrc+name+"-"+i +".jpg";
 ImageIO.write(image, "PNG", new File(imagePath));
 list.add(name+"-"+i +".jpg");
 }
 doc.close();
 } catch (IOException e) {
 e.printStackTrace();
 }
 return list;
 }
 }

第四步:编码

首先从数据库读取没有转换过的集合,循环下载oss对象存储文件到指定临时文件夹。

通过工具类转换下载的word为pdf,录入数据pdf记录,上传oss对象pdf图片。

通过工具类转换得到的pdf图片,录入数据路图片记录,上传转换得到的img图片。

try catch捕捉异常,有异常就回滚数据库,删除oss对象上传的文件。

修改word的转换状态为已转换。

问题2:因为到最后测试环境和生产环境都是Linux系统的,因为涉及到文件的操作,但是Linux和Windows的文件路径是不一样的,例如:Windows文件路径为(C:\tmp\test.txt)Linux则为(/tmp/test.txt)

因此 采用这种方式

   public final static String Convert_Tmp_Url="C:"+File.separator+"temp"+File.separator+"contractToImg"+File.separator;//进行word——img转换的时候的暂时存放路径 window
 public final static String Convert_Tmp_Url2=File.separator+"tmp"+File.separator+"contractToImg"+File.separator;//进行word——img转换的时候的暂时存放路径 linux

File.separator 与系统有关的默认名称分隔符,为了方便,它被表示为一个字符串 在Linux此字段的值为 '/' Windows为'\'

第五步:本地测试,没有问题。

2:测试环境测试(windows)

问题3:在Linux环境下word转换word中文出现乱码 空白,导致的原因是Linux缺少中文字体编码。

解决方法:

步骤1:创建路径。

在centos的/usr/java/jdk1.8.0_91/jre/lib/fonts下新建路径:fallback。

步骤2:上传字体。

将字体:simhei.ttf 黑体、simsun.ttc 宋体(windows下通过everything找下)上传至/usr/java/jdk1.8.0_91/jre/lib/fonts/fallback路径下。

步骤3:查看系统字体文件路径。

查看方案:

[root@80ec6 fallback]# cat /etc/fonts/fonts.conf
<!-- Font directory list -->
<dir>/usr/share/fonts</dir>
<dir>/usr/share/X11/fonts/Type1</dir> <dir>/usr/share/X11/fonts/TTF</dir> <dir>/usr/local/share/fonts</dir>
<dir>~/.fonts</dir>

步骤4:字体拷贝。

将 /usr/java/jdk1.8.0_91/jre/lib/fonts的全部内容,拷贝到步骤3查看的路径下, 我的字体路径为:/usr/share/fonts。

步骤5:更新缓存

执行命令:fc-cache

步骤6:kill掉openoffice进程。

  [root@80ec6 fonts]# ps -ef | grep openoffice

  root 3045 3031 0 06:19 pts/1 00:00:03 /opt/openoffice4/program/soffice.bin -headless -accept=socket,host=127.0.0.1,port=8100;urp; -nofirststartwizard

执行kill:kill -9 3045

步骤7:重启后台运行openoffice。

 [root@a3cf78780ec6 openoffice4]# soffice -headless -accept="socket,host=127.0.0.1,port=8100;urp;" -nofirststartwizard &

3:测试环境和生产环境内核不一样,安装的安装包不一样。

测试环境的安装的是deb文件,使用 dpkg命令安装所有的deb文件,启动服务就能使用。

生产环境的是dpkg命令找不到。改换安装prm文件,执行安装之后,竟然启动不了,查找原因之后尽然是没有安装完,RPMS目录下有desktop-integration文件夹,进入到desktop-integration目录,里面有四个rpm  文件,选择相应的安装即可,这里我选择的是redhat版本。

执行 rpm -ivh openoffice4.1.5-redhat-menus-4.1.5-9789.noarch.rpm

总结

以上就是这篇文章的全部内容了,希望本文的内容对大家的学习或者工作具有一定的参考学习价值,如果有疑问大家可以留言交流,谢谢大家对我们的支持。

(0)

相关推荐

  • PHP调用OpenOffice实现word转PDF的方法

    最近一直在研究PHP word文档转PDF,也在网上搜索了很多类似的资料,大多数都是通过OpenOffice进行转换的. 核心的代码如下: function MakePropertyValue($name,$value,$osm){ $oStruct = $osm->Bridge_GetStruct("com.sun.star.beans.PropertyValue"); $oStruct->Name = $name; $oStruct->Value = $value

  • Java利用openoffice将doc、docx转为pdf实例代码

    本文研究的主要是Java编程利用openoffice将doc.docx转为pdf的实现代码,具体如下. 1. 需要用的软件 OpenOffice , JodConverter 2.启动OpenOffice的服务 我到网上查如何利用OpenOffice进行转码的时候,都是需要先用cmd启动一个soffice服务,启动的命令是:soffice -headless -accept="socket,host=127.0.0.1,port=8100;urp;". 但是实际上,对于我的项目,进行转

  • 解决linux下openoffice word文件转PDF中文乱码的问题

    网上很多介绍是由于jdk中的没有字体导致乱码,而我遇到的是转换过程并未报错,但转换后的PDF中是乱码,尝试在jre/lib/fonts/中增加字体,还是不能解决问题,因此可以判断非jre字体问题,是linux系统字体问题. 用vim /etc/fonts/fonts.conf,可以看到系统字体文件在/usr/share/fonts,将windows系统字体文件连接到此目录下 ln -s /usr/local/fonts fonts 然后更新缓存:fc-cache 重启openoffice: /o

  • java调用openoffice将office系列文档转换为PDF的示例方法

    前导: 发过程中经常会使用java将office系列文档转换为PDF, 一般都使用微软提供的openoffice+jodconverter 实现转换文档. openoffice既有windows版本也有linux版.不用担心生产环境是linux系统. 1.openoffice依赖jar,以maven为例: <dependency> <groupId>com.artofsolving</groupId> <artifactId>jodconverter<

  • 利用openoffice+jodconverter-code-3.0-bate4实现ppt转图片

    本文实例为大家分享了openoffice+jodconverter-code-3.0-bate4实现ppt转图片的具体代码,供大家参考,具体内容如下 安装openoffice4  (用于把文档(ppt)转成pdf)根据系统的位数安装 使用jodconverter-core3.0-beta-4(要上传maven本地仓库) 安装ImageMagick:yum install ImageMagick(用于pdf转图片) 安装pdftotext  用于提取文字大纲  yum install popple

  • Java使用openOffice对于word的转换及遇到的问题解决

    一:需求详情: OpenOffice.org 是一套跨平台的办公室软件套件,能在 Windows.Linux.MacOS X (X11).和 Solaris 等操作系统上执行.它与各个主要的办公室软件套件兼容.OpenOffice.org 是自由软件,任何人都可以免费下载.使用.及推广它. 公司需要存储合同文件,用户上传word文档的合同,通过openOffice去把word转换为pdf.再把pdf转换为图片格式,并分别存储.因为openOffice的转换需要耗费挺大的内存,所以设计为task任

  • Java 使用openoffice进行word转换为pdf的方法步骤

    一.下载openoffice第三方工具 建议下载4.1.6版本 http://www.openoffice.org/download/index.html 二.开启openoffice服务 找到openoffice安装目录下OpenOffice 4\program>soffice运行cmd,运行命令soffice -headless -accept="socket,host=127.0.0.1,port=8100;urp;" -nofirststartwizard 三.Java代

  • Java实现PDF转Word的示例代码(无水印无页数限制)

    目录 一.前言 二.jar破解 1.项目远程仓库配置 2.pom文件引入相关依赖 3.破解代码 三.pdf转word 一.前言 学习概述:简单的介绍一下本篇文章要讲解的Java知识点 学习目标:读者读完这篇文章之后,你希望他掌握你讲解的哪些重要的知识点 二.jar破解 1.项目远程仓库配置 aspose-pdf 这个需要配置单独的仓库地址才能下载,不会配置的可以去官网直接下载jar引入项目代码中. <repositories> <repository> <id>Aspo

  • Java实现HTML转为Word的示例代码

    本文以Java代码为例介绍如何实现将HTML文件转为Word文档(.docx..doc).在实际开发场景中可参考此方法来转换.下面详细方法及步骤. 在编辑代码前,请先在程序中导入Spire.Doc.jar,导入方法如下: 方法1 将Free Spire.Doc for Java包下载到本地,解压,找到lib文件夹下的Spire.Doc.jar文件.然后在IDEA中打开“Project Structure”界面,然后执行如图步骤来手动导入本地路径下的jar文件: 方法2 通过Maven仓库下载导入

  • Java实现PDF转为Word文档的示例代码

    目录 代码编译环境 将 PDF 转换为固定布局的 Doc/Docx 文档 完整代码 将 PDF 转换为流动形态的 Doc/Docx 文档 完整代码 效果图 众所周知,PDF文档除了具有较强稳定性和兼容性外, 还具有较强的安全性,在工作中可以有效避免别人无意中对文档内容进行修改.但与此同时,也妨碍了对文档的正常的修改.这时我们可以将PDF转为Word文档进行修改或再编辑.使用软件将 PDF 文档转换为 Word 文档十分简单,然而要在转换时保持布局甚至字体格式却并不容易.本文将分为以下两部分介绍如

  • 用Java将字符串的首字母转换大小写

    话不多说,直接上代码 //首字母转小写 public static String toLowerCaseFirstOne(String s){ if(Character.isLowerCase(s.charAt(0))) return s; else return (new StringBuilder()).append(Character.toLowerCase(s.charAt(0))).append(s.substring(1)).toString(); } //首字母转大写 public

  • java的Jackson框架实现轻易转换JSON

    Jackson可以轻松的将Java对象转换成json对象和xml文档,同样也可以将json.xml转换成Java对象. 相比json-lib框架,Jackson所依赖的jar包较少,简单易用并且性能也要相对高些.而且Jackson社区相对比较活跃,更新速度也比较快. 一.准备工作 1. 下载依赖库jar包 Jackson的jar all下载地址:http://jackson.codehaus.org/1.7.6/jackson-all-1.7.6.jar 然后在工程中导入这个jar包即可开始工作

  • Java 图片与byte数组互相转换实例

    实例如下: //图片到byte数组 public byte[] image2byte(String path){ byte[] data = null; FileImageInputStream input = null; try { input = new FileImageInputStream(new File(path)); ByteArrayOutputStream output = new ByteArrayOutputStream(); byte[] buf = new byte[

随机推荐