目录
pom文件
<!-- https://mvnrepository.com/artifact/org.apache.pdfbox/pdfbox --> <dependency> <groupId>org.apache.pdfbox</groupId> <artifactId>pdfbox</artifactId> <version>2.0.28</version> </dependency><!--hutool工具--> <dependency> <groupId>cn.hutool</groupId> <artifactId>hutool-all</artifactId> <version>5.8.19</version> </dependency>
工具类
import cn.hutool.core.date.DateUtil;
import lombok.extern.slf4j.Slf4j;
import org.apache.pdfbox.pdmodel.PDDocument;
import org.apache.pdfbox.rendering.PDFRenderer;
import javax.imageio.ImageIO;
import java.awt.image.BufferedImage;
import java.io.ByteArrayInputStream;
import java.io.ByteArrayOutputStream;
import java.io.File;
import java.io.IOException;
import java.util.ArrayList;
import java.util.Calendar;
import java.util.List;
/**
* @描述:
* @Date: 2023/6/3 15:05
* @Description: // PC002
* @Author: Duys
**/
@Slf4j
public class PdfToImageUtil {
/**
* dpi越大转换后越清晰,相对转换速度越慢
*/
private static final Integer DPI = 100;
/**
* 转换后的图片类型
*/
private static final String IMG_TYPE = "jpg";
/**
* PDF转图片
*
* @param fileContent PDF文件的二进制流
* @return 图片文件的二进制流
*/
public static List<byte[]> pdfToImage(byte[] fileContent) throws IOException {
List<byte[]> result = new ArrayList<>();
try (PDDocument document = PDDocument.load(fileContent)) {
PDFRenderer renderer = new PDFRenderer(document);
for (int i = 0; i < document.getNumberOfPages(); ++i) {
BufferedImage bufferedImage = renderer.renderImageWithDPI(i, DPI);
ByteArrayOutputStream out = new ByteArrayOutputStream();
ImageIO.write(bufferedImage, IMG_TYPE, out);
result.add(out.toByteArray());
}
}
return result;
}
/**
* PDF转图片
*
* @param fileContent PDF文件的二进制流
* @return 图片文件的二进制流
*/
public static byte[] pdfToImage2(byte[] fileContent) throws IOException {
byte[] result = null;
try (PDDocument document = PDDocument.load(fileContent)) {
PDFRenderer renderer = new PDFRenderer(document);
BufferedImage bufferedImage = renderer.renderImageWithDPI(0, DPI);
ByteArrayOutputStream out = new ByteArrayOutputStream();
ImageIO.write(bufferedImage, IMG_TYPE, out);
result = out.toByteArray();
}
return result;
}
/**
* @param imageBytes: 二进制数据
* @param savePath: 保存的路径
* @param imageName: 报告名称
* @描述:
**/
public static Boolean saveImage(byte[] imageBytes, String savePath, String imageName) throws IOException {
try {
BufferedImage image = ImageIO.read(new ByteArrayInputStream(imageBytes));
File directory = new File(savePath);
if (!directory.exists()) {
directory.mkdirs();
}
File outputFile = new File(directory, imageName);
return ImageIO.write(image, "jpg", outputFile);
} catch (Exception e) {
log.error("保存图片报错", e);
return false;
}
}
public static String createDateDir(String basePath) throws Exception {
String dayStr = DateUtil.format(DateUtil.date(Calendar.getInstance()), "yyyy-MM-dd");
String[] dayArr = dayStr.split("-");
String year = dayArr[0];
String month = dayArr[1];
String day = dayArr[2];
String yearDir = basePath + File.separator + year;
File yearFile = new File(yearDir);
if (!yearFile.exists()) {
yearFile.mkdirs();
}
String monthDir = yearDir + File.separator + month;
File monthFile = new File(monthDir);
if (!monthFile.exists()) {
monthFile.mkdirs();
}
String dayDir = monthDir + File.separator + day;
File dayFile = new File(dayDir);
if (!dayFile.exists()) {
dayFile.mkdirs();
}
//2020\10\15\
return year + File.separator + month + File.separator + day + File.separator;
}
}
测试代码
public static void main(String[] args) throws IOException { byte[] pdfBytes = HttpUtil.downloadBytes("http://127.0.0.1:8080/static/123.pdf"); byte[] imgBytes = PdfToImageUtil.pdfToImage2(pdfBytes); String savePath = "D:\\jfapp\\pdf"; String imageName = "12121313.jpg"; try { //saveImage(imgBytes, savePath, imageName); String path = createDateDir(savePath.concat("/pdf")); PdfToImageUtil.saveImage(imgBytes, savePath.concat("\\pdf\\").concat(path), "123.jpg"); } catch (Exception e) { e.printStackTrace(); } }
该代码示例展示了如何利用ApachePDFBox库和Hutool工具包将PDF文档的每一页转换为JPEG图片,同时提供了调整DPI以控制图片质量的功能。转换后的图片以二进制流的形式存储,并可进一步保存到本地文件系统。
585





