word转PDF,PDF转图片

PDF转图片

最近公司业务需求将pdf,和word文件转成图片.在网上找了很多,也测试了很多.最终根据自己的需求做成了下面两个工具类,来完成需求.pdf转图片用的是icepdf,可以自己根据需求添加水印文字,设置图片分辨率.

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 java.awt.AlphaComposite;
import java.awt.Color;
import java.awt.Font;
import java.awt.Graphics;
import java.awt.Graphics2D;
import java.awt.Image;
import java.awt.RenderingHints;
import java.awt.image.BufferedImage;
import java.awt.image.RenderedImage;
import java.io.File;
import java.util.ArrayList;
import java.util.List;

import javax.imageio.ImageIO;

/**
 * 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;
    }

    /**
     * @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 {
            list = new ArrayList(0);
            document = new Document();
            document.setFile(inputFile);
            float rotation = 0; //旋转角度
            int maxPages = document.getPageTree().getNumberOfPages();
            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, java.awt.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("${ojd.constant.pdfToImg.imgWidth}")
    public void setWidth(Integer width) {
        PdfToImageUtil.width = width;
    }
    @Value("${ojd.constant.pdfToImg.imgHeight}")
    public void setHeight(Integer height) {
        PdfToImageUtil.height = height;
    }
    @Value("${ojd.constant.pdfToImg.imgType}")
    public void setImgType(String imgType) {
        PdfToImageUtil.imgType = imgType;
    }
}

图片的宽,高,格式我是做成了配置项,大家测试的时候可以自己写死.图片的生成地址我是和pdf文件路径保持一致.
测试类:

@Test
    public void pdfToImg(){
        //PdfToImageUtil pdfToImageUtil = new PdfToImageUtil();

        List<String> strings = PdfToImageUtil.pdfToIamge("C:/Users/admin/Desktop/支付令申请书.pdf");
        for (String string : strings) {

            System.out.println(string);
        }
    }

word转pdf

word转图片在网上找了很多都是不能直接转换,需要先将word转成pdf再转图片.考虑到最后跨平台我最终选择使用openoffice,先上工具类,具体细节我会后面讲.

import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
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;

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.springframework.beans.factory.annotation.Value;
import org.springframework.stereotype.Component;

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

    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 File officeToPdf(String inputFilePath) {
        //加锁
        lock.lock();
        OfficeManager officeManager = null;
        try {
            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的安装路劲
            officeManager = getOfficeManager();
            // 连接OpenOffice
            OfficeDocumentConverter converter = new OfficeDocumentConverter(officeManager);

            return converterFile(inputFile, outputFilePath_end, inputFilePath, converter);
        } catch (Exception e) {
            logger.error("word转化pdf出错!", e);
        } finally {
            // 停止openOffice
            if (officeManager != null) {
                officeManager.stop();
            }
            //释放锁
            lock.unlock();
        }
        return null;
    }

    /**
     * @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
            File pdfFilePath = officeToPdf(inputFilePath);
            //pdf转图片
            List<String> iamgeFilePath = PdfToImageUtil.pdfToIamge(pdfFilePath.toString());
            for (String string : iamgeFilePath) {
                logger.info("图片地址:"+string);
            }

            //删除pdf文件
            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()throws Exception {
        DefaultOfficeManagerConfiguration config = new DefaultOfficeManagerConfiguration();
        // 设置OpenOffice.org 3的安装目录
        config.setOfficeHome(getOfficeHome());
        // 启动OpenOffice的服务
        OfficeManager officeManager = config.buildOfficeManager();
        officeManager.start();
        return officeManager;
    }

    /**
     * 根据操作系统的名称,获取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 File 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成功!");

        return outputFile;
    }


    @Value("${ojd.constant.officeToPdf.linuxOpenofficeUrl}")
    public void setLinuxOpenofficeUrl(String linuxOpenofficeUrl) {
        OfficeToPdfUtil.linuxOpenofficeUrl = linuxOpenofficeUrl;
    }

    @Value("${ojd.constant.officeToPdf.windowsOpenofficeUrl}")
    public void setWindowsOpenofficeUrl(String windowsOpenofficeUrl) {
        OfficeToPdfUtil.windowsOpenofficeUrl = windowsOpenofficeUrl;
    }
}

测试类:

@Test
    public void wordToPdf(){
        //word转图片开始时间
        long startTime = System.currentTimeMillis();
        File file = OfficeToPdfUtil.officeToPdf("C:/Users/admin/Desktop/支付令申请书.docx");
            System.out.println("pdf地址:"+file);
        //word转图片结束时间
        long endTime = System.currentTimeMillis();
        logger.info("word转pdf用时:"+(endTime-startTime)/1000+"秒");
    }

    @Test
    public void wordToImg(){
        //word转图片开始时间
        long startTime = System.currentTimeMillis();
        List<String> strings = OfficeToPdfUtil.officeToImg("C:/Users/admin/Desktop/支付令申请书.docx");

        //word转图片结束时间
        long endTime = System.currentTimeMillis();
        logger.info("word转pdf用时:"+(endTime-startTime)/1000+"秒");
    }

openoffice在windows和linux下的安装地址也是可配置,下面贴出配置代码,大家可以先写死.

#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

maven地址

<!--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>
        <!--需要手动添加到本地仓库-->
        <dependency>
            <groupId>org.artofsolving.jodconverter</groupId>
            <artifactId>jodconverter-core</artifactId>
            <version>3.0-beta-4</version>
        </dependency>

**这里需要注意,最后一个jar包从中央仓库无法下载,需要手动将jar包导入仓库
添加jar包命令:
mvn install:install-file -Dfile=C:\Users\admin\Desktop\jodconverter-core-3.0-beta-4.jar -DgroupId=org.artofsolving.jodconverter -DartifactId=jodconverter-core -Dversion=3.0-beta-4 -Dpackaging=jar
下面是我上传的所有需要的jar包地址,希望大家需要的话,支持一下:
jar包地址
**

下面是openoffice下载地址,大家根据自己的需要选择下载,安装步骤自行百度.
下载地址:http://www.openoffice.org/download/index.html

猜你喜欢

转载自blog.csdn.net/Super_Code_King/article/details/82837405