maven依赖
<dependency>
<groupId>org.apache.pdfbox</groupId>
<artifactId>pdfbox</artifactId>
<version>2.0.20</version>
</dependency>
PDF2png 工具类
package cn.datang.pdf;
import java.awt.image.BufferedImage;
import java.io.File;
import java.io.IOException;
import java.util.ArrayList;
import java.util.List;
import javax.imageio.ImageIO;
import com.idrsolutions.image.png.PngCompressor;
import org.apache.log4j.LogManager;
import org.apache.log4j.Logger;
import org.apache.pdfbox.pdmodel.PDDocument;
import org.apache.pdfbox.rendering.PDFRenderer;
import cn.hutool.core.img.ImgUtil;
public class PDF2png {
private static Logger logger = LogManager.getLogger(PDF2png.class);
// 可自由确定起始页和终止页
public static void pdf2png(String fileAddress, String filename, int indexOfStart, int indexOfEnd) {
// 将pdf装图片 并且自定义图片得格式大小
File file = new File(fileAddress + "\\" + filename + ".pdf");
try {
PDDocument doc = PDDocument.load(file);
PDFRenderer renderer = new PDFRenderer(doc);
//int pageCount = doc.getNumberOfPages();
for (int i = indexOfStart; i < indexOfEnd; i++) {
BufferedImage image = renderer.renderImageWithDPI(i, 144); // Windows
// native
// DPI
// BufferedImage srcImage = resize(image, 240, 240);//产生缩略图
ImageIO.write(image, "PNG", new File(fileAddress + "\\" + filename + "_" + (i + 1) + ".png"));
}
} catch (IOException e) {
e.printStackTrace();
}
}
// 转换全部的pdf
public static boolean pdf2png(String fileAddress, String filename, String source) {
File file = null;
if ("file".equals(source)) {
file = new File(fileAddress + "\\" + filename);
} else if ("url".equals(source)) {
file = new File(fileAddress);
}
// 将pdf装图片 并且自定义图片得格式大小
if (!file.exists()) {
// logger.error("转换png时源文件不存在:{}", file.getAbsolutePath());
return false;
}
try {
PDDocument doc = PDDocument.load(file);
PDFRenderer renderer = new PDFRenderer(doc);
int pageCount = doc.getNumberOfPages();
for (int i = 0; i < pageCount; i++) {
BufferedImage image = renderer.renderImageWithDPI(i, 144); // Windows
// native
// DPI
// BufferedImage srcImage = resize(image, 240, 240);//产生缩略图
//ImageIO.write(image, "PNG", new File(fileAddress + "\\" + filename + "_" + (i + 1) + ".png"));
if ("file".equals(source)) {
ImageIO.write(image, "PNG", new File(fileAddress + "\\" + filename + "_" + (i + 1) + ".png"));
// logger.info("转换PDF第{}页为图片{}", i + 1, fileAddress + "\\" + filename + "_" + (i + 1) + ".png");
} else if ("url".equals(source)) {
filename = fileAddress.substring(0, fileAddress.lastIndexOf("."));
ImageIO.write(image, "PNG", new File(filename + "_" + (i + 1) + ".png"));
// logger.info("转换PDF第{}页为图片{}", i + 1, filename + "_" + (i + 1) + ".png");
}
}
doc.close();
// logger.info("删除源文件{},{}", file.getAbsolutePath(), file.delete());
return true;
} catch (IOException e) {
logger.error("转换png时源文件异常:" + file.getAbsolutePath(), e);
return false;
}
}
public static boolean pdf2png(File pdfFile) {
// 将pdf装图片 并且自定义图片得格式大小
if (!pdfFile.exists()) {
// logger.error("转换png时源文件不存在:{}", pdfFile.getAbsolutePath());
return false;
}
try {
PDDocument doc = PDDocument.load(pdfFile);
PDFRenderer renderer = new PDFRenderer(doc);
int pageCount = doc.getNumberOfPages();
for (int i = 0; i < pageCount; i++) {
BufferedImage image = renderer.renderImageWithDPI(i, 144); // Windows
String fileAddress = pdfFile.getAbsolutePath();
ImageIO.write(image, "PNG", new File(fileAddress + "_" + (i + 1) + ".png"));
// logger.info("转换PDF第{}页为图片{}", i + 1, fileAddress + "_" + (i + 1) + ".png");
}
doc.close();
// logger.info("删除源文件{},{}", pdfFile.getAbsolutePath(), pdfFile.delete());
return true;
} catch (IOException e) {
logger.error("转换png时源文件异常:" + pdfFile.getAbsolutePath(), e);
return false;
}
}
public static List<String> pdf2png(String fileAddress) throws IOException {
List<String> pngList = new ArrayList<String>();
File file = new File(fileAddress);
// 将pdf装图片 并且自定义图片得格式大小
if (!file.exists()) {
// logger.error("转换png时源文件不存在:{}", file.getAbsolutePath());
return pngList;
}
try {
PDDocument doc = PDDocument.load(file);
PDFRenderer renderer = new PDFRenderer(doc);
int pageCount = doc.getNumberOfPages();
for (int i = 0; i < pageCount; i++) {
BufferedImage image = renderer.renderImageWithDPI(i, 144); // Windows
ImageIO.write(image, "PNG", new File(fileAddress + "_" + (i + 1) + ".png"));
// logger.info("转换PDF第{}页为图片{}", i + 1, fileAddress + "_" + (i + 1) + ".png");
pngList.add(fileAddress + "_" + (i + 1) + ".png");
}
doc.close();
// logger.info("删除源文件{},{}", file.getAbsolutePath(), file.delete());
return pngList;
} catch (IOException e) {
logger.error("转换png时源文件异常:" + file.getAbsolutePath(), e);
throw e;
}
}
public static List<String> pdf2png(String fileAddress, String filename) {
List<String> pngList = new ArrayList<String>();
File file = new File(fileAddress + "/" + filename);
// 将pdf装图片 并且自定义图片得格式大小
if (!file.exists()) {
// logger.error("转换png时源文件不存在:{}", file.getAbsolutePath());
return pngList;
}
try {
PDDocument doc = PDDocument.load(file);
PDFRenderer renderer = new PDFRenderer(doc);
int pageCount = doc.getNumberOfPages();
if (pageCount > 7) {
logger.info("pic more then 7");
return null;
}
String filePath;
for (int i = 0; i < pageCount; i++) {
filePath = fileAddress + "/" + filename + "_" + (i + 1) + ".png";
BufferedImage image = renderer.renderImageWithDPI(i, 144); // Windows
ImageIO.write(image, "PNG", new File(filePath));
// logger.info("转换PDF第{}页为图片{}", i + 1, filePath);
pngList.add(filePath);
}
doc.close();
// logger.info("删除源文件{},{}", file.getAbsolutePath(), file.delete());
return pngList;
} catch (IOException e) {
logger.error("转换png时源文件异常:" + file.getAbsolutePath(), e);
return pngList;
}
}
public static boolean pdf2png(File file, File pngFile) {
// 将pdf装图片 并且自定义图片得格式大小
if (!file.exists()) {
// logger.error("转换png时源文件不存在:{}", file.getAbsolutePath());
return false;
}
try {
PDDocument doc = PDDocument.load(file);
PDFRenderer renderer = new PDFRenderer(doc);
int pageCount = doc.getNumberOfPages();
if (pageCount > 1) {
String path = file.getAbsolutePath();
List<File> fileList = new ArrayList<File>(pageCount);
long fileLength = 0;
for (int i = 0; i < pageCount; i++) {
BufferedImage image = renderer.renderImageWithDPI(i, 144); // Windows
File newFile = new File(path + "_" + (i + 1) + ".png");
ImageIO.write(image, "PNG", newFile);
// logger.info("len={},转换PDF第{}页为图片{}", pageCount, i + 1, newFile.getAbsolutePath());
fileList.add(newFile);
fileLength += newFile.length();
}
// 如果大于1.8M,则只使用第一页的图片
/*if(fileLength > (1024*1024*1.8))
{
fileList.get(0).renameTo(pngFile);
// logger.info("大于1.8M,则只使用第一页的图片,length:{}", fileLength);
fileList.remove(0);
for(File sonFile : fileList)
sonFile.delete();
}
else
{*/
mergeImage(pngFile, fileList);
// logger.info("图片合并:{}", pngFile.getAbsolutePath());
// }
} else {
BufferedImage image = renderer.renderImageWithDPI(0, 144);
ImageIO.write(image, "PNG", pngFile);
// logger.info("len={},转换PDF第1页为图片{}", pageCount, pngFile.getAbsolutePath());
}
doc.close();
// logger.info("删除源文件{},{}", file.getAbsolutePath(), file.delete());
return true;
} catch (IOException e) {
logger.error("转换png时源文件异常:" + file.getAbsolutePath(), e);
return false;
}
}
public static void mergeImage(File targetFile, List<File> tempImgFileList) {
BufferedImage targetImg = null;
try {
targetImg = mergeImage(false, tempImgFileList);
if (targetImg != null)
ImgUtil.write(targetImg, targetFile);
// logger.info("图片合并:{}", targetFile.getAbsolutePath());
} catch (IOException e) {
logger.error("图片合并异常", e);
targetFile.delete();
} finally {
for (File file : tempImgFileList)
file.delete();
}
}
public static BufferedImage mergeImage(boolean isHorizontal, List<File> imgFileList) throws IOException {
if (imgFileList == null || imgFileList.size() < 1) {
logger.warn("图片list长度为0");
return null;
}
List<BufferedImage> bufferedImageList = new ArrayList<>();
for (File file : imgFileList)
bufferedImageList.add(ImgUtil.read(file));
BufferedImage destImage = null;
int sumW = 0, sumH = 0, maxW = 0, maxH = 0;
for (int i = 0; i < bufferedImageList.size(); i++) {
BufferedImage img = bufferedImageList.get(i);
sumW += img.getWidth();
sumH += img.getHeight();
if (img.getWidth() > maxW)
maxW = img.getWidth();
if (img.getHeight() > maxH)
maxH = img.getHeight();
}
if (isHorizontal) {
destImage = new BufferedImage(sumW, maxH, BufferedImage.TYPE_INT_RGB);
} else {
destImage = new BufferedImage(maxW, sumH, BufferedImage.TYPE_INT_RGB);
}
int wx = 0, wy = 0;
for (int j = 0; j < bufferedImageList.size(); j++) {
BufferedImage img = bufferedImageList.get(j);
int w1 = img.getWidth();
int h1 = img.getHeight();
int[] ImageArrayOne = new int[w1 * h1];
ImageArrayOne = img.getRGB(0, 0, w1, h1, ImageArrayOne, 0, w1);
if (isHorizontal) {
destImage.setRGB(wx, 0, w1, h1, ImageArrayOne, 0, w1);
} else {
destImage.setRGB(0, wy, w1, h1, ImageArrayOne, 0, w1);
}
wx += w1;
wy += h1;
}
return destImage;
}
}
新增main方法测试
public static void main(String[] args) throws IOException {
//pdf2png("D:/", "hw.pdf");
String pdfFile = "E:\\data\\项目\\11.pdf";
String outpath = "E:\\data\\项目\\11.PNG";
File f = new File(pdfFile);
File f2 = new File(outpath);
pdf2png(f, f2);
}