玄星幻月003-PDF文件转图片并将图片拆分

前言

前几天朋友找我帮忙,需要将一个pdf文件文件拆成图片,每页也需要拆分为3张图片(每页的数据比较规范,分为三段),刚开始试着找找有啥工具没有,找了一圈发现能转化也是按照每一页转化为一张图片,并不能实现将一页转化为多张图片。昨天突然灵机一闪,试试代码操作试试,还真给拆分好了。O(∩_∩)O
每页大概都是这样的布局。
在这里插入图片描述

将PDF文件转为图片

该功能只能将pdf文件的每一页拆分为一张图片。参考
pdf操作需要引用jar包

	<dependency>
		<groupId>org.apache.pdfbox</groupId>
		<artifactId>fontbox</artifactId>
		<version>2.0.9</version>
	</dependency>
	<!-- https://mvnrepository.com/artifact/org.apache.pdfbox/pdfbox -->
	<dependency>
		<groupId>org.apache.pdfbox</groupId>
		<artifactId>pdfbox</artifactId>
		<version>2.0.9</version>
	</dependency>
	<!-- https://mvnrepository.com/artifact/commons-logging/commons-logging -->
	<dependency>
		<groupId>commons-logging</groupId>
		<artifactId>commons-logging</artifactId>
		<version>1.2</version>
	</dependency>

核心代码

package pdf;

import org.apache.pdfbox.pdmodel.PDDocument;
import org.apache.pdfbox.rendering.PDFRenderer;

import javax.imageio.ImageIO;
import java.awt.image.BufferedImage;
import java.io.File;
import java.io.IOException;

/**
 * PDF 转图片工具类
 */
public class Pdf2Png {
    /**
     * 使用pdfbox将整个pdf转换成图片
     *
     * @param filePathName 文件全路径+文件
     * @param newPath 拆分页之后的路径
     * @param newNamePrefix 拆分后图片路径
     * @param type 图片类型
     */
    public static void pdf2png(String filePathName, String newPath, String newNamePrefix, String type) {
        long startTime = System.currentTimeMillis();
        // 将文件地址和文件名拼接成路径 注意:线上环境不能使用\\拼接
        File file = new File(filePathName);
        try {
            // 写入文件
            PDDocument doc = PDDocument.load(file);
            PDFRenderer renderer = new PDFRenderer(doc);
            int pageCount = doc.getNumberOfPages();
            for (int i = 0; i < pageCount; i++) {
                // dpi为144,越高越清晰,转换越慢
                BufferedImage image = renderer.renderImageWithDPI(i, 144); // Windows native DPI
                // 将图片写出到该路径下
                ImageIO.write(image, type, new File(newPath + newNamePrefix + (i + 1) + "." + type));
                System.out.println("第 " + i + " 页拆分完成 ");
            }
            long endTime = System.currentTimeMillis();
            System.out.println("拆页共耗时:" + ((endTime - startTime) / 1000.0) + "秒");  //转化用时
        } catch (IOException e) {
            e.printStackTrace();
        }
    }
}

拆分图片

将每页图片拆分为3张图片。参考
这里拆分是按照像素拆分的,具体像素需要根据原图片来定,可以根据windows自带的画图工具就可以查看图片像素,并且可以定位像素坐标
在这里插入图片描述

核心代码【使用java原生类】

package pdf;

import javax.imageio.ImageIO;
import java.awt.image.BufferedImage;
import java.io.File;
import java.io.IOException;

/**
 * 拆图片工具类
 */
public class CatPicUtils {

    /**
     * 拆图片
     *
     * @param metaPath 图片路劲
     * @param newPath 新路径
     * @param type 图片类型
     */
    public static void splitPage(String metaPath, String newPath, String type) {
        long startTime = System.currentTimeMillis();
        // 获取所有拆分的图片
        File[] files = new File(metaPath).listFiles();
        // 遍历拆图
        try {
            for (File file : files) {
                String fileName = file.getName();
                String name = fileName.substring(0, fileName.length() - type.length() - 1);
                BufferedImage image = null;
                image = (BufferedImage) ImageIO.read(file);
                BufferedImage cat1 = cat(0, 0, 1190, 540, image);
                ImageIO.write(cat1, type, new File(newPath + name + "_1." + type));//分割后的图片位置
                System.out.println(fileName + " 第 1 张拆分完成");
                BufferedImage cat2 = cat(0, 570, 1190, 540, image);
                ImageIO.write(cat2, type, new File(newPath + name + "_2." + type));//分割后的图片位置
                System.out.println(fileName + " 第 2 张拆分完成");
                BufferedImage cat3 = cat(0, 1130, 1190, 540, image);
                ImageIO.write(cat3, type, new File(newPath + name + "_3." + type));//分割后的图片位置
                System.out.println(fileName + " 第 3 张拆分完成");
            }
        } catch (IOException e) {
            e.printStackTrace();
        }
        long endTime = System.currentTimeMillis();
        System.out.println("拆图共耗时:" + ((endTime - startTime) / 1000.0) + "秒");  //转化用时
    }

    public static BufferedImage cat(int x, int y, int wight, int hight, BufferedImage img) {
        int[] simgRgb = new int[wight * hight];
        img.getRGB(x, y, wight, hight, simgRgb, 0, wight);
        BufferedImage newImage = new BufferedImage(wight, hight, BufferedImage.TYPE_INT_ARGB);
        newImage.setRGB(0, 0, wight, hight, simgRgb, 0, wight);
        return newImage;
    }
}

测试

package pdf;

public class ExecMain {
    public static void main(String[] args) {
        // 操作路径
        String path = "D:\\pdf\\0401\\";
        // 需要被拆分的文件
        String filePathName = path + "原文件\\XXX.pdf";
        // 拆分之后的路径
        String newPath = path + "拆页\\";
        // 最终文件夹【将每页文件拆分为多张图片路径】
        String splitPagePic = path + "切分\\";
        // 拆分之后图片前缀
        String newNamePrefix = "page_";
        // 拆分之后图片后缀
        String type = "png";
        // 执行拆分页
        Pdf2Png.pdf2png(filePathName, newPath, newNamePrefix, type);
        // 执行拆图片
        CatPicUtils.splitPage(newPath, splitPagePic, type);
    }
}
拆页效果

命名格式为 page_原pdf文件第i页.png在这里插入图片描述

拆图效果

命名格式为 page_第i页_第j张.png,可以根据图片名称快速定位到原pdf文件所在位置
在这里插入图片描述

参考博客

https://blog.csdn.net/qq_44753710/article/details/129294624
https://blog.csdn.net/weixin_48927623/article/details/118110101

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值