word转PDF,PDF转Image,使用oppenOffice注意事项等

最近在电子合同等项目中需要把word或者pdf转换成image,用到了openOffice把word转换pdf,以及把pdf转换成图片

感谢小伙伴张国清花费了三天时间来实现了此功能。下面我将把具体的步骤和注意事项说明。防止重复造轮子,最后我会把我的demo工程,以及对应的jar等发送到百度云。提供各位下载

一、首先,列出maven依赖以及jar包

  <!--PDF转图片-->
        <dependency>
            <groupId>org.icepdf.os</groupId>
            <artifactId>icepdf-core</artifactId>
            <version>6.2.2</version>
            <exclusions>
                <exclusion>
                    <groupId>javax.media</groupId>
                    <artifactId>jai_core</artifactId>
                </exclusion>
            </exclusions>
        </dependency>
        <dependency>
            <groupId>org.icepdf.os</groupId>
            <artifactId>icepdf-viewer</artifactId>
            <version>6.2.2</version>
        </dependency>
        <!--word转pdf-->
        <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.openoffice</groupId>
            <artifactId>juh</artifactId>
            <version>3.0.1</version>
        </dependency>
        <dependency>
            <groupId>org.openoffice</groupId>
            <artifactId>unoil</artifactId>
            <version>3.0.1</version>
        </dependency>
        <!--需要手动添加到本地仓库 word 转 pdf-->
        <dependency>
            <groupId>org.artofsolving.jodconverter</groupId>
            <artifactId>jodconverter-core</artifactId>
            <version>3.0-beta-4</version>
        </dependency>

  这里注意:你还一个需要把一个jar的文件夹(文章最下边有相应的百度云下载地址)你找到自己的maven仓库把对应的jar手动放入到 【repository/org/】目录下,在idea右边导入后会有有红色波浪线警告。整个可忽略,不影响使用

  下图是对应怎么找到自己的maven repository路径

  

 二、这里贴出详细的代码和配置,注意如果有的地方不正确或者不理解,欢迎评论或者在文章末尾下载我的demo工程来实际运行。以进一步详细熟悉

   word转换pdf工具类

import org.apache.commons.lang3.StringUtils;
import org.artofsolving.jodconverter.OfficeDocumentConverter;
import org.artofsolving.jodconverter.office.DefaultOfficeManagerConfiguration;
import org.artofsolving.jodconverter.office.OfficeManager;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import org.springframework.beans.factory.annotation.Value;
import org.springframework.stereotype.Component;

import javax.annotation.PostConstruct;
import java.io.File;
import java.util.List;
import java.util.concurrent.locks.Lock;
import java.util.concurrent.locks.ReentrantLock;
import java.util.regex.Pattern;

/**
 * FileName: OfficeToPdfUtil
 * author:   zhangguoqing
 * Date:     2018/9/19 9:18
 * 说明:  word文件转换成pdf文件(必须安装Openoffice)
 */
@Component
public class OfficeToPdfUtil {

    static OfficeManager officeManager;

    private static ReentrantLock OfficeLock = new ReentrantLock();

    @PostConstruct
    public void init() {
        DefaultOfficeManagerConfiguration config = new DefaultOfficeManagerConfiguration();
        // 设置OpenOffice.org 3的安装目录
        config.setOfficeHome(getOfficeHome());
        // 启动OpenOffice的服务
        OfficeManager getOfficeManager = config.buildOfficeManager();
        if (getOfficeManager == null) {
            getOfficeManager.start();
        }
        officeManager = getOfficeManager;
    }

    private static Logger logger = LoggerFactory.getLogger(OfficeToPdfUtil.class);

    /**
     * 锁
     */
    private static Lock lock = new ReentrantLock();

    /**
     * windows下openoffice安装地址
     */
    private static String windowsOpenOfficeUrl;
    /**
     * linux下openoffice安装地址
     */
    private static String linuxOpenOfficeUrl;
    /**
     * mac下opneoffice安装地址
     */
    private static String macOpenofficeUrl = "/Applications/OpenOffice.org.app/Contents/";

    /**
     * 使Office2003-2007全部格式的文档(.doc|.docx|.xls|.xlsx|.ppt|.pptx) 转化为pdf文件<br>
     *
     * @param inputFilePath 源文件路径,如:"e:/test.docx"
     * @return 转换后的图片地址
     */
    public static String officeToPdf(String inputFilePath) throws Exception {
        try {
            if (officeManager == null) {
                //如果openOffice中途关闭了 再次启动 防止报错
                officeManager = getOfficeManager();
            }
            if (StringUtils.isEmpty(inputFilePath)) {
                logger.info("输入文件地址为空,转换终止!");
                return null;
            }
            File inputFile = new File(inputFilePath);
            // 转换后的pdf文件路径
            String outputFilePath_end = getOutputFilePath(inputFilePath);
            if (!inputFile.exists()) {
                logger.info("输入文件不存在,转换终止!");
                return null;
            }
            // 连接OpenOffice
            OfficeDocumentConverter converter = new OfficeDocumentConverter(officeManager);
            return converterFile(inputFile, outputFilePath_end, inputFilePath, converter);
        } catch (Exception e) {
            logger.error("word转化pdf出错!", e);
            throw e;
        }
    }

    /**
     * @author: zhangguoqing
     * @date: 2018/9/19 14:03
     * @param: [inputFilePath] word源文件路径 如:"e:/test.docx"
     * @return: java.util.List<java.lang.String> 转换后图片地址列表
     * @Description: word转成图片
     */
    public static List<String> officeToImg(String inputFilePath) {
        try {
            //word转成pdf
            String pdfFilePath = officeToPdf(inputFilePath);
            //pdf转图片
            List<String> iamgeFilePath = PdfToImageUtil.pdfToIamge(pdfFilePath);
            for (String string : iamgeFilePath) {
                logger.info("图片地址:" + string);
            }
            //删除pdf文件
            new File(pdfFilePath).delete();
            return iamgeFilePath;
        } catch (Exception e) {
            logger.error("word转化图片出错!", e);
            return null;
        }
    }

    /**
     * 获取输出文件
     *
     * @param inputFilePath
     * @return
     */
    public static String getOutputFilePath(String inputFilePath) {
        String outputFilePath = inputFilePath.replaceAll("." + getPostfix(inputFilePath), ".pdf");
        return outputFilePath;
    }

    /**
     * 获取inputFilePath的后缀名,如:"e:/test.pptx"的后缀名为:"pptx"<br>
     *
     * @param inputFilePath
     * @return
     */
    public static String getPostfix(String inputFilePath) {
        return inputFilePath.substring(inputFilePath.lastIndexOf(".") + 1);
    }

    /**
     * 连接OpenOffice.org 并且启动OpenOffice.org
     *
     * @return
     */
    public static OfficeManager getOfficeManager() {
        DefaultOfficeManagerConfiguration config = new DefaultOfficeManagerConfiguration();
        // 设置OpenOffice.org 3的安装目录
        config.setOfficeHome(getOfficeHome());
        // 启动OpenOffice的服务
        OfficeManager getOfficeManager = config.buildOfficeManager();
        getOfficeManager.start();
        return getOfficeManager;
    }

    /**
     * 根据操作系统的名称,获取OpenOffice.org 3的安装目录<br>
     * 如我的OpenOffice.org 3安装在:C:/Program Files (x86)/OpenOffice.org 3<br>
     *
     * @return OpenOffice.org 3的安装目录
     */
    public static String getOfficeHome() {
        String osName = System.getProperty("os.name");
        logger.info("操作系统名称:" + osName);
        if (Pattern.matches("Linux.*", osName)) {
            return linuxOpenOfficeUrl;
        } else if (Pattern.matches("Windows.*", osName)) {
            return windowsOpenOfficeUrl;
        } else if (Pattern.matches("Mac.*", osName)) {
            return macOpenofficeUrl;
        }
        return null;
    }

    /**
     * @author: zhangguoqing
     * @date: 2018/9/19 11:35
     * @param: [inputFile, outputFilePath_end, inputFilePath, converter]
     * @return: java.util.List<java.lang.String> 转换后的图片地址列表
     * @Description: 文件转换
     */
    public static String converterFile(File inputFile, String outputFilePath_end, String inputFilePath,
                                       OfficeDocumentConverter converter) throws Exception {
        File outputFile = new File(outputFilePath_end);
        // 假如目标路径不存在,则新建该路径
        if (!outputFile.getParentFile().exists()) {
            outputFile.getParentFile().mkdirs();
        }
        //判断转换文件的编码方式,如果不是UTF-8,则改为UTF-8编码
        converter.convert(inputFile, outputFile);
        logger.info("文件:" + inputFilePath + "\n转换为\n目标文件:" + outputFile + "\n成功!");
        if (outputFile.isFile() && outputFile.exists()) {
            return outputFilePath_end;
        } else {
            throw new Exception("转换的目标文件不存在 路径" + outputFilePath_end);
        }
    }

    @Value("${officeToPdf.linuxOpenOfficeUrl}")
    public void setLinuxOpenOfficeUrl(String linuxOpenOfficeUrl) {
        OfficeToPdfUtil.linuxOpenOfficeUrl = linuxOpenOfficeUrl;
    }

    @Value("${officeToPdf.windowsOpenOfficeUrl}")
    public void setWindowsOpenOfficeUrl(String windowsOpenOfficeUrl) {
        OfficeToPdfUtil.windowsOpenOfficeUrl = windowsOpenOfficeUrl;
    }

}

  pdf转换image工具类

import org.apache.commons.lang3.StringUtils;
import org.icepdf.core.pobjects.Document;
import org.icepdf.core.pobjects.Page;
import org.icepdf.core.util.GraphicsRenderingHints;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import org.springframework.beans.factory.annotation.Value;
import org.springframework.stereotype.Component;

import javax.imageio.ImageIO;
import java.awt.*;
import java.awt.image.BufferedImage;
import java.awt.image.RenderedImage;
import java.io.File;
import java.util.ArrayList;
import java.util.List;

/**
 * FileName: PdfToImageUtil
 * Author:   zhangguoqing
 * Date:     2018/9/18 17:53
 * 说明:  PDF转图片
 */
@Component
public class PdfToImageUtil {
    static Logger logger = LoggerFactory.getLogger(PdfToImageUtil.class);

    // 水印透明度
    private static float alpha = 0.2f;
    // 水印横向位置
    private static int positionWidth = 150;
    // 水印纵向位置
    private static int positionHeight = 300;
    // 水印文字字体
    private static Font font = new Font("仿宋", Font.BOLD, 26);
    // 水印文字颜色
    private static Color color = Color.GRAY;
    // 水印文字
    private static String watermark;

    //图片宽度(做成可配置项)
    private static Integer width;
    //图片高度(做成可配置项)
    private static Integer height;
    //图片格式(做成可配置项)
    private static String imgType;

    public PdfToImageUtil() {
    }

    /**
     * 有参构造,传参水印文字,生成图片时根据是否传参选择是否生成水印
     *
     * @param watermark 水印内容
     */
    public PdfToImageUtil(String watermark) {
        this.watermark = watermark;
    }

    //设置水印
    public static BufferedImage setGraphics(BufferedImage bfimage) {
        Graphics2D g = bfimage.createGraphics();
        g.setRenderingHint(RenderingHints.KEY_INTERPOLATION, RenderingHints.VALUE_INTERPOLATION_BILINEAR);
        // 5、设置水印文字颜色
        g.setColor(color);
        // 6、设置水印文字Font
        g.setFont(font);
        // 7、设置水印文字透明度
        g.setComposite(AlphaComposite.getInstance(AlphaComposite.SRC_ATOP, alpha));
        //设置旋转
        g.rotate(-Math.PI / 6);
        g.drawString(watermark, 0, (bfimage.getHeight() / 2) * 1);
        // 9、释放资源
        g.dispose();
        return bfimage;
    }

    /**
     * @author: zhangguoqing
     * @date: 2018/9/18 17:55
     * @param: [inputFile] pdf文件路径
     * @return: java.util.List<java.lang.String> 图片地址列表
     * @Description: pdf文件转图片
     */
    public static List<String> pdfToIamge(String inputFile) {
        //获取inputFile的后缀名前的内容,如:"e:/test.pptx"的后缀名为:"e:/test"
        String imgPath_start = inputFile.substring(0, inputFile.lastIndexOf("."));

        List<String> list=null;
        Document document = null;
        try {

            document = new Document();
            document.setFile(inputFile);
            float rotation = 0; //旋转角度
            int maxPages = document.getPageTree().getNumberOfPages();

            new ArrayList(maxPages);
            for (int i = 0; i < maxPages; i++) {
                //zoom 缩放比例 ,记住这里调清晰度,我用的是8.5超清晰,9以上就报错了
                BufferedImage bfimage = (BufferedImage) document.getPageImage(i, GraphicsRenderingHints.SCREEN, Page.BOUNDARY_CROPBOX, rotation, 2.1f);
                //设置图片的宽和高
                Image tempImage = bfimage.getScaledInstance(width, height, Image.SCALE_SMOOTH);
                BufferedImage biTemp = new BufferedImage(width, height, BufferedImage.TYPE_INT_RGB);
                Graphics gTemp = biTemp.getGraphics();
                gTemp.drawImage(tempImage, 0, 0, null);
                //加水印
                if (StringUtils.isNotBlank(watermark)) {
                    biTemp = setGraphics(biTemp);
                }
                RenderedImage rendImage = biTemp;
                //拼接图片地址
                String imgPath = imgPath_start + "_" + i + "." + imgType;
                ImageIO.write(rendImage, imgType, new File(imgPath));
                bfimage.flush();
                list.add(imgPath);
            }
        } catch (Exception e) {
            logger.error("pdf转化图片出错!", e);
        }

        if (document != null) {
            document.dispose();
        }
        return list;
    }

    @Value("${pdfToImg.imgWidth}")
    public void setWidth(Integer width) {
        PdfToImageUtil.width = width;
    }

    @Value("${pdfToImg.imgHeight}")
    public void setHeight(Integer height) {
        PdfToImageUtil.height = height;
    }

    @Value("${pdfToImg.imgType}")
    public void setImgType(String imgType) {
        PdfToImageUtil.imgType = imgType;
    }
}

  spring boot yml配置文件

#word转pdf
officeToPdf:
  #linux下openoffice安装地址
  linuxOpenofficeUrl: /opt/openoffice4
  #windows下openoffice安装地址 默认 请不要改变 (安装在哪个盘符都是这样)
  windowsOpenofficeUrl: C:\Program Files (x86)\OpenOffice 4
#pdf转图片
pdfToImg:
  #图片宽度
  imgWidth: 1080
  #图片高度
  imgHeight: 1920
  #图片格式
  imgType: png

三、最后说明一下oppenOffice安装时候的注意事项

  windows下(我的是win10)oppenOffice在安装时候一路确定就可以,

  在linux我在自己的阿里云Centos7.4上安装linux遇到了一些问题。开始下载的【download language pack】但是在安装过程中会缺少依赖出问题,后来选择了 【download full installation】

  1、首先linux上安装需要把下面的安装包下载

  2、然后解压 运行命令解压文件:tar -xzvf  Apache_OpenOffice_4.1.5_Linux_x86-64_install-rpm_zh-CN.tar.gz

  3、然后运行安装命令:cd zh-CN/RPMS/   rpm -ivh *.rpm

  

 四、最后提供大家下载对应的工程demo和对应的jar包,以及oppenoffice下载的安装包

  链接:https://pan.baidu.com/s/1RQQgmeSIpEiJVPkKVC2zuw 密码:ttp4

  再次注意:maven jar 对应直接解压放入到org目录下,然后刷新maven依赖或者重启ide

  

  最后请大家转文章时不要复制粘贴一部分导致别人看不懂。如果我写的哪里有不懂了直接评论刷一下,看到我会及时回复的。

原文地址:https://www.cnblogs.com/liran123/p/9733833.html

时间: 2024-10-13 22:24:26

word转PDF,PDF转Image,使用oppenOffice注意事项等的相关文章

Atitit.office&#160;word&#160;&#160;excel&#160;&#160;ppt&#160;pdf&#160;的web在线预览方案与html转换方案&#160;attilax&#160;总结

Atitit.office word  excel  ppt pdf 的web在线预览方案与html转换方案 attilax 总结 1. office word  excel pdf 的web预览要求1 1.1. 显示效果要好1 1.2. 可以自定义显示界面1 1.3. 不需要控件,兼容性好1 1.4. 支持编辑操作1 2. 纯html预览解决之道(自由的格式)1 3. 转换swf flash方案2 4. 转换pdf方式..更多的浏览器已经直接支持pdf格式查看2 5. 控件方式2 6. Hyb

教你如何将word转换成PDF文档使用

对于各种不同文档格式的转换对文字工作者来说可谓是"家常便饭",而最让人头疼的莫过于office文档与pdf文档之间的互相转换.有时候遇到需要文字编辑的就得转换成word文档,有时候要成稿传输了,又得转换成pdf格式,这来回之间的转换,如果没有一个好的转换器作为帮手,还真的是会让人抓狂. 今天小编和大家介绍一款小编平时用的转换器软件.除了将word转成pdf,更重要的是能够对一些常见类型的文档转换格式.像word.ppt.excel.pdf等都可以转为你需要的文档格式.另外还能对文档进行

java文本、表格word转换生成PDF加密文件代码下载

原文:java文本.表格word转换生成PDF加密文件代码下载 代码下载地址:http://www.zuidaima.com/share/1550463239146496.htm 这个实现了PDF加密功能,和一些基本的问题. java文本.表格word转换生成PDF加密文件代码下载,布布扣,bubuko.com

用C#将Word转化成PDF 报错“由于出现意外错误,导出失败”解决方案

前几天客户说OA系统预览不了某个Doc格式的文档了,查看日志是在word转化成PDF时报"由于出现意外错误,导出失败"的错误.我想到之前也遇到过这个问题,是因为Word本身就不能另存为PDF,就会出现"由于出现意外错误,导出失败"的错误提示,后来叫客户用"导出"->"创建PDF/XPS文档"方法 将Word文档另存为了PDF文档后,上传了就能预览了. 但是这次文档能够另存为PDF文档,那就是其他原因导致的报错.百度了一通

支持在线Word格式转PDF文本的转换器

找一个好的PDF转换器就是在节省自己的时间.相信大家都有过这样的经验:好不容易找到了一些好点的 资料,但却基于格式的问题而停滞不前.因为普通的办公软件,如office就是打不开PDF文件的.这时候 我们需要的就是一个比较好用的PDF在线转Word转换器了. 由于我们经常需要转换的PDF文件内容并不相同,而不同的PDF文件内容对于不同的PDF识别技术将造成巨 大的困难,因此如何将PDF有效地进行转换,成为目前大部分用户关注的问题之一. 下面主要介绍迅捷PDF转Word转换器的特色功能. 灵活多样的

C#将Word转换成PDF方法总结(基于Office和WPS两种方案)

有时候,我们需要在线上预览word文档,当然我们可以用NPOI抽出Word中的文字和表格,然后显示到网页上面,但是这样会丢失掉Word中原有的格式和图片.一个比较好的办法就是将word转换成pdf,然后让客户预览,下面来看一下基于Office和WPS的两种解决方案.  一.基于Office的解决方案(推荐使用这种方式) 正如标题所说,基于Office就是要求服务器上面要安装的有Office.我们通过C#代码来调用COM接口,实现将Word转换成PDF.下面来看一下具体实现,首先引用Microso

如何将word转换成pdf格式的文档

word文档是办公常用到的一种格式,它可以方便的记录文字.图片,也可以随时修改,让我们的工作方便很多,但随时修改并不见得只有好处,如果是一份重要的word文档编辑完成后你还希望他可以随时修改吗?答案当然是否定的,所以我们需要将word转换成pdf格式. word转换成pdf格式比较常用到,所以方法也比较的多,下面一一介绍: 首先可以直接转换,打开word文档,找到wps文字旁的下拉箭头,点击文件,找到“输出为pdf"选项单击: 文件的保存格式大家可以设置一下,方便自己找到,然后确定就行了. 第一

如何将word转换成pdf的两种便捷方法

为了让文件有更好的阅读效果并且保证在任何操作平台上都可以使用,很多时候我们需要将各种格式的文件转换成pdf格式的文件,其中最常见的可能就是word文档转换成pdf格式文件了.那么,如何将word转换成pdf呢?小猪猪现在为大家介绍两种常见的转换方法,需要的大家可以选择合适的使用. 一.使用word等office软件直接转换    这种方法优点很明显,可以不用下载第三方软件,操作比较简单.但是限制性比较大,需要是合适的格式且不能批量转换.小猪猪以word文档为例向大家介绍具体操作方法. word文

怎样自动将word转换成为PDF文件

有些word文档在编辑完成后会转换成一个pdf文件,用来传送给他人查看,这样既可以看不同系统上打开查看,也可以使文档不被随意修改.将word转换成pdf,不用复制粘贴或是重新制作pdf文件,那怎样自动将word转换成为PDF文件呢? 把word自动转换成pdf,先打开进入在线word转pdf工具,选择word转pdf选项. 点选择文件,将需要转换的word添加到在线转换工具,然后点开始转换,等文档处理完成后,直接下载转换好的pdf文件就可以了. 如果安装的是新版本的word编辑工具,例如offi