JAVA PDF 截取N页,生成新文件,转图片

JAVA PDF 截取N页,生成新文件,转图片

import com.itextpdf.text.Document;
import com.itextpdf.text.pdf.PdfCopy;
import com.itextpdf.text.pdf.PdfImportedPage;
import com.itextpdf.text.pdf.PdfReader;
import org.apache.pdfbox.pdmodel.PDDocument;
import org.apache.pdfbox.pdmodel.PDPageTree;
import org.apache.pdfbox.rendering.PDFRenderer;

import javax.imageio.ImageIO;
import java.awt.image.BufferedImage;
import java.io.*;

public class PdfUtil {

    /**
     * 截取pdfFile的第from页至第end页,组成一个新的文件名
     *
     * @param pdfFile 要切割的pdf文件
     * @param newFile 切割后形成的新的pdf文件
     * @param from    从第N页开始
     * @param end     到第N页结束
     */
    public static void partitionPdf(String pdfFile, String newFile, int from, int end) {
        Document document = null;
        PdfCopy copy = null;
        PdfReader reader = null;
        try {
            reader = new PdfReader(pdfFile);
            int pageCount = reader.getNumberOfPages();
            if (from < 1) {
                from = 1;
            }
            if (from > pageCount) {
                from = pageCount;
            }
            if (end == 0 || end > pageCount) {
                end = pageCount;
            }
            document = new Document(reader.getPageSize(1));
            copy = new PdfCopy(document, new FileOutputStream(newFile));
            document.open();
            for (int j = from; j ) {
                document.newPage();
                PdfImportedPage page = copy.getImportedPage(reader, j);
                copy.addPage(page);
            }
        } catch (Exception e) {
            e.printStackTrace();
        } finally {
            if (document != null) {
                document.close();
            }
            if (copy != null) {
                copy.close();
            }
            if (reader != null) {
                reader.close();
            }
        }
    }

    /**
     * pdf转图片
     *
     * @param pdfFile   PDF 文件
     * @param imageFile 输出的图片文件
     * @param from      开始页 从1开始
     * @param end       结束页 最大为PDF总页数
     * @throws Exception
     */
    public static void pdfToImage(String pdfFile, String imageFile, int from, int end) throws Exception {
        PDDocument doc = null;
        ByteArrayOutputStream os = null;
        InputStream stream = null;
        OutputStream out = null;
        try {
            //pdf路径
            stream = new FileInputStream(pdfFile);
            // 加载解析PDF文件
            doc = PDDocument.load(stream);
            PDFRenderer pdfRenderer = new PDFRenderer(doc);
            PDPageTree pages = doc.getPages();
            int pageCount = pages.getCount();
            if (from < 1) {
                from = 1;
            }
            if (from > pageCount) {
                from = pageCount;
            }
            if (end == 0 || end > pageCount) {
                end = pageCount;
            }
            for (int i = from; i ) {
                BufferedImage bim = pdfRenderer.renderImageWithDPI(i - 1, 200); //PDFBOX 是从0开始的,from初始值为1,所以这边要减 i-1
                os = new ByteArrayOutputStream();
                ImageIO.write(bim, "jpg", os);
                byte[] dataList = os.toByteArray();
                // jpg文件转出路径
                File file = new File(imageFile.replace(".jpg", i + ".jpg"));
                if (!file.getParentFile().exists()) {
                    // 不存在则创建父目录及子文件
                    file.getParentFile().mkdirs();
                    file.createNewFile();
                }
                out = new FileOutputStream(file);
                out.write(dataList);
            }
        } catch (Exception e) {
            e.printStackTrace();
        } finally {
            if (doc != null) {
                doc.close();
            }
            if (os != null) {
                os.close();
            }
            if (stream != null) {
                stream.close();
            }
            if (out != null) {
                out.close();
            }
        }
    }
}

Original: https://www.cnblogs.com/vipsoft/p/16624803.html
Author: VipSoft
Title: JAVA PDF 截取N页,生成新文件,转图片

原创文章受到原创版权保护。转载请注明出处:https://www.johngo689.com/609416/

转载文章受原作者版权保护。转载请注明原作者出处!

(0)

大家都在看

  • 十二、异常处理机制(完结)

    十二、异常处理机制 12.1 异常处理的引入 public class Exception01 { public static void main(String[] args) {…

    Java 2023年6月5日
    067
  • 六度问题(转载)

    What do Leonard Nimoy, Stana Katic, and Robert Downey Jr. have in common? They all have a …

    Java 2023年5月30日
    069
  • 面向对象ooDay7

    .精华笔记:1)成员内部类: 应用率不高1.1)类中套类,外面的称为外部类,里面的称为内部类1.2)内部类通常只服务于外部类,对外不具备可见性1.3)内部类对象通常在外部类中创建1…

    Java 2023年6月13日
    042
  • application.yml 增加数据库连接,重启日志卡死

    SpringBoot引入JPA,application.ymlapplication.yml增加数据库链接参数,启动卡死,日志没有动,如下图 折腾好久,后面发现用 Maven的pa…

    Java 2023年6月13日
    058
  • 你说说对Java中SPI的理解吧

    前言 最近在面试的时候被问到SPI了,没回答上来,主要也是自己的原因,把自己给带沟里去了,因为讲到了类加载器的双亲委派模型,后面就被问到了有哪些是破坏了双亲委派模型的场景,然后我就…

    Java 2023年5月29日
    078
  • SUSE系统—keepalived的搭建

    作为博客第一篇,先小尝初试一下搭建keepalived,因为项目需要搭建集群,为了满足需要,需要服务器对外暴露个虚拟IP,进行集群部署。 第一步:先把keepalived.tra….

    Java 2023年6月5日
    090
  • java中的多线程

    多线程基础 进程:进程就是运行中的程序,当被关闭的时候,这段进程也关闭。比如我们玩玩游戏,打开游戏操作系统会为该进程分配一个空间,当退出游戏是,进程也就结束了 线程:线程是由进程创…

    Java 2023年6月6日
    090
  • 61.小尖尖

    dsfsf posted @2022-09-28 08:35 随遇而安== 阅读(6 ) 评论() 编辑 Original: https://www.cnblogs.com/55z…

    Java 2023年6月7日
    083
  • 如何封装第三方API

    日常开发中,少不了对第三方api的封装。api封装的好坏绝定了后期维护的难度以及使用api的开发人员是否抱怨。比如:有一天第三方api的域名变了。或者自己封装的api没有参数说明,…

    Java 2023年5月29日
    0141
  • Servlet之Request和Response的快速上手

    阅读提示: 前置内容 MyBatis知识点总结 HTTP和Servlet入门 1、Request和Response概述 2、Request对象 2.1 Request继承体系 2….

    Java 2023年6月14日
    066
  • Fizz企业级微服务网关-服务编排,祭出终结BFF层的大杀器

    概述 服务编排是Fizz网关提供的一个强大的功能,能够基于现有的业务微服务通过在线配置的方式快速的生成一个聚合接口,减少中间层胶水代码以及降低编码投入。本文介绍服务编排三个常见场景…

    Java 2023年6月9日
    072
  • Java多线程之ExecutorService使用说明

    一、简介 ExecutorService是Java中对线程池定义的一个接口,它java.util.concurrent包中,在这个接口中定义了和后台任务执行相关的方法。 二、线程池…

    Java 2023年5月29日
    062
  • SpringBoot集成文件-如何使用POI导出Word文档?

    前文我们介绍了通过Apache POI导出excel,而Apache POI包含是操作Office Open XML(OOXML)标准和微软的OLE 2复合文档格式(OLE2)的J…

    Java 2023年6月6日
    090
  • JAVA入门[23]-SpringBoot配置Swagger2

    一、新建SpringBoot站点1.新建module,然后引入pom依赖: 2.新建Controller文件 3.新建SpringBoot启动文件 4.运行,http://loca…

    Java 2023年5月29日
    078
  • Ehcache计算Java对象内存大小

    在EHCache中,可以设置maxBytesLocalHeap、maxBytesLocalOffHeap、maxBytesLocalDisk值,以控制Cache占用的内存、磁盘的大…

    Java 2023年5月29日
    070
  • Android 使用 ContentProvider 简单操作数据库

    ContentProvider 可以用来原生读写 Android 自带的数据库 SQLite。 使用 Studio 创建一个 ContentProvider, 名字叫 TestCo…

    Java 2023年6月7日
    055
亲爱的 Coder【最近整理,可免费获取】👉 最新必读书单  | 👏 面试题下载  | 🌎 免费的AI知识星球