栏目分类:
子分类:
返回
名师互学网用户登录
快速导航关闭
当前搜索
当前分类
子分类
实用工具
热门搜索
名师互学网 > IT > 软件开发 > 后端开发 > Java

Java实现pdf转图片

Java 更新时间: 发布时间: IT归档 最新发布 模块sitemap 名妆网 法律咨询 聚返吧 英语巴士网 伯小乐 网商动力

Java实现pdf转图片

提示:文章写完后,目录可以自动生成,如何生成可参考右边的帮助文档

文章目录
  • 前言
  • 一、依赖JAR
  • 二、代码工具类
  • 三、main测试
  • 总结


前言 ## Java实现pdf转图片 ** 置顶@@@

提示:以下是本篇文章正文内容,下面案例可供参考

一、依赖JAR

        
            com.itextpdf
            itextpdf
            5.4.2
        
        
            org.apache.pdfbox
            pdfbox
            2.0.15
        
        
            org.apache.pdfbox
            fontbox
            2.0.15
        
二、代码工具类
package com.example.demo.utils;

import com.google.common.collect.Maps;
import org.apache.pdfbox.pdmodel.PDdocument;
import org.apache.pdfbox.rendering.ImageType;
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.io.IOException;
import java.util.ArrayList;
import java.util.List;
import java.util.Map;
import java.util.Objects;

public class PDFToImage {
    private static final Logger LOGGER = LoggerFactory.getLogger(PDFToImage.class);

    
    public static List pdfToImagePaths(String filePath, String savePath, String subStr) {
        List list = new ArrayList<>();
        String fileDirectory = filePath.substring(0, filePath.lastIndexOf("."));
        String imagePath;
        File file = new File(filePath);
        try {
            File f = new File(fileDirectory);
            if (!f.exists()) {
                f.mkdir();
            }
            PDdocument doc = PDdocument.load(file);
            PDFRenderer renderer = new PDFRenderer(doc);
            int pageCount = doc.getNumberOfPages();
            
            for (int i = 0; i < pageCount; i++) {
                //方式2,第二个参数是设置缩放比(即像素) 第二个参数越大生成图片分辨率越高,转换时间也就越长
                BufferedImage image = renderer.renderImage(i, 1.25f);
                imagePath = savePath + File.separator + subStr + "-" + i + ".jpg";
                ImageIO.write(image, "PNG", new File(imagePath));
                list.add(imagePath);
            }
        } catch (Exception e) {
            LOGGER.error(e.getMessage());
        }
        return list;
    }

    
    public static void pdfMultiImage(String pdfFile, String outpath) {
        try {
            ArrayList piclist = new ArrayList<>();
            File file = new File(pdfFile);
            PDdocument doc = PDdocument.load(file);
            //pdfbox 1.8
            
            //pdfbox2.0以后
            int pages = doc.getNumberOfPages();
            //分辨率
            int dpi = 200;
            for (int i = 0; i < pages; i++) {
                BufferedImage image = new PDFRenderer(doc).renderImageWithDPI(i, dpi, ImageType.RGB);
                piclist.add(image);
            }
            yPic(piclist, outpath);
        } catch (IOException e) {
            LOGGER.error(e.getMessage());
        }
    }

    
    private static void pdf2multiImage(String pdfFile, String outpath, int maxPage) {
        //try {
        //    InputStream is = new FileInputStream(pdfFile);
        //    PDdocument pdf = PDdocument.load(is, true);
        //    List pages = pdf.getdocumentCatalog().getAllPages();
        //    List piclist = new ArrayList();
        //    // pdf中实际的页数
        //    int actSize = pages.size();
        //    if (actSize < maxPage) {
        //        maxPage = actSize;
        //    }
        //    for (int i = 0; i < maxPage; i++) {
        //        piclist.add(pages.get(i).convertToImage());
        //    }
        //    yPic(piclist, outpath);
        //    is.close();
        //} catch (IOException e) {
        //    e.printStackTrace();
        //}
    }

    
    public static void yPic(List piclist, String outPath) {
        if (piclist == null || piclist.size() <= 0) {
            LOGGER.error("图片数组为空!");
            return;
        }
        try {
            // 总高度,总宽度 ,临时的高度 , 或保存偏移高度,临时的高度,主要保存每个高度,图片的数量
            int height = 0, width = 0, _height, __height, picNum = piclist.size();
            // 保存每个文件的高度
            int[] heightArray = new int[picNum];
            // 保存图片流
            BufferedImage buffer;
            // 保存所有的图片的RGB
            List imgRgb = new ArrayList<>();
            // 保存一张图片中的RGB数据
            int[] _imgRGB;
            for (int i = 0; i < picNum; i++) {
                buffer = piclist.get(i);
                // 图片高度
                heightArray[i] = _height = buffer.getHeight();
                if (i == 0) {
                    // 图片宽度
                    width = buffer.getWidth();
                }
                // 获取总高度
                height += _height;
                // 从图片中读取RGB
                _imgRGB = new int[width * _height];
                _imgRGB = buffer.getRGB(0, 0, width, _height, _imgRGB, 0, width);
                imgRgb.add(_imgRGB);
            }
            // 设置偏移高度为0
            _height = 0;
            // 生成新图片
            BufferedImage imageResult = new BufferedImage(width, height, BufferedImage.TYPE_INT_RGB);
            for (int i = 0; i < picNum; i++) {
                __height = heightArray[i];
                // 计算偏移高度
                if (i != 0) {
                    _height += __height;
                }
                imageResult.setRGB(0, _height, width, __height, imgRgb.get(i), 0, width);
            }
            File outFile = new File(outPath);
            // 写图片
            ImageIO.write(imageResult, "jpg", outFile);
        } catch (Exception e) {
            LOGGER.error(e.getMessage());
        }
    }

    
    public static ArrayList getDirPathFiles(String path) {
        ArrayList files = new ArrayList<>();
        Map map = Maps.newHashMap();
        File file = new File(path);
        File[] tempList = file.listFiles();
        for (int i = 0; i < Objects.requireNonNull(tempList).length; i++) {
            if (tempList[i].isFile()) {
                files.add(tempList[i].toString());
                map.put(tempList[i].getAbsolutePath(), tempList[i].getName());
            }
        }
        return files;
    }
}
三、main测试
   
    public static void main(String[] args) {
        //ArrayList files = new ArrayList<>();
        //Map map = Maps.newHashMap();
        ArrayList list = getDirPathFiles("D:\pdfile");
        //File file = new File("D:\pdfile");
        //File[] tempList = file.listFiles();
        //for (int i = 0; i < Objects.requireNonNull(tempList).length; i++) {
        //    if (tempList[i].isFile()) {
        //        files.add(tempList[i].toString());
        //        map.put(tempList[i].getAbsolutePath(), tempList[i].getName().substring(0, tempList[i].getName().lastIndexOf(".")));
        //    }
        //}
        //for (int i = 0; i < files.size(); i++) {
        //    try {
        //        String filePath = files.get(i);
        //        List stringList = pdfToImagePaths(filePath, "D:\pacsFile", map.get(filePath) + "-" + i + "");
        //        System.out.println(stringList);
        //    } catch (Exception e) {
        //        e.printStackTrace();
        //    }
        //}
        pdfMultiImage("D:\pdfile\PdfReport.pdf", "D:\pacsFile\pdf.jpg");
    }
总结

pdfbox 1.6/1.8实现的有稍微差别 注意!!!!

转载请注明:文章转载自 www.mshxw.com
本文地址:https://www.mshxw.com/it/355937.html
我们一直用心在做
关于我们 文章归档 网站地图 联系我们

版权所有 (c)2021-2022 MSHXW.COM

ICP备案号:晋ICP备2021003244-6号