Java 利用pdfbox根据PDF画布大小动态转为图片
每篇一句励志:你若不想做,会找到一个借口;你若想做,会找到一个方法
pom引入
<dependency>
<groupId>net.sf.cssbox</groupId>
<artifactId>pdf2dom</artifactId>
<version>1.7</version>
</dependency>
<dependency>
<groupId>com.lowagie</groupId>
<artifactId>itext</artifactId>
<version>2.1.7</version>
</dependency>
<dependency>
<groupId>org.apache.pdfbox</groupId>
<artifactId>pdfbox</artifactId>
<version>2.0.24</version>
</dependency>
<dependency>
<groupId>org.apache.pdfbox</groupId>
<artifactId>pdfbox-tools</artifactId>
<version>2.0.24</version>
</dependency>
工具类代码
根据PDF每页的宽高动态创建画布来生成一张长图。
/***
* PDF文件转PNG图片,全部页数转成一张图
* @param pdfFilePath pdf完整路径:C:\\Users\\user\\Desktop\\test\\1234.pdf
*/
public static void pdf2ImageToFilePath(String pdfFilePath){
try {
long startTime = System.currentTimeMillis();
// 加载PDF文档
File pdfFile = new File(pdfFilePath);
String imgPdfPath = pdfFile.getParent();
int dot = pdfFile.getName().lastIndexOf('.');
// 获取图片文件名
String imagePdfName = pdfFile.getName().substring(0, dot);
PDDocument document = PDDocument.load(pdfFile);
PDFRenderer renderer = new PDFRenderer(document);
// 假定每页PDF的宽度和高度是相同的,获取第一页的尺寸作为参考
BufferedImage firstPageImage = renderer.renderImageWithDPI(0, 300, ImageType.RGB);
int width = firstPageImage.getWidth();
int height = firstPageImage.getHeight();
// 创建一个足够大的画布以容纳所有页面的图片
BufferedImage combinedImage = new BufferedImage(width, height * document.getNumberOfPages(), BufferedImage.TYPE_INT_RGB);
Graphics2D g2 = combinedImage.createGraphics();
// 设置背景色为白色
g2.setColor(Color.WHITE);
g2.fillRect(0, 0, combinedImage.getWidth(), combinedImage.getHeight());
// 循环遍历文档中的每一页,渲染后绘制到总画布上
for (int i = 0; i < document.getNumberOfPages(); i++) {
BufferedImage pageImage = renderer.renderImageWithDPI(i, 300, ImageType.RGB);
// 将当前页面的图片绘制到总画布上的适当位置
g2.drawImage(pageImage, 0, height * i, null);
}
String imgFilePathPrefix = imgPdfPath + File.separator + imagePdfName+".png";
g2.dispose(); // 完成绘制
File dstFile = new File(imgFilePathPrefix);
// 将合成后的图片保存为文件
ImageIO.write(combinedImage, "png", dstFile);
// 关闭文档
document.close();
long endTime = System.currentTimeMillis();
System.out.println("共耗时:" + ((endTime - startTime) / 1000.0) + "秒"); //转化用时
} catch (IOException e) {
e.printStackTrace();
}
}