当前位置: 代码网 > it编程>编程语言>Java > JAVA PDF操作之实现截取N页和多个PDF合并

JAVA PDF操作之实现截取N页和多个PDF合并

2025年01月17日 Java 我要评论
java pdf 截取n页,生成新文件,转图片,多个pdf 合并<dependency> <groupid>com.itextpdf</groupid>

java pdf 截取n页,生成新文件,转图片,多个pdf 合并

<dependency>
    <groupid>com.itextpdf</groupid>
    <artifactid>itextpdf</artifactid>
    <version>5.5.13</version>
</dependency>

完整代码 

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 <= end; 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 <= end; 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(); 
                //只取一页,等于传进来的名称,多页时,加上 页号
                string imagefilepath = from == end ? saveimgfile : saveimgfile.replace(".jpg", "_" + i + ".jpg");
                file file = new file(imagefilepath);
                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();
            }
        }
    }

    //多个pdf合并成一个
    public static void mergepdffiles(list<string> pdffiles, string outputpdf) throws ioexception {
        // 创建一个新的 pdf 阅读器对象和一个新的 pdf 写入对象
        pdfreader reader = null;
        pdfcopy copy = null;
        document document = new document();
        try {
            // 创建 pdf 阅读器对象和写入对象
            reader = new pdfreader(pdffiles.get(0));
            copy = new pdfcopy(document, new fileoutputstream(outputpdf));
            // 打开文档准备写入内容
            document.open();

            // 将第一个 pdf 的所有页面复制到输出 pdf 中
            for (int i = 1; i <= reader.getnumberofpages(); i++) {
                pdfimportedpage page = copy.getimportedpage(reader, i);
                copy.addpage(page);
            }

            // 将其它pdf的所有页,输出到 pdf 中
            for (int i = 1; i < pdffiles.size(); i++) {
                reader = new pdfreader(pdffiles.get(i));
                for (int j = 1; j <= reader.getnumberofpages(); j++) {
                    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();
            }
        }
    }
}

测试类 

@test
void pdf() throws exception {
    string pdffile = "d:\\desktop\\20220117.pdf";
    string jpgfile = "d:\\desktop\\20220117.jpg";
    pdfutil.pdftoimage(pdffile, jpgfile, 1, 1); 
}

@test
 void testmerge() throws ioexception {
    list<string> pdffiles = new arraylist<>();
    pdffiles.add("d:\\projects\\20231225180735.pdf");
    pdffiles.add("d:\\projects\\20231225182535.pdf");
    pdffiles.add("d:\\projects\\20231225184135.pdf");
    pdfutil.mergepdffiles(pdffiles, "d:\\projects\\new.pdf");
}

到此这篇关于java pdf操作之实现截取n页和多个pdf合并的文章就介绍到这了,更多相关java pdf内容请搜索代码网以前的文章或继续浏览下面的相关文章希望大家以后多多支持代码网!

(0)

相关文章:

版权声明:本文内容由互联网用户贡献,该文观点仅代表作者本人。本站仅提供信息存储服务,不拥有所有权,不承担相关法律责任。 如发现本站有涉嫌抄袭侵权/违法违规的内容, 请发送邮件至 2386932994@qq.com 举报,一经查实将立刻删除。

发表评论

验证码:
Copyright © 2017-2025  代码网 保留所有权利. 粤ICP备2024248653号
站长QQ:2386932994 | 联系邮箱:2386932994@qq.com