package wuxu.test;
import java.awt.image.BufferedImage;
import java.io.File;
import java.io.IOException;
import java.net.URL;
import java.util.ArrayList;
import java.util.List;
import java.util.Objects;
import javax.imageio.ImageIO;
import org.apache.commons.io.FileUtils;
import org.apache.pdfbox.Loader;
import org.apache.pdfbox.pdmodel.PDDocument;
import org.apache.pdfbox.rendering.ImageType;
import org.apache.pdfbox.rendering.PDFRenderer;
import org.apache.pdfbox.tools.imageio.ImageIOUtil;
/**
* pdf 工具类
*
* @author AnJia
* @since 2021-09-09 16:05
*/
public class Pdf3Png2 {
public static void main(String [] args) throws IOException{
// pdf转换成单张图片
convertPdf2Image("D:\\1234\\123.pdf", "D:\\", "sample.png");
// pdf转换成多张
//convertPdf2Images("https://file-examples-com.github.io/uploads/2017/10/file-sample_150kB.pdf", System.getProperty("java.io.tmpdir") + "anjia", "sample.png");
}
/**
* 将pdf转成一张图片,如果要输出的文件已经存在,则不会进行转换
*
* @param url pdf url
* @param fileName 文件名带png后缀,例如 xxxx.png
* @param dir 存放文件夹,如果不存在会自动创建
* @return 文件,如果报错,则会返回null
* @throws IOException 文件下载失败
*/
public static File convertPdf2Image(String url, String dir, String fileName) throws IOException {
/* File pdfFile = new File(new File(dir).getAbsolutePath() + File.separator + fileName + ".pdf");
pdfFile.getParentFile().mkdirs();
FileUtils.copyURLToFile(new URL(url), pdfFile);*/
File pdfFile = new File(url);
return convertPdf2Image(pdfFile, dir, fileName);
}
/**
* 将pdf转成一张图片,如果要输出的文件已经存在,则不会进行转换
*
* @param pdfFile pdf 文件
* @param fileName 文件名带png后缀,例如 xxxx.png
* @param dir 存放文件夹,如果不存在会自动创建
* @return 文件,如果报错,则会返回null
*/
public static File convertPdf2Image(File pdfFile, String dir, String fileName) {
File pngFile = new File(new File(dir).getAbsolutePath() + File.separator + fileName);
if (pngFile.exists()) {
return pngFile;
}
try (final PDDocument document = Loader.loadPDF(pdfFile)) {
PDFRenderer pdfRenderer = new PDFRenderer(document);
// 不知道图片的宽和高,所以先定义个null
BufferedImage pdfImage = null;
// pdf有多少页
int pageSize = document.getNumberOfPages();
int y = 0;
for (int i = 0; i < pageSize; ++i) {
// 每页pdf内容
BufferedImage bim = pdfRenderer.renderImageWithDPI(i, 180, ImageType.RGB);
// 如果是第一页需要初始化 BufferedImage
if (Objects.isNull(pdfImage)) {
System.out.print(bim.getWidth());
// 假设每页一样宽,一样高,高度就是每页高度*总页数
pdfImage = new BufferedImage(bim.getWidth(),
bim.getHeight() * pageSize, BufferedImage.TYPE_INT_ARGB);
}
// 将每页pdf画到总的pdfImage上,x坐标=0,y坐标=之前所有页的高度和
pdfImage.getGraphics().drawImage(bim, 0, y, null);
y += bim.getHeight();
}
assert pdfImage != null;
ImageIO.write(pdfImage, "png", pngFile);
return pngFile;
} catch (Exception ex) {
//log.error("pdf转换png失败", ex);
System.out.print("失败" + ex + "meaage:" + ex.getMessage());
}
return null;
}
/**
* 将pdf转换成多张图片(1页pdf转换成1张图片),如果要输出的图片已经存在,则不会进行转换
*
* @param url pdf url
* @param dir 存放目录
* @param baseFileName pdf文件名
* @return 如果转换成功会返回 图片文件list,如果失败会返回null
* @throws IOException 下载文件失败
*/
public static List<File> convertPdf2Images(String url, String dir, String baseFileName) throws IOException {
File pdfFile = new File(dir + File.separator + baseFileName + ".pdf");
pdfFile.getParentFile().mkdirs();
FileUtils.copyURLToFile(new URL(url), pdfFile);
return convertPdf2Images(pdfFile, dir, baseFileName);
}
/**
* 将pdf转换成多张图片(1页pdf转换成1张图片),如果要输出的图片已经存在,则不会进行转换
*
* @param pdfFile pdf 文件
* @param dir 存放目录
* @param baseFileName pdf文件名
* @return 如果转换成功会返回 图片文件list,如果失败会返回null
*/
public static List<File> convertPdf2Images(File pdfFile, String dir, String baseFileName) {
List<File> images = null;
File directory = new File(dir);
directory.mkdirs();
try (final PDDocument document = Loader.loadPDF(pdfFile)) {
PDFRenderer pdfRenderer = new PDFRenderer(document);
// pdf有多少页
int pageSize = document.getNumberOfPages();
images = new ArrayList<>(pageSize);
File pageFile;
for (int i = 0; i < pageSize; ++i) {
pageFile = new File(String.format("%s%s%s-%s.png", directory.getAbsolutePath(), File.separator, baseFileName, i));
if (pageFile.exists()) {
continue;
}
BufferedImage bim = pdfRenderer.renderImageWithDPI(i, 300, ImageType.RGB);
ImageIOUtil.writeImage(bim, pageFile.getAbsolutePath(), 300);
images.add(pageFile);
}
} catch (Exception ex) {
//log.error("pdf转换png失败", ex);
System.out.print("失败" + ex);
}
return images;
}
}