实现DOC、DOCX转换为PDF 再将PDF转换为图片

首先导入需要的依赖

<dependency><groupId>cn.hutool</groupId><artifactId>hutool-all</artifactId><version>5.4.7</version>
</dependency><!--pdf转换工具-->
<dependency><groupId>net.sf.cssbox</groupId><artifactId>pdf2dom</artifactId><version>1.7</version>
</dependency>
<dependency><groupId>org.apache.pdfbox</groupId><artifactId>pdfbox</artifactId><version>2.0.12</version>
</dependency>
<dependency><groupId>org.apache.pdfbox</groupId><artifactId>pdfbox-tools</artifactId><version>2.0.12</version>
</dependency>
<dependency><groupId>com.lowagie</groupId><artifactId>itext</artifactId><version>2.0.7</version>
</dependency>
<!--文档转换工具-->
<dependency><groupId>com.aspose</groupId><artifactId>aspose-words</artifactId><version>15.8.0</version><scope>system</scope><systemPath>${basedir}/lib/aspose-words-15.8.0-jdk16.jar</systemPath>
</dependency>

其中aspose-words-15.8.0-jdk16.jar需要从外部引入:链接:https://pan.baidu.com/s/1eqMR_6lvt8HHIAxTvs09fA 提取码:o5ct

资源目录下添加Locense.xml

<License><Data><Products><Product>Aspose.Total for Java</Product><Product>Aspose.Words for Java</Product></Products><EditionType>Enterprise</EditionType><SubscriptionExpiry>20991231</SubscriptionExpiry><LicenseExpiry>20991231</LicenseExpiry><SerialNumber>8bfe198c-7f0c-4ef8-8ff0-acc3237bf0d7</SerialNumber></Data><Signature>sNLLKGMUdF0r8O1kKilWAGdgfs2BvJb/2Xp8p5iuDVfZXmhppo+d0Ran1P9TKdjV4ABwAgKXxJ3jcQTqE/2IRfqwnPf8itN8aFZlV3TJPYeD3yWE7IT55Gz6EijUpC7aKeoohTb4w2fpox58wWoF3SNp6sK6jDfiAUGEHYJ9pjU=</Signature>
</License>

将word转换为PDF的工具类

import cn.hutool.core.collection.CollUtil;
import cn.hutool.system.OsInfo;
import cn.hutool.system.SystemUtil;
import com.aspose.words.Document;
import com.aspose.words.FontSettings;
import com.aspose.words.License;
import com.aspose.words.SaveFormat;
import lombok.extern.slf4j.Slf4j;import java.io.ByteArrayOutputStream;
import java.io.InputStream;
import java.util.Arrays;@Slf4j
public class AsposeUtil {private static final String[] WORD = {"doc", "docx", "wps", "wpt", "txt"};private static final String[] EXCEL = {"xls", "xlsx", "et", "xlsm"};private static final String[] PPT = {"ppt", "pptx"};private static final String[] PDF = {"pdf"};private static final String[] IMG = {"bmp", "jpg", "png", "tif", "gif", "pcx", "tga", "exif", "fpx", "svg", "psd", "cdr", "pcd", "dxf", "ufo", "eps", "ai", "raw", "WMF", "webp", "avif", "apng"};private static final String TYPE_UNSUPPORT = "不支持的格式";private static final String TYPE_WORD = "TYPE_WORD";private static final String TYPE_EXCEL = "TYPE_EXCEL";private static final String TYPE_PPT = "TYPE_PPT";private static final String TYPE_PDF = "TYPE_PDF";private static final String TYPE_IMG = "TYPE_IMG";private boolean judgeLicense() {boolean result = false;try {InputStream is = AsposeUtil.class.getClassLoader().getResourceAsStream("License.xml");License aposeLic = new License();aposeLic.setLicense(is);result = true;} catch (Exception e) {log.error("Aspose License 文档转换失败!", e);}return result;}/*** 根据文件名判断文件类型*/private String getType(String fileName) {String suffix = fileName.substring(fileName.lastIndexOf(".") + 1).toLowerCase(); // 后缀if (CollUtil.contains(Arrays.asList(WORD), suffix)) {return TYPE_WORD;} else if (CollUtil.contains(Arrays.asList(EXCEL), suffix)) {return TYPE_EXCEL;} else if (CollUtil.contains(Arrays.asList(PPT), suffix)) {return TYPE_PPT;} else if (CollUtil.contains(Arrays.asList(PDF), suffix)) {return TYPE_PDF;} else if (CollUtil.contains(Arrays.asList(IMG), suffix)) {return TYPE_IMG;} else {return TYPE_UNSUPPORT;}}public static void main(String[] args) throws Exception {}/*** 文件转化pdf* @param fileName 文件名称* @param in     文件输入流* @return 转换后的pdf地址 或 格式不支持预览*/public byte[] toPdf(String fileName, InputStream in) throws Exception {if (!judgeLicense()) {throw new Exception();}String type = getType(fileName);if (TYPE_WORD.equals(type)) {try (ByteArrayOutputStream tmp = wordToPdfStream(in)) {return tmp.toByteArray();} catch (Exception e) {log.error("word转换pdf失败!", e);}}return new byte[0];}private ByteArrayOutputStream wordToPdfStream(InputStream in) throws Exception {Document doc = new Document(in);OsInfo osInfo = SystemUtil.getOsInfo();if (osInfo.isLinux()) {// 提前将字体安装到linux如下路径 TODO 如果是linux环境则需要将windows下字体(C:\Windows\Fonts)提前复制到这个目录下FontSettings.setFontsFolder("/usr/share/fonts/chinese", true);}ByteArrayOutputStream dstStream = new ByteArrayOutputStream();doc.save(dstStream, SaveFormat.PDF);return dstStream;}//private ByteArrayOutputStream excelToPdfStream(InputStream in) throws Exception {//    Workbook excel = new Workbook(in);//    ByteArrayOutputStream dstStream = new ByteArrayOutputStream();//    excel.save(dstStream, SaveFormat.PDF);//    return dstStream;//}////private ByteArrayOutputStream pptToPdfStream(InputStream in) throws Exception {//    Presentation ppt = new Presentation (in);//    ByteArrayOutputStream dstStream = new ByteArrayOutputStream();//    ppt.save(dstStream, SaveFormat.PDF);//    return dstStream;//}
}

将PDF转换为图片的工具类

import cn.hutool.core.util.ObjectUtil;
import com.google.common.collect.Lists;
import com.lowagie.text.pdf.PdfReader;
import lombok.extern.slf4j.Slf4j;
import org.apache.commons.lang3.ArrayUtils;
import org.apache.pdfbox.pdmodel.PDDocument;
import org.apache.pdfbox.rendering.ImageType;
import org.apache.pdfbox.rendering.PDFRenderer;import javax.imageio.ImageIO;
import java.awt.image.BufferedImage;
import java.io.File;
import java.io.FileInputStream;
import java.io.IOException;
import java.util.List;@Slf4j
public class PdfUtil {public static final int DEFAULT_DPI = 150;/**** PDF文件转PNG图片,全部页数** @param pdfFilePath pdf完整路径* @param dpi dpi越大转换后越清晰,相对转换速度越慢*/public static void pdf2Image(String pdfFilePath, int dpi) {File file = new File(pdfFilePath);PDDocument pdDocument;try {String imgPdfPath = file.getParent();int dot = file.getName().lastIndexOf('.');// 获取图片文件名String imagePdfName = file.getName().substring(0, dot);pdDocument = PDDocument.load(file);PDFRenderer renderer = new PDFRenderer(pdDocument);/* dpi越大转换后越清晰,相对转换速度越慢 */PdfReader reader = new PdfReader(pdfFilePath);int pages = reader.getNumberOfPages();StringBuffer imgFilePath;for (int i = 0; i < pages; i++) {String imgFilePathPrefix = imgPdfPath + File.separator + imagePdfName;imgFilePath = new StringBuffer();imgFilePath.append(imgFilePathPrefix);imgFilePath.append("_");imgFilePath.append((i + 1));imgFilePath.append(".png");File dstFile = new File(imgFilePath.toString());BufferedImage image = renderer.renderImageWithDPI(i, dpi);ImageIO.write(image, "png", dstFile);}log.info("PDF文档转PNG图片成功!");} catch (IOException e) {e.printStackTrace();}}/*** pdf转图片* 多页PDF会每页转换为一张图片,下面会有多页组合成一页的方法* @param pdfFile pdf文件路径* @param outPath 图片输出路径* @param dpi 相当于图片的分辨率,值越大越清晰,但是转换时间变长*/public static void pdf2multiImageFile(String pdfFile, String outPath, int dpi) {if (ObjectUtil.isEmpty(dpi)) {// 如果没有设置DPI,默认设置为150dpi = DEFAULT_DPI;}try (PDDocument pdf = PDDocument.load(new FileInputStream(pdfFile))) {int actSize = pdf.getNumberOfPages();List<BufferedImage> picList = Lists.newArrayList();for (int i = 0; i < actSize; i++) {BufferedImage image = new PDFRenderer(pdf).renderImageWithDPI(i, dpi, ImageType.RGB);picList.add(image);}// 组合图片ImageUtil.combinationImages2File(picList, outPath);} catch (IOException e) {e.printStackTrace();}}/*** pdf转图片* 多页PDF会每页转换为一张图片,下面会有多页组合成一页的方法* @param pdfBytes pdf文件字节数组* @param dpi 相当于图片的分辨率,值越大越清晰,但是转换时间变长*/public static byte[] pdfBytes2multiImageBytes(byte[] pdfBytes, int dpi) {if (ArrayUtils.isEmpty(pdfBytes)) {return new byte[0];}if (dpi <= 0) {// 如果没有设置DPI,默认设置为150dpi = DEFAULT_DPI;}try (PDDocument pdf = PDDocument.load(pdfBytes)) {int actSize = pdf.getNumberOfPages();List<BufferedImage> picList = Lists.newArrayList();PDFRenderer renderer = new PDFRenderer(pdf);for (int i = 0; i < actSize; i++) {BufferedImage image = renderer.renderImageWithDPI(i, dpi, ImageType.RGB);picList.add(image);}// 组合图片return ImageUtil.combinationImages2Bytes(picList);} catch (IOException e) {log.error("pdf解析失败!", e);}return new byte[0];}}

实现多张图片组合的工具类

import lombok.extern.slf4j.Slf4j;import javax.imageio.ImageIO;
import java.awt.image.BufferedImage;
import java.io.ByteArrayOutputStream;
import java.io.File;
import java.io.IOException;
import java.util.ArrayList;
import java.util.List;@Slf4j
public class ImageUtil {/*** 将宽度相同的图片,竖向追加在一起 ##注意:宽度必须相同* @param picList 文件流数组*/private static BufferedImage yPic(List<BufferedImage> picList) {// 纵向处理图片if (picList == null || picList.size() <= 0) {log.info("图片数组为空!");return null;}try {// 总高度int height = 0,// 总宽度width = 0,// 临时的高度 , 或保存偏移高度offsetHeight,// 临时的高度,主要保存每个高度tmpHeight,// 图片的数量picNum = picList.size();// 保存每个文件的高度int[] heightArray = new int[picNum];// 保存图片流BufferedImage buffer;// 保存所有的图片的RGBList<int[]> imgRgb = new ArrayList<>();// 保存一张图片中的RGB数据int[] tmpImgRgb;for (int i = 0; i < picNum; i++) {buffer = picList.get(i);// 图片高度heightArray[i] = offsetHeight = buffer.getHeight();if (i == 0) {// 图片宽度width = buffer.getWidth();}// 获取总高度height += offsetHeight;// 从图片中读取RGBtmpImgRgb = new int[width * offsetHeight];tmpImgRgb = buffer.getRGB(0, 0, width, offsetHeight, tmpImgRgb, 0, width);imgRgb.add(tmpImgRgb);}// 设置偏移高度为0offsetHeight = 0;// 生成新图片BufferedImage imageResult = new BufferedImage(width, height, BufferedImage.TYPE_INT_RGB);for (int i = 0; i < picNum; i++) {tmpHeight = heightArray[i];if (i != 0) {// 计算偏移高度offsetHeight += tmpHeight;}// 写入流中imageResult.setRGB(0, offsetHeight, width, tmpHeight, imgRgb.get(i), 0, width);}return imageResult;} catch (Exception e) {log.error("图片合成失败!", e);}return null;}/*** 将图片列表组合成长图* 注意:文件宽度必须一致* @param picList 图片列表* @return 转换后的字节数组*/public static byte[] combinationImages2Bytes(List<BufferedImage> picList) {BufferedImage image = yPic(picList);if (image != null) {try (ByteArrayOutputStream baos = new ByteArrayOutputStream()) {boolean png = ImageIO.write(image, "png", baos);if (png) {return baos.toByteArray();}} catch (IOException e) {log.error("图片组合失败!", e);}}return new byte[0];}/*** 将图片组合并输出到文件中* @param picList 文件流数组* @param outPath 输出路径*/public static void combinationImages2File(List<BufferedImage> picList, String outPath) throws IOException, NullPointerException {BufferedImage image = yPic(picList);File outFile = new File(outPath);ImageIO.write(image, "png", outFile);}}

示例代码

public class TestDemo {// 文件绝对路径private static String filepath = "D:\\***\\";// 文件名称private static String filename = "****.docx";public static void main(String[] args) throws Exception {if (filename.endsWith(".pdf")) {PdfUtil.pdf2multiImageFile(filepath, "pdf2png.png",130);// 文件输出到某个路径下面} else {// WORD就先生成pdf在生成快照byte[] pdfBytes = new AsposeUtil().toPdf(filename, new FileInputStream(filepath + filename));final byte[] bytes =PdfUtil.pdfBytes2multiImageBytes(pdfBytes, 130);final FileOutputStream fileOutputStream = new FileOutputStream("word2png.png");fileOutputStream.write(bytes);}}}

运行完这个main方法你就会发现大功告成!

实现DOC、DOCX转换为PDF 再将PDF转换为图片相关推荐

  1. 微信小程序 - 在线预览 Office 文件(doc / docx / xls / xlsx / ppt / pptx / pdf)

    效果图 前言 网上大部分教程功能有问题且文章无逻辑混乱,本文将提供优秀的示例. 本文只适用于预览 服务端接口返回的网络地址文件,"本地上传" 文件并预览原理一样, 例如服务端接口返 ...

  2. Java word(doc/docx)转pdf 无水印/免费

    最近项目有个需求需要将word转为pdf. 网络上有好多种方案:spire,aspose,jacob等,由于jacob需要在jdk添加dll文件,有点束缚,所以在这里就不讲这个方案了 一.spire. ...

  3. POI根据模板导出word文件,以及word转PDF,PDF转图片再插入PDF中(防止PDF被修改)

    POI操作word和PDF POI根据模板导出word文件 word转PDF PDF转图片再插入PDF中(防止PDF被修改) POI根据模板导出word文件 一.制作word模版,${xxxx}是一会 ...

  4. 【Java】SpringBoot后端格式转换:把Word转成PDF再按页转成图片在前端展示(Linux)

    ConvertUtil 1. word2pdf 1.1 aspose-word插件 1.2 word转pdf 1.2.1 添加license文件 1.2.2 具体实现 2. pdf2imgByPage ...

  5. 使用icepdf将pdf首页内容转成图片

    说明: 1.图片命名规则:给定的文件所属目录+给定的文件的名称+.+png,即同目录下同名称的png图片 2.基本业务: a.判断同目录下同名称的png图片是否存在,若已经存在直接return b.若 ...

  6. (Java)word转pdf(aspose),pdf加水印(itextpdf),并支持POI模板(包括checkbox)导出

    目录 1.引入jar包 2.pdf处理工具类 3.poi模板导出工具类 4.测试类 5.模板 6.最终效果 1.引入jar包 2.pdf处理工具类 import com.aspose.cells.Pd ...

  7. Word处理控件Aspose.Words功能演示:在 Java 中将 Word DOC/DOCX 转换为 PDF

    Aspose.Words是一种高级Word文档处理API,用于执行各种文档管理和操作任务.API支持生成,修改,转换,呈现和打印文档,而无需在跨平台应用程序中直接使用Microsoft Word. A ...

  8. java转换docx为doc文件_java使用poi转换doc/docx为pdf

    为了方便前端预览word文件,上传后进行pdf转换(也可以预览时生成临时文件)*注word中插入的表格的话表格内字体都要为宋体不然转出来为空 引用jar包 org.apache.poi poi-oox ...

  9. java 接口文档的格式化_Java Word API - 读写转换处理DOC DOCX HTML PDF HTML格式

    Java Word 文档处理API 先进功能 执行邮件合并 使用邮件合并生成报表 插入格式户文本,段落,图像,表格以及其他内容到Word文档中 使用数据库的检索数据填充到Word文档中的表格 创建邮件 ...

最新文章

  1. HP小型机的信息的命令集(一)
  2. c语言小学生算法,急求:C语言小学生算法练习软件实现的任务:面向小学生,随机选择两个整数进行加、减、乘、除,要求学生解答。设计内容:1、电...
  3. linux内核编译及系统裁减
  4. 机构:去年购房者平均年龄近30岁
  5. CSDN内容颜色、位置以及图片大小改变
  6. 解读ASP.NET 5 MVC6系列(10):Controller与Action
  7. python 类初始化参数校验_如何规避python参数的初始化次数?
  8. Flutter Listener 监听手指的滑动方向、监听手指上下滑动
  9. 2007年8月25日华为的几个面试题
  10. Doug Lea 在 J.U.C 包里面写的 BUG 又被网友发现了......
  11. soft music
  12. Linux磁盘管理之df命令详解和使用实例(查看磁盘空间占用情况)
  13. Mysql怎样删除以“#sql-”开头的暂时表
  14. 编写可维护的 JavaScript
  15. namp安装及官方使用手册翻译及注释5
  16. App隐私合规协议(第三方SDK)说明
  17. 华三c语言笔试,H3C笔试及答案解析
  18. 浅谈FromHandle
  19. JS数组转字符串传到JAVA后端取出
  20. 硬核:如何用「区块链」改进传染病监测预警网络?

热门文章

  1. java.lang.IllegalStateException: getWriter() has already been called for this response问题解决
  2. 3.Sunday算法的一个小优化
  3. JavaScript(三)
  4. python实现阿列金分类法
  5. html判断是苹果,JavaScript判断是否是iPhone X系列机型,H5和其他环境兼容
  6. 【笔记】多因素条件下注意力分配建模
  7. #博学谷it学习技术支持#黑马头条知识点1
  8. 系统分析与设计 - Chapter 1 系统分析与设计概述(思维导图)
  9. 痞子衡嵌入式:串口调试工具Jays-PyCOM诞生记(6)- 打包发布(PyInstaller3.3.1)
  10. 有限体积法及其网格简介