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,在界面中选择下载。
问题2:只导入fontbox和pdfbox两个包为何会报错?
解答:需要导入commons-logging包,也是Apache的包。提供一些与日志相关的服务。
commons-logging的下载,可以在官网http://commons.apache.org/proper/commons-logging/download\_logging.cgi上下载,点击左侧的download,在界面中选择下载即可。
代码:
/**
* @author 夹心 E-mail: yanjiaxin8410@163.com
* @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参数。
还没有评论,来说两句吧...