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

微信扫一扫,分享到朋友圈

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

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

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

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

  
        
            org.icepdf.os
            icepdf-core
            6.2.2
            
                
                    javax.media
                    jai_core
                
            
        
        
            org.icepdf.os
            icepdf-viewer
            6.2.2
        
        
        
            org.openoffice
            jurt
            3.0.1
        
        
            org.openoffice
            ridl
            3.0.1
        
        
            org.openoffice
            juh
            3.0.1
        
        
            org.openoffice
            unoil
            3.0.1
        
        
        
            org.artofsolving.jodconverter
            jodconverter-core
            3.0-beta-4
        

这里注意: 你还一个需要把一个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文件
* * @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 转换后图片地址列表 * @Description: word转成图片 */ public static List officeToImg(String inputFilePath) { try { //word转成pdf String pdfFilePath = officeToPdf(inputFilePath); //pdf转图片 List 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"
* * @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的安装目录
* 如我的OpenOffice.org 3安装在:C:/Program Files (x86)/OpenOffice.org 3
* * @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 转换后的图片地址列表 * @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 图片地址列表
     * @Description: pdf文件转图片
     */
    public static List pdfToIamge(String inputFile) {
        //获取inputFile的后缀名前的内容,如:"e:/test.pptx"的后缀名为:"e:/test"
        String imgPath_start = inputFile.substring(0, inputFile.lastIndexOf("."));

        List 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

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

微信扫一扫,分享到朋友圈

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

ZNDP 037 – Ask Zig – Do You Think The CCIE DC Makes Sense?

上一篇

China’s oldest tech media, Beijing Sci-Tech Report (BSTR), switches to Bitcoin to increase ...

下一篇

你也可能喜欢

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

长按储存图像,分享给朋友