方法一、此方法应用的org.icepdf,maven无法下载。
package kf.ats.gvnsvr.client.taizhou.common;
import java.awt.image.BufferedImage;
import java.io.ByteArrayOutputStream;
import java.io.File;
import java.io.FileOutputStream;
import java.util.ArrayList;
import java.util.List;
import javax.imageio.ImageIO;
import org.icepdf.core.pobjects.Document;
import org.icepdf.core.util.GraphicsRenderingHints;
public class PdfToImageUtil {
/**
* 将pdf文件转成HDjpg图片
* @param filePath
* @param path
*/
public static void pdfToHDjpg(String filePath,String path){
try {
Document document = new Document();
document.setFile(filePath);
//缩放比例
float scale = 2.5f;
//旋转角度
float rotation = 0f;
List<BufferedImage> piclist = new ArrayList<BufferedImage>();
for (int i = 0; i < document.getNumberOfPages(); i++) {
BufferedImage image = (BufferedImage)
document.getPageImage(i, GraphicsRenderingHints.SCREEN,
org.icepdf.core.pobjects.Page.BOUNDARY_CROPBOX, rotation, scale);
image.flush();
piclist.add(image);
}
yPic(piclist,path);
document.dispose();
} catch (Exception e1) {
// TODO Auto-generated catch block
e1.printStackTrace();
}
}
/**
* 将宽度相同的图片,竖向追加在一起 ##注意:宽度必须相同
*
* @param piclist
* 文件流数组
* @param outPath
* 输出路径
*/
public static void yPic(List<BufferedImage> piclist, String outPath) {// 纵向处理图片
if (piclist == null || piclist.size() <= 0) {
System.out.println("图片数组为空!");
return;
}
try {
int height = 0, // 总高度
width = 0, // 总宽度
_height = 0, // 临时的高度 , 或保存偏移高度
__height = 0, // 临时的高度,主要保存每个高度
picNum = piclist.size();// 图片的数量
int[] heightArray = new int[picNum]; // 保存每个文件的高度
BufferedImage buffer = null; // 保存图片流
List<int[]> imgRGB = new ArrayList<int[]>(); // 保存所有的图片的RGB
int[] _imgRGB; // 保存一张图片中的RGB数据
for (int i = 0; i < picNum; i++) {
buffer = piclist.get(i);
heightArray[i] = _height = buffer.getHeight();// 图片高度
if (i == 0) {
width = buffer.getWidth();// 图片宽度
}
height += _height; // 获取总高度
_imgRGB = new int[width * _height];// 从图片中读取RGB
_imgRGB = buffer
.getRGB(0, 0, width, _height, _imgRGB, 0, width);
imgRGB.add(_imgRGB);
}
_height = 0; // 设置偏移高度为0
// 生成新图片
BufferedImage imageResult = new BufferedImage(width, height,
BufferedImage.TYPE_INT_BGR);
for (int i = 0; i < picNum; i++) {
__height = heightArray[i];
if (i != 0)
_height += __height; // 计算偏移高度
imageResult.setRGB(0, _height, width, __height, imgRGB.get(i),
0, width); // 写入流中
}
File outFile = new File(outPath);
ByteArrayOutputStream out = new ByteArrayOutputStream();
ImageIO.write(imageResult, "jpg", out);// 写图片
byte[] b = out.toByteArray();
FileOutputStream output = new FileOutputStream(outFile);
output.write(b);
out.close();
output.close();
} catch (Exception e) {
e.printStackTrace();
}
}
public static void main(String[] args) {
String filePath = "D:\\a.pdf";
pdfToHDjpg(filePath, "D:\\b.jpg");
}
}
参考:https://blog.youkuaiyun.com/u011712163/article/details/79896259
需要的jar:https://pan.baidu.com/s/116RGCqviC14J0w_nFGa_Bg
提取码:tc5y
方法二,maven依赖
注意:下面方法使用main运行时会报错,我用接口调用的方式运行是正常的。
<dependency>
<groupId>org.apache.pdfbox</groupId>
<artifactId>pdfbox</artifactId>
<version>2.0.9</version>
</dependency>
<dependency>
<groupId>org.apache.pdfbox</groupId>
<artifactId>pdfbox-tools</artifactId>
<version>2.0.9</version>
</dependency>
<!-- https://mvnrepository.com/artifact/commons-logging/commons-logging -->
<dependency>
<groupId>commons-logging</groupId>
<artifactId>commons-logging</artifactId>
<version>1.2</version>
</dependency>
import com.lowagie.text.Document;
import com.lowagie.text.Image;
import com.lowagie.text.PageSize;
import com.lowagie.text.pdf.PdfContentByte;
import com.lowagie.text.pdf.PdfReader;
import com.lowagie.text.pdf.PdfStamper;
import com.lowagie.text.pdf.PdfWriter;
import com.tiandy.pangu.framework.log.util.TdClassLog;
import com.tiandy.pangu.framework.log.util.TdLog;
import com.tiandy.remotetrial.core.enums.LogErrorCodeEnum;
import org.apache.pdfbox.pdmodel.PDDocument;
import org.apache.pdfbox.rendering.PDFRenderer;
import org.springframework.web.multipart.MultipartFile;
import javax.imageio.ImageIO;
import java.awt.image.BufferedImage;
import java.io.*;
import java.util.ArrayList;
import java.util.List;
public class PdfUtil {
public static void main(String[] args) {
pdf2JPG("D:","1231",".png");
}
/**
* 转换全部的pdf
* @param fileAddress 文件地址
* @param filename PDF文件名
* @param type 图片类型
*/
public static void pdf2JPG(String fileAddress,String filename,String type) {
// 将pdf装图片 并且自定义图片得格式大小
File file = new File(fileAddress+"\\"+filename+".pdf");
try {
PDDocument doc = PDDocument.load(file);
PDFRenderer renderer = new PDFRenderer(doc);
int pageCount = doc.getNumberOfPages();
if(pageCount == 1){
// Windows native DPI
BufferedImage image = renderer.renderImageWithDPI(0, 144);
ByteArrayOutputStream out = new ByteArrayOutputStream();
ImageIO.write(image, "jpg", new File(fileAddress+"\\"+filename+type);// 写图片
return;
}
//图片集合
List<BufferedImage> piclist = new ArrayList<>();
for (int i = 0; i < pageCount; i++) {
BufferedImage image = renderer.renderImageWithDPI(i, 144); // Windows native DPI
//将图片输出到本地
//ImageIO.write(image, type, new File(fileAddress+"\\"+filename+"_"+(i+1)+type));
//将图片添加到集合中;
image.flush();
piclist.add(image);
}
//将多张图片合成一张图片,并保存到本地
yPic(piclist,fileAddress+"\\"+filename+type);
} catch (IOException e) {
e.printStackTrace();
}
}
/**
* 将宽度相同的图片,竖向追加在一起 ##注意:宽度必须相同
*
* @param piclist
* 文件流数组
* @param outPath
* 输出路径
*/
public static void yPic(List<BufferedImage> piclist, String outPath) {// 纵向处理图片
if (piclist == null || piclist.size() <= 0) {
System.out.println("图片数组为空!");
return;
}
try {
int height = 0, // 总高度
width = 0, // 总宽度
_height = 0, // 临时的高度 , 或保存偏移高度
__height = 0, // 临时的高度,主要保存每个高度
picNum = piclist.size();// 图片的数量
int[] heightArray = new int[picNum]; // 保存每个文件的高度
BufferedImage buffer = null; // 保存图片流
List<int[]> imgRGB = new ArrayList<int[]>(); // 保存所有的图片的RGB
int[] _imgRGB; // 保存一张图片中的RGB数据
for (int i = 0; i < picNum; i++) {
buffer = piclist.get(i);
heightArray[i] = _height = buffer.getHeight();// 图片高度
if (i == 0) {
width = buffer.getWidth();// 图片宽度
}
height += _height; // 获取总高度
_imgRGB = new int[width * _height];// 从图片中读取RGB
_imgRGB = buffer
.getRGB(0, 0, width, _height, _imgRGB, 0, width);
imgRGB.add(_imgRGB);
}
_height = 0; // 设置偏移高度为0
// 生成新图片
BufferedImage imageResult = new BufferedImage(width, height,
BufferedImage.TYPE_INT_BGR);
for (int i = 0; i < picNum; i++) {
__height = heightArray[i];
if (i != 0)
_height += __height; // 计算偏移高度
imageResult.setRGB(0, _height, width, __height, imgRGB.get(i),
0, width); // 写入流中
}
File outFile = new File(outPath);
ByteArrayOutputStream out = new ByteArrayOutputStream();
ImageIO.write(imageResult, "jpg", out);// 写图片
byte[] b = out.toByteArray();
FileOutputStream output = new FileOutputStream(outFile);
output.write(b);
out.close();
output.close();
} catch (Exception e) {
e.printStackTrace();
}
}
}