关于文件预览的白嫖实现——Pdf篇

一、前言:

   小菜鸟最近在项目中遇到了一个关于文件预览的难题,要求要支持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,希望能帮助到你~

  • 1
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 2
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值