一、PDFBOX的8个作用:
1、提取文字:
提取pdf中的Unicode 文本
2、分割和合并PDF
分割单个PDF为多个PDF或者是合并多个PDF为一个DPF
3、填充PDF里面的表单
提取PDF表单内容或填充PDF表单
4、印前检查
根据PDF/A-1b标准,校验PDF文件。
5、打印PDF
通过JAVA的API打印PDF文件。
6、图片转换
把PDF文件转成PNG或JPEG格式的图片
7、创建PDF文件
从零开始创建PDF文件,往里面嵌入文字和图片
8、签名
二、pdf 转 png图片实现
pom依赖
<!--使用开源库Apache PDFBox将PDF转换为图片-->
<dependency>
<groupId>org.apache.pdfbox</groupId>
<artifactId>fontbox</artifactId>
<version>2.0.24</version>
</dependency>
<dependency>
<groupId>org.apache.pdfbox</groupId>
<artifactId>pdfbox</artifactId>
<version>2.0.24</version>
</dependency>
import org.apache.pdfbox.pdmodel.PDDocument;
import org.apache.pdfbox.rendering.PDFRenderer;
import javax.imageio.ImageIO;
import java.awt.*;
import java.awt.image.BufferedImage;
import java.io.File;
import java.io.IOException;
/**
* 使用pdfbox将整个pdf转换成图片
* 多页pdf会生成多页的图片,后缀会生成图片的位置序号
* @param fileAddress 文件地址 如:D:/mnt/pdffile
* @param filename PDF文件名不带后缀名 testFile
* @param imgType 图片类型 PNG 和 JPG
* @param dpi dpi越大转换后越清晰,相对转换速度越慢
*/
public static void pdfToPngOne(String fileAddress, String filename, String imgType, Integer dpi) {
long startTime = System.currentTimeMillis();
// 将文件地址和文件名拼接成路径
File file = new File(fileAddress + File.separator + filename + ".pdf");
String imgFileName = "";
String imgFilePath = "";
PDDocument pdDocument = null;
try {
// 写入文件
pdDocument = PDDocument.load(file);
PDFRenderer renderer = new PDFRenderer(pdDocument);
int pageCount = pdDocument.getNumberOfPages();
// 遍历把每页pdf转换为图片
for (int pageNum = 0; pageNum < pageCount; pageNum++) {
imgFileName = filename + "_" + (pageNum + 1) + "." + imgType;
imgFilePath = fileAddress + File.separator + imgFileName;
// BufferedImage image = renderer.renderImage(i, 2.5f);
// dpi为130,越高越清晰,转换越慢
BufferedImage imageB = renderer.renderImageWithDPI(pageNum, dpi); // Windows native DPI
// 将图片写出到该路径下
ImageIO.write(imageB, imgType, new File(imgFilePath));
}
long endTime = System.currentTimeMillis();
System.out.println("共耗时:" + ((endTime - startTime) / 1000.0) + "秒"); //转化用时
} catch (IOException e) {
e.printStackTrace();
}finally {
try {
// 需要关闭PDDocument,不关闭会出现想要删除pdf文件时会提示文件正在使用,无法删除的情况
pdDocument.close();
} catch (IOException e) {
e.printStackTrace();
}
}
}
/**
* 自定义转换pdf起始页和终止页
* 多页pdf会生成多页的图片,后缀会生成图片的位置序号
* @param fileAddress 文件地址 如:D:/mnt/pdffile
* @param filename PDF文件名不带后缀名 testFile
* @param indexOfStart 开始页 开始转换的页码,从0开始
* @param indexOfEnd 结束页 停止转换的页码,-1为全部
* @param imgType 图片类型 PNG 和 JPG
* @param dpi dpi越大转换后越清晰,相对转换速度越慢
*/
public static void pdfTopngTwo(String fileAddress, String filename, int indexOfStart, int indexOfEnd, String imgType, Integer dpi) {
long startTime = System.currentTimeMillis();
// 将文件地址和文件名拼接成路径
File file = new File(fileAddress + File.separator + filename+".pdf");
String imgFileName = "";
String imgFilePath = "";
PDDocument pdDocument = null;
try {
pdDocument = PDDocument.load(file);
PDFRenderer renderer = new PDFRenderer(pdDocument);
int pageCount = pdDocument.getNumberOfPages();
for (int pageNum = indexOfStart; pageNum < indexOfEnd; pageNum++) {
if(indexOfStart < pageCount){
imgFileName = filename + "_" + (pageNum + 1) + "." + imgType;
imgFilePath = fileAddress + File.separator + imgFileName;
// BufferedImage image = renderer.renderImage(i, 2.5f);
// dpi为130,越高越清晰,转换越慢
BufferedImage imageB = renderer.renderImageWithDPI(pageNum, dpi); // Windows native DPI
// 将图片写出到该路径下
ImageIO.write(imageB, imgType, new File(imgFilePath));
}
}
long endTime = System.currentTimeMillis();
System.out.println("共耗时:" + ((endTime - startTime) / 1000.0) + "秒"); // 转换用时
} catch (IOException e) {
e.printStackTrace();
}
}
/**
* 使用pdfbox将整个pdf转换成图片,生成一张长图
* @param fileAddress 文件地址 如:D:/mnt/pdffile
* @param filename PDF文件名不带后缀名 testFile
* @param imgType 图片类型 PNG 和 JPG
* @param dpi dpi越大转换后越清晰,相对转换速度越慢
*/
public static void pdfToPngThree(String fileAddress, String filename, String imgType, Integer dpi) {
long startTime = System.currentTimeMillis();
// 将文件地址和文件名拼接成路径
File file = new File(fileAddress + File.separator + filename + ".pdf");
PDDocument pdDocument = null;
try {
// 写入文件
pdDocument = PDDocument.load(file);
PDFRenderer renderer = new PDFRenderer(pdDocument);
int pageCount = pdDocument.getNumberOfPages();
BufferedImage combined = null;
// 遍历把pdf转换为图片
for (int pageNum = 0; pageNum < pageCount; pageNum++) {
// BufferedImage image = renderer.renderImage(i, 2.5f);
// dpi为130,越高越清晰,转换越慢
BufferedImage imageB = renderer.renderImageWithDPI(pageNum, dpi); // Windows native DPI
if (pageNum == 0) {
combined = imageB;
} else {
combined = mergeImage(combined, imageB);
}
}
// 输出生成图片
ImageIO.write(combined, imgType, new File(fileAddress + File.separator + filename+"."+imgType));
long endTime = System.currentTimeMillis();
System.out.println("共耗时:" + ((endTime - startTime) / 1000.0) + "秒"); //转化用时
} catch (IOException e) {
e.printStackTrace();
}finally {
try {
// 需要关闭PDDocument,不关闭会出现想要删除pdf文件时会提示文件正在使用,无法删除的情况
pdDocument.close();
} catch (IOException e) {
e.printStackTrace();
}
}
}
/**
* 合并两张图片流
* @param imageOne 图片1
* @param imageTwo 图片2
* @return
*/
private static BufferedImage mergeImage(BufferedImage imageOne, BufferedImage imageTwo) {
BufferedImage combined = new BufferedImage(
imageOne.getWidth(),
imageOne.getHeight() + imageTwo.getHeight(),
BufferedImage.TYPE_INT_RGB);
Graphics g = combined.getGraphics();
g.drawImage(imageOne, 0, 0, null);
g.drawImage(imageTwo, 0, imageOne.getHeight(), null);
g.dispose();
return combined;
}
public static void main(String[] args) {
// 多页pdf生成多页的图片,多页pdf会生成多页的图片,后缀会生成图片的位置序号
pdfToPngOne("D:/mnt/pdffile", "testFile", "PNG", 130);
// 多页pdf会生成多页的图片,自定义转换pdf起始页和终止页
pdfTopngTwo("D:/mnt/pdffile", "testFile", 2, 5, "PNG", 130);
// 使用pdfbox将整个pdf转换成图片,生成一张长图
pdfToPngThree("D:/mnt/pdffile", "testFile", "PNG", 130);
}