前言
前几天朋友找我帮忙,需要将一个pdf文件文件拆成图片,每页也需要拆分为3张图片(每页的数据比较规范,分为三段),刚开始试着找找有啥工具没有,找了一圈发现能转化也是按照每一页转化为一张图片,并不能实现将一页转化为多张图片。昨天突然灵机一闪,试试代码操作试试,还真给拆分好了。O(∩_∩)O
每页大概都是这样的布局。
将PDF文件转为图片
该功能只能将pdf文件的每一页拆分为一张图片。参考
pdf操作需要引用jar包
<dependency>
<groupId>org.apache.pdfbox</groupId>
<artifactId>fontbox</artifactId>
<version>2.0.9</version>
</dependency>
<!-- https://mvnrepository.com/artifact/org.apache.pdfbox/pdfbox -->
<dependency>
<groupId>org.apache.pdfbox</groupId>
<artifactId>pdfbox</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>
核心代码
package pdf;
import org.apache.pdfbox.pdmodel.PDDocument;
import org.apache.pdfbox.rendering.PDFRenderer;
import javax.imageio.ImageIO;
import java.awt.image.BufferedImage;
import java.io.File;
import java.io.IOException;
/**
* PDF 转图片工具类
*/
public class Pdf2Png {
/**
* 使用pdfbox将整个pdf转换成图片
*
* @param filePathName 文件全路径+文件
* @param newPath 拆分页之后的路径
* @param newNamePrefix 拆分后图片路径
* @param type 图片类型
*/
public static void pdf2png(String filePathName, String newPath, String newNamePrefix, String type) {
long startTime = System.currentTimeMillis();
// 将文件地址和文件名拼接成路径 注意:线上环境不能使用\\拼接
File file = new File(filePathName);
try {
// 写入文件
PDDocument doc = PDDocument.load(file);
PDFRenderer renderer = new PDFRenderer(doc);
int pageCount = doc.getNumberOfPages();
for (int i = 0; i < pageCount; i++) {
// dpi为144,越高越清晰,转换越慢
BufferedImage image = renderer.renderImageWithDPI(i, 144); // Windows native DPI
// 将图片写出到该路径下
ImageIO.write(image, type, new File(newPath + newNamePrefix + (i + 1) + "." + type));
System.out.println("第 " + i + " 页拆分完成 ");
}
long endTime = System.currentTimeMillis();
System.out.println("拆页共耗时:" + ((endTime - startTime) / 1000.0) + "秒"); //转化用时
} catch (IOException e) {
e.printStackTrace();
}
}
}
拆分图片
将每页图片拆分为3张图片。参考
这里拆分是按照像素拆分的,具体像素需要根据原图片来定,可以根据windows自带的画图工具就可以查看图片像素,并且可以定位像素坐标
核心代码【使用java原生类】
package pdf;
import javax.imageio.ImageIO;
import java.awt.image.BufferedImage;
import java.io.File;
import java.io.IOException;
/**
* 拆图片工具类
*/
public class CatPicUtils {
/**
* 拆图片
*
* @param metaPath 图片路劲
* @param newPath 新路径
* @param type 图片类型
*/
public static void splitPage(String metaPath, String newPath, String type) {
long startTime = System.currentTimeMillis();
// 获取所有拆分的图片
File[] files = new File(metaPath).listFiles();
// 遍历拆图
try {
for (File file : files) {
String fileName = file.getName();
String name = fileName.substring(0, fileName.length() - type.length() - 1);
BufferedImage image = null;
image = (BufferedImage) ImageIO.read(file);
BufferedImage cat1 = cat(0, 0, 1190, 540, image);
ImageIO.write(cat1, type, new File(newPath + name + "_1." + type));//分割后的图片位置
System.out.println(fileName + " 第 1 张拆分完成");
BufferedImage cat2 = cat(0, 570, 1190, 540, image);
ImageIO.write(cat2, type, new File(newPath + name + "_2." + type));//分割后的图片位置
System.out.println(fileName + " 第 2 张拆分完成");
BufferedImage cat3 = cat(0, 1130, 1190, 540, image);
ImageIO.write(cat3, type, new File(newPath + name + "_3." + type));//分割后的图片位置
System.out.println(fileName + " 第 3 张拆分完成");
}
} catch (IOException e) {
e.printStackTrace();
}
long endTime = System.currentTimeMillis();
System.out.println("拆图共耗时:" + ((endTime - startTime) / 1000.0) + "秒"); //转化用时
}
public static BufferedImage cat(int x, int y, int wight, int hight, BufferedImage img) {
int[] simgRgb = new int[wight * hight];
img.getRGB(x, y, wight, hight, simgRgb, 0, wight);
BufferedImage newImage = new BufferedImage(wight, hight, BufferedImage.TYPE_INT_ARGB);
newImage.setRGB(0, 0, wight, hight, simgRgb, 0, wight);
return newImage;
}
}
测试
package pdf;
public class ExecMain {
public static void main(String[] args) {
// 操作路径
String path = "D:\\pdf\\0401\\";
// 需要被拆分的文件
String filePathName = path + "原文件\\XXX.pdf";
// 拆分之后的路径
String newPath = path + "拆页\\";
// 最终文件夹【将每页文件拆分为多张图片路径】
String splitPagePic = path + "切分\\";
// 拆分之后图片前缀
String newNamePrefix = "page_";
// 拆分之后图片后缀
String type = "png";
// 执行拆分页
Pdf2Png.pdf2png(filePathName, newPath, newNamePrefix, type);
// 执行拆图片
CatPicUtils.splitPage(newPath, splitPagePic, type);
}
}
拆页效果
命名格式为 page_原pdf文件第i页.png
拆图效果
命名格式为 page_第i页_第j张.png,可以根据图片名称快速定位到原pdf文件所在位置
参考博客
https://blog.csdn.net/qq_44753710/article/details/129294624
https://blog.csdn.net/weixin_48927623/article/details/118110101