一、前言:
小菜鸟最近在项目中遇到了一个关于文件预览的难题,要求要支持pdf,ppt,word,txt四种格式。
这个功能吧,现在回顾起来真的有点曲折,从确定实现方案将所有的文件都转存为图片的格式以实现预览,到技术选型,本来想用一个技术去实现所有就好了。
于是百度,尝试,百度,尝试。找到了两个可行的方案,一个是aspose,一个是openOffice。可是领导又说了aspose是收费的,花钱的方案可不行,下一个。 然后,又找到了openOffice开源免费,可行。领导又说了,项目是以docker镜像方式多节点部署的,安装部署openOffice太麻烦了,我 :-( 。。。 于是,决定拆开来做。
首先,实现的是pdf转图片。
二、PDF转图片:
实现技术:pdfBox、Itext
1.依赖:
<!-- pdf转图片-->
<!-- https://mvnrepository.com/artifact/org.apache.pdfbox/pdfbox -->
<dependency>
<groupId>org.apache.pdfbox</groupId>
<artifactId>pdfbox</artifactId>
<version>2.0.21</version>
</dependency>
<dependency>
<groupId>com.lowagie</groupId>
<artifactId>itext</artifactId>
<version>2.1.7</version>
</dependency>
2.代码
import com.lowagie.text.pdf.PdfReader;
import org.apache.pdfbox.pdmodel.PDDocument;
import org.apache.pdfbox.rendering.PDFRenderer;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import javax.imageio.ImageIO;
import java.awt.image.BufferedImage;
import java.io.File;
import java.util.ArrayList;
import java.util.List;
import java.util.UUID;
public class Pdf2ImageUtil {
private static final float DEFALUT_DPI = 105;
private static final Logger logger = LoggerFactory.getLogger(Pdf2ImageUtil.class);
public static List<File> pdf2Image(File file, String dstImgFolder) {
List<File> files = new ArrayList<>();
String filename = file.getName();
//文件类型检测
if (filename.contains(".") ) {
String suffix = filename.substring(filename.lastIndexOf(".")).toLowerCase();
if (!".pdf".equals(suffix)) {
logger.error("PDF文档转PNG图片失败:{}","文件格式不对");
}
}
PDDocument pdDocument;
try {
String imgPDFPath = file.getParent();
int dot = file.getName().lastIndexOf('.');
String imagePDFName = file.getName().substring(0, dot); // 获取图片文件名
String imgFolderPath = null;
if (dstImgFolder.equals("")) {
imgFolderPath = imgPDFPath + File.separator + UUID.randomUUID().toString();// 获取图片存放的文件夹路径
} else {
imgFolderPath = dstImgFolder + File.separator + UUID.randomUUID().toString();
}
if (FileUtil.createDirectory(imgFolderPath)) {
pdDocument = PDDocument.load(file);
PDFRenderer renderer = new PDFRenderer(pdDocument);
/* dpi越大转换后越清晰,相对转换速度越慢 */
PdfReader reader = new PdfReader(file.getAbsolutePath());
int pages = reader.getNumberOfPages();
StringBuilder imgFilePath = null;
for (int i = 0; i < pages; i++) {
String imgFilePathPrefix = imgFolderPath + File.separator + imagePDFName;
imgFilePath = new StringBuilder();
imgFilePath.append(imgFilePathPrefix);
imgFilePath.append("_");
imgFilePath.append(String.valueOf(i + 1));
imgFilePath.append(".png");
File dstFile = new File(imgFilePath.toString());
BufferedImage image = renderer.renderImageWithDPI(i, DEFALUT_DPI);
ImageIO.write(image, "png", dstFile);
files.add(new File(imgFilePath.toString()));
}
logger.info("PDF文档转PNG图片成功!");
return files;
} else {
logger.error("PDF文档转PNG图片失败:创建{}失败", imgFolderPath);
}
} catch (Exception e) {
boolean flag = FileUtil.deleteDirectory(dstImgFolder);
if (!flag) {
logger.error("PDF文档转PNG图片失败: err:{}", "删除文件夹失败");
}
logger.error("PDF文档转PNG图片失败: err:{}", e.getMessage());
}
return new ArrayList<>();
}
}
三、总结
PDF转图片实现的效果很好,也不复杂,非常好,PDFBox很Nice,希望能帮助到你~