java实现pdf转图片

摘要:利用Apache的pdfbox包进行操作,将pdf分成多个png图片。

环境:win10+Eclipse Oxygen+jdk1.8.0

第三方库:


注意:官方的pdfbox有2.0和1.8两种版本之分,在一些API上有差别。类似于Python2和Python3的区别,两者不能通用。我在一开始不了解这个区别,加之一些博客并没有明确说明,造成了很大困扰和时间浪费。本文是用的pdfbox2.0

问题1:fontbox和pdfbox的下载地址。

解答:可以在官网中下载。https://pdfbox.apache.org/download.cgi#20x 百度搜索即可。点击左侧的download,在界面中选择下载。

java实现pdf转图片_第1张图片

问题2:只导入fontbox和pdfbox两个包为何会报错?

解答:需要导入commons-logging包,也是Apache的包。提供一些与日志相关的服务。

commons-logging的下载,可以在官网http://commons.apache.org/proper/commons-logging/download_logging.cgi上下载,点击左侧的download,在界面中选择下载即可。

java实现pdf转图片_第2张图片


代码:

/** 
* @author 夹心 E-mail: [email protected]
* @version 创建时间:2018年5月18日 下午8:57:07 
* 类说明 
*/

import java.awt.image.BufferedImage;
import java.io.File;
import java.io.IOException;
import java.util.Scanner;

import javax.imageio.ImageIO;
import org.apache.pdfbox.pdmodel.PDDocument;
import org.apache.pdfbox.rendering.PDFRenderer;

public class PDF2png {
	
	//可自由确定起始页和终止页
	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 void pdf2png(String fileAddress,String filename) {
		// 将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 = 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"));
					}
				} catch (IOException e) {
					e.printStackTrace();
				}
	}
	
	public static void main(String[] args) {
		Scanner sc = new Scanner(System.in);
		System.out.println("请输入需要转换的pdf的地址,例如 E:\软件\代码:");
		String fileAddress = sc.nextLine();
		System.out.println("请输入需要转换的pdf的名称,不要加.pdf后缀,例如 操作系统概念:");
		String filename =sc.nextLine();
		System.out.println("请输入开始转换的页码,从0开始,例如 5:");
		int indexOfStart=sc.nextInt();
		System.out.println("请输入停止转换的页码,-1为全部,例如 10:");
		int indexOfEnd=sc.nextInt();
		if (indexOfEnd==-1) {
			pdf2png(fileAddress, filename);
		}
		else {
			pdf2png(fileAddress, filename, indexOfStart, indexOfEnd);
		}
		
	}

}

评价:

转换效率还是可以的,基本每秒转换一两张图片的速度。

图片的大小与清晰度和代码中的dpi设置有关,我尝试过96/144/198三个值,发现144比较合适。如果有特殊需求,需要更高清晰度的图片,可以自己手动调高dpi参数。



你可能感兴趣的:(项目实训)