通过Apache PDFBox将pdf与图片互相转换以及合并与拆分pdf

简介: 通过Apache PDFBox将pdf与图片互相转换以及合并与拆分pdf

Apache PDFBox 库是一个开源、用于操作 PDF 文档的 Java 工具库。PDFBox 允许创建新的 PDF 文档、操作现有文档,以及从文档中提取内容。

获取 Apache PDFBox 下载地址,目前版本 2.0.25,核心 jar 是 pdfbox-2.0.25.jar,其他还有几个 jar 可以根据需要进行导入。

这里 jar包下载与源码学习可以下载全部的 jar 和一些命令行工具,下载 pdfbox-2.0.25-src.zip 源码可以看到文件夹 examples 里面有不少例子进行了示范。

pdf转word

所需jar包下载 无需积分

如果帮助到你了麻烦点个赞或收藏哦,会不断更新的

pdf合并

package pdfUtity;
import org.apache.pdfbox.multipdf.PDFMergerUtility;
import java.io.File;
import java.io.IOException;
import java.util.Scanner;
//import org.apache.pdfbox.util.PDFMergerUtility;
public class pdfMerge {
    private static String[] getPdfs(String fileAddress) throws IOException {
        File file = new File(fileAddress);
        String[] pdfs;
        if (file.isDirectory()) {
            pdfs = file.list();
            return pdfs;
        } else {
            throw new IOException("输入的路径有问题");
        }
    }
    public static void main(String[] args) throws Exception {
        Scanner in = new Scanner(System.in);
        PDFMergerUtility mergePdf = new PDFMergerUtility();
        System.out.println("请输入要合并的PDF文件所在的文件夹路径");
        String fileAddress = in.nextLine();
        System.out.println("你输入的路径是:" + fileAddress);
        String destinationFileName = "javaweb2020.pdf";
        String[] pdfs = getPdfs(fileAddress);
        for (int i = 0; i < pdfs.length; i++)
            mergePdf.addSource(fileAddress + File.separator + pdfs[i]);
        mergePdf.setDestinationFileName(destinationFileName);
        System.out.println("合并比较费时间,请等待个几分钟吧!");
        mergePdf.mergeDocuments();
        System.out.print("合并完成");
    }
}

pdf拆分为单页

package pdfUtity;
import org.apache.pdfbox.multipdf.Splitter;
import org.apache.pdfbox.pdmodel.PDDocument;
import java.io.File;
import java.io.IOException;
import java.util.List;
import java.util.Iterator;
public class pdfSplitter {
    public static void main(String[] args)throws IOException {
        //把需要拆分的pdf文件加载进来
        File file = new File("d://desktopfile//pdfs//1.pdf");
        PDDocument document = PDDocument.load(file);
        //创建一个拆分器对象
        Splitter splitter = new Splitter();
        //list中存放好被拆分的pdf对象 其中内容是pdf的每一页
        List<PDDocument>Pages = splitter.split(document);
        //创建迭代器对象
        Iterator<PDDocument>iterator = Pages.listIterator();
        //saving splits as individual PDF document
        int i = 1;
        while(iterator.hasNext()) {
            PDDocument pd = iterator.next();
            pd.save("d://desktopfile//pdfPhotos//"+i++ +".pdf");
        }
        System.out.println("pdf拆分成功");
        document.close();
    }
}

pdf转换为图片

package pdfUtity;/*
 * 读取 pdf,将其中的某一页另存为 png 图片
 */
import java.awt.image.BufferedImage;
import java.io.File;
import java.io.IOException;
import org.apache.pdfbox.pdmodel.PDDocument;
import org.apache.pdfbox.pdmodel.encryption.InvalidPasswordException;
import org.apache.pdfbox.rendering.ImageType;
import org.apache.pdfbox.rendering.PDFRenderer;
import org.apache.pdfbox.tools.imageio.ImageIOUtil;
public class PDFSavePNG
{
    public static void main(String[] args)
    {
        try
        {
            // 打开来源 pdf
            PDDocument pdfDocument = PDDocument.load(new File("d://desktopfile//pdfs//1.pdf"));
            PDFRenderer pdfRenderer = new PDFRenderer(pdfDocument);
            for(int pageNumber=0;pageNumber<pdfDocument.getNumberOfPages();pageNumber++){
            // 提取的页码
//            int pageNumber = 0;
            // 以300 dpi 读取存入 BufferedImage 对象
            int dpi = 300;
            BufferedImage buffImage = pdfRenderer.renderImageWithDPI(pageNumber, dpi, ImageType.RGB);
            // 将 BufferedImage 写入到 png
            ImageIOUtil.writeImage(buffImage, "d://desktopfile//pdfPhotos//"+pageNumber+".png", dpi);
            // 关闭文档
            }
            pdfDocument.close();
        }
        catch (InvalidPasswordException e)
        {
            e.printStackTrace();
        }
        catch (IOException e)
        {
            e.printStackTrace();
        }
    }
}

图片转换为pdf

package pdfUtity;
import org.apache.pdfbox.pdmodel.PDDocument;
import org.apache.pdfbox.pdmodel.PDPage;
import org.apache.pdfbox.pdmodel.PDPageContentStream;
import org.apache.pdfbox.pdmodel.common.PDRectangle;
import org.apache.pdfbox.pdmodel.graphics.image.LosslessFactory;
import org.apache.pdfbox.pdmodel.graphics.image.PDImageXObject;
import javax.imageio.ImageIO;
import java.awt.image.BufferedImage;
import java.io.File;
import java.io.IOException;
import java.util.Arrays;
import java.util.List;
/**
 * @author: Serendipity
 * Date: 2022/3/16 22:40
 * Description:
 */
public class photoToPDF {
    /**
     * 多图片合成pdf的限制后缀
     */
    private static final List IMAGE_SUFFIX = Arrays.asList("jpg", "png", "jpeg");
    /**
     * 多个图片合成一个pdf
     *
     * @param imgFolder 多图片的文件夹路径  例如:"D:\\image\\"
     * @param target    合并的图片路径          "D:\\image\\merge.pdf"
     * @throws IOException
     */
    public static void manyImageToOnePdf(String imgFolder, String target) throws IOException {
        PDDocument doc = new PDDocument();
        //创建一个空的pdf文件
        doc.save(target);
        PDPage page;
        PDImageXObject pdImage;
        PDPageContentStream contents;
        BufferedImage bufferedImage;
        String fileName;
        float w, h;
        String suffix;
        File tempFile;
        int index;
        File folder = new File(imgFolder);
        for (int i = 0; i < folder.listFiles().length; i++) {
            tempFile = folder.listFiles()[i];
            if (!tempFile.isFile()) {
                continue;
            }
            fileName = tempFile.getName();
            index = fileName.lastIndexOf(".");
            if (index == -1) {
                continue;
            }
            //获取文件的后缀
            suffix = fileName.substring(index + 1);
            //如果文件后缀不是图片格式,跳过当前循环
            if (!IMAGE_SUFFIX.contains(suffix)) {
                continue;
            }
            bufferedImage = ImageIO.read(folder.listFiles()[i]);
            //Retrieving the page
            pdImage = LosslessFactory.createFromImage(doc, bufferedImage);
            w = pdImage.getWidth();
            h = pdImage.getHeight();
            page = new PDPage(new PDRectangle(w, h));
            contents = new PDPageContentStream(doc, page);
            contents.drawImage(pdImage, 0, 0, w, h);
            System.out.println("Image inserted");
            contents.close();
            doc.addPage(page);
        }
        //保存pdf
        doc.save(target);
        //关闭pdf
        doc.close();
    }
    public static void main(String[] args) {
        try {
            manyImageToOnePdf("d://图片","photo.pdf");
        } catch (IOException e) {
            e.printStackTrace();
        }
    }
}


相关文章
|
11天前
|
机器学习/深度学习 文字识别 Java
Python实现PDF图片OCR识别:从原理到实战的全流程解析
本文详解2025年Python实现扫描PDF文本提取的四大OCR方案(Tesseract、EasyOCR、PaddleOCR、OCRmyPDF),涵盖环境配置、图像预处理、核心识别与性能优化,结合财务票据、古籍数字化等实战场景,助力高效构建自动化文档处理系统。
155 0
|
4月前
|
人工智能 搜索推荐 算法
PDF 转 JPG 图片小工具:CodeBuddy 助力解决转换痛点
在 PDF 转 JPG 的实际应用中,用户普遍面临转换质量差、批量处理效率低、格式兼容性不足以及编程实现困难等痛点。而 CodeBuddy 凭借智能代码生成与优化、实时错误诊断修复、助力代码学习拓展,以及支持多场景适配与个性化定制等强大的 AI 编程能力,精准直击这些难题。使用 CodeBuddy 开发 Python PDF 转 JPG 小工具,能够有效提升转换效率与质量,降低开发门槛和成本,为用户带来高效、优质的文件格式转换体验。
161 16
|
3月前
|
人工智能 开发工具 开发者
【HarmonyOS 5】鸿蒙应用实现发票扫描、文档扫描输出PDF图片或者表格的功能
HarmonyOS 系统提供的核心场景化视觉服务,旨在帮助开发者快速实现移动端文档数字化功能。
124 0
|
5月前
|
文字识别 BI
【工具教程】批量PDF和图片OCR识别指定区域文字自动改图片名字,多个区域一次性批量识别改名批量重命名
本内容介绍了一款用于企业档案、医院病历及办公文件管理的图片和PDF文字识别工具。通过框选识别区域,软件可批量提取关键信息,实现文件重命名或导出为表格,极大提升管理效率。支持图片与PDF两种模式,操作简单,适用于合同、病历、报告等场景。提供详细步骤指导,包含区域设置、文件导入、批量处理及结果校验等功能。
868 8
|
6月前
|
人工智能 文字识别 自然语言处理
1.6K star!这个开源文本提取神器,5分钟搞定PDF/图片/Office文档!
Kreuzberg 是一个基于 Python 的文本提取库,支持从 PDF、图像、Office 文档等 20+ 格式中提取文本内容。采用 MIT 开源协议,具备本地处理、异步架构、智能 OCR 等特性,特别适合需要隐私保护的文档处理场景。
444 1
|
8月前
|
机器学习/深度学习 人工智能 文字识别
Zerox:AI驱动的万能OCR工具,精准识别复杂布局并输出Markdown格式,支持PDF、DOCX、图片等多种文件格式
Zerox 是一款开源的本地化高精度OCR工具,基于GPT-4o-mini模型,支持PDF、DOCX、图片等多种格式文件,能够零样本识别复杂布局文档,输出Markdown格式结果。
696 4
Zerox:AI驱动的万能OCR工具,精准识别复杂布局并输出Markdown格式,支持PDF、DOCX、图片等多种文件格式
|
7月前
|
文字识别 BI
【图片型PDF】批量识别扫描件PDF指定区域局部位置内容,将识别内容导出Excel表格或批量改名文件,基于阿里云OCR对图片型PDF识别改名案例实现
在医疗和政务等领域,图片型PDF文件(如病历、报告、公文扫描件)的处理需求广泛。通过OCR技术识别这些文件中的文字信息,提取关键内容并保存为表格,极大提高了信息管理和利用效率。本文介绍一款工具——咕嘎批量OCR系统,帮助用户快速处理图片型PDF文件,支持区域识别、内容提取、导出表格及批量改名等功能。下载工具后,按步骤选择处理模式、进行区域采样、批量处理文件,几分钟内即可高效完成数百个文件的处理。
803 8
|
6月前
|
文字识别 UED Python
对双栏 | 单双栏混合 | 图表文字混合的复杂布局的图片OCR识别(对布局复杂的整个pdf进行OCR识别)
这个故事告诉我们要多尝试不同的库和引擎,尤其是需求比较偏门或者少见的时候。同一个方向不同的库所擅长的领域是不一样的。 博客不应该只有代码和解决方案,重点应该在于给出解决方案的同时分享思维模式,只有思维才能可持续地解决问题,只有思维才是真正值得学习和分享的核心要素。如果这篇博客能给您带来一点帮助,麻烦您点个赞支持一下,还可以收藏起来以备不时之需,有疑问和错误欢迎在评论区指出~
|
9月前
|
JavaScript
jquery图片和pdf文件预览插件
EZView.js是一款jquery图片和pdf文件预览插件。EZView.js可以为图片和pdf格式文件生成在线预览效果。支持的文件格式有pdf、jpg、 png、jpeg、gif。
269 16
|
9月前
|
编解码 人工智能 文字识别
用PDF转换图片的方式弥补通义千问在扫描版PDF支持方面的缺失
当前通义千问Web版和本地版qwen-VL在处理扫描版PDF时均无法直接识别,导致实际应用中处理大量扫描PDF的需求难以满足。为此,通过使用Python的pdf2image库,可将PDF文件转换为图片,再进行OCR处理,实现解决方案。文中提供了具体的代码示例,展示了如何将PDF文件的每一页转换成图片,并保存至指定文件夹,为后续的OCR处理做好准备。

热门文章

最新文章

推荐镜像

更多