远方蔚蓝
一刹那情真,相逢不如不见

文章数量 126

访问次数 199888

运行天数 1437

最近活跃 2024-10-04 23:36:48

进入后台管理系统

pdf转图片


pom依赖
<dependency>
  <groupId>net.sf.cssbox</groupId>
  <artifactId>pdf2dom</artifactId>
  <version>1.7</version>
</dependency>
<dependency>
  <groupId>org.apache.pdfbox</groupId>
  <artifactId>pdfbox</artifactId>
  <version>2.0.12</version>
</dependency>
<dependency>
  <groupId>org.apache.pdfbox</groupId>
  <artifactId>pdfbox-tools</artifactId>
  <version>2.0.12</version>
</dependency>
pdf多页合成一张图片
import java.awt.image.BufferedImage;
import java.io.FileInputStream;
import java.io.IOException;
import java.util.List;
import org.apache.pdfbox.pdmodel.PDDocument;
import org.apache.pdfbox.rendering.ImageType;
import org.apache.pdfbox.rendering.PDFRenderer;
import com.google.common.collect.Lists;
/**
 * pdf工具
 * @author wst(shi-tao.wen) 2022628日 上午10:29:20
 *
 */
public class PdfUtil {
	public static final int DEFAULT_DPI = 250; // dpi越大转换后越清晰,相对转换速度越慢
	
    /**
     * 多页PDF会每页转换为一张图片
     * @author wst(shi-tao.wen) 2022628日 上午10:27:37
     * @param pdfFile pdf文件路径
     * @param outPath 图片输出路径
     */
    public static void pdf2multiImage(String pdfFile, String outPath) {
        try (PDDocument pdf = PDDocument.load(new FileInputStream(pdfFile))) {
            int actSize = pdf.getNumberOfPages();
            List<BufferedImage> picList = Lists.newArrayList();
            for (int i = 0; i < actSize; i++) {
                BufferedImage image = new PDFRenderer(pdf).renderImageWithDPI(i, DEFAULT_DPI, ImageType.RGB);
                picList.add(image);
            }
            // 组合图片
            ImageUtil.yPic(picList, outPath);
        } catch (IOException e) {
            e.printStackTrace();
        }
    }
    
    public static void main(String[] args) {
    	pdf2multiImage("E:\\pdf\\pdf\\jjkzc.pdf", "E:\\pdf\\png\\test.png");
	}
}
图片工具类
import java.awt.image.BufferedImage;
import java.io.File;
import java.util.ArrayList;
import java.util.List;
import javax.imageio.ImageIO;
/**
 * 图片转换工具
 * @author wst(shi-tao.wen) 2022628日 上午10:30:05
 *
 */
public class ImageUtil {
    private static final org.slf4j.Logger log = org.slf4j.LoggerFactory.getLogger(ImageUtil.class);
    /**
     * 将宽度相同的图片,竖向追加在一起 ##注意:宽度必须相同
     *
     * @param picList 文件流数组
     * @param outPath 输出路径
     */
    public static void yPic(List<BufferedImage> picList, String outPath) {// 纵向处理图片
        if (picList == null || picList.size() <= 0) {
            log.info("图片数组为空!");
            return;
        }
        try {
            // 总高度
            int height = 0,
                // 总宽度
                width = 0,
                // 临时的高度 , 或保存偏移高度
                offsetHeight = 0,
                // 临时的高度,主要保存每个高度
                tmpHeight = 0,
                // 图片的数量
                picNum = picList.size();
            // 保存每个文件的高度
            int[] heightArray = new int[picNum];
            // 保存图片流
            BufferedImage buffer = null;
            // 保存所有的图片的RGB
            List<int[]> imgRgb = new ArrayList<int[]>();
            // 保存一张图片中的RGB数据
            int[] tmpImgRgb;
            for (int i = 0; i < picNum; i++) {
                buffer = picList.get(i);
                // 图片高度
                heightArray[i] = offsetHeight = buffer.getHeight();
                if (i == 0) {
                    // 图片宽度
                    width = buffer.getWidth();
                }
                // 获取总高度
                height += offsetHeight;
                // 从图片中读取RGB
                tmpImgRgb = new int[width * offsetHeight];
                tmpImgRgb = buffer.getRGB(0, 0, width, offsetHeight, tmpImgRgb, 0, width);
                imgRgb.add(tmpImgRgb);
            }
            // 设置偏移高度为0
            offsetHeight = 0;
            // 生成新图片
            BufferedImage imageResult = new BufferedImage(width, height, BufferedImage.TYPE_INT_RGB);
            for (int i = 0; i < picNum; i++) {
                tmpHeight = heightArray[i];
                if (i != 0) {
                    // 计算偏移高度
                    offsetHeight += tmpHeight;
                }
                // 写入流中
                imageResult.setRGB(0, offsetHeight, width, tmpHeight, imgRgb.get(i), 0, width);
            }
            File outFile = new File(outPath);
            // 写图片
            ImageIO.write(imageResult, "png", outFile);
        } catch (Exception e) {
            e.printStackTrace();
        }
    }
    
}