当前位置: 首页 > article >正文

使用PDFBox实现pdf转其他图片格式

最近在做一个小项目,项目中有一个功能要把pdf格式的图片转换为其它格式,接下来看看用pdfbox来如何实现吧。

首先导入pdfbox相关依赖:

 <dependency> 
         <groupId>org.apache.pdfbox</groupId> 
         <artifactId>pdfbox</artifactId> 
         <version>2.0.1</version> 
      </dependency>   

      <dependency> 
         <groupId>org.apache.pdfbox</groupId> 
         <artifactId>fontbox</artifactId> 
         <version>2.0.0</version> 
      </dependency>

      <dependency>  
         <groupId>org.apache.pdfbox</groupId> 
         <artifactId>jempbox</artifactId> 
         <version>1.8.11</version> 
      </dependency> 

      <dependency>
         <groupId>org.apache.pdfbox</groupId> 
         <artifactId>xmpbox</artifactId> 
         <version>2.0.0</version> 
      </dependency> 

      <dependency> 
         <groupId>org.apache.pdfbox</groupId> 
         <artifactId>preflight</artifactId> 
         <version>2.0.0</version> 
      </dependency> 

      <dependency> 
         <groupId>org.apache.pdfbox</groupId> 
         <artifactId>pdfbox-tools</artifactId> 
         <version>2.0.0</version> 
      </dependency>


接下来,控制层里面写一个方法接收三个参数(其中三个参数分别表示上传的文件,要转换的格式,输出路径):

  @ApiOperation("将pdf格式的图片装换为其它格式")
    @PostMapping("/pdfToimages")
    public R pdfToimages(@RequestPart("file") MultipartFile file
            , @RequestParam("type") String type,@RequestParam(value = "outpath",defaultValue = "C:\\PictureTool",required = false) String outpath){
        return  imagetoolService.convertToImages(file,type,outpath);
    }

然后是serviceimpl实现层实现对应方法(service接口此处就不做展示了,直接将serviceimpl里面的对应的方法设置为接口就行了):

/**
     * pdf转多张jpg(转换成多张图片)
     *
     * @param file
     * @return
     */
    @Override
    public R convertToImages(MultipartFile file, String type, String outputPath) {
        if (file == null || file.isEmpty() || outputPath == null || outputPath.trim().isEmpty()) {
            // 对传入参数进行基本校验,确保它们不为空
            return R.Failed("请确保文件不为空且输出路径不为空。");
        }
//        获取文件名
        String filename = file.getOriginalFilename();
        int lastIndexOfDot = filename.lastIndexOf(".");
        if (lastIndexOfDot != -1) {
            filename = filename.substring(0, lastIndexOfDot);
        }
        System.out.println("文件名称为:" + filename);

        // 确保路径以分隔符结尾
        if (!outputPath.endsWith(File.separator)) {
            outputPath += File.separator;
        }

        try {
            // 加载PDF文件
            PDDocument document = PDDocument.load(file.getBytes());
            // 创建PDF渲染器
            PDFRenderer pdfRenderer = new PDFRenderer(document);

            // 使用ByteArrayOutputStream来构建ZIP文件的内容
            ByteArrayOutputStream baosZip = new ByteArrayOutputStream();
            ZipOutputStream zipOut = new ZipOutputStream(baosZip);

            // 遍历PDF中的每一页,并将其添加到ZIP流中
            for (int page = 0; page < document.getNumberOfPages(); page++) {
                // 使用300 DPI渲染图片
                BufferedImage image = pdfRenderer.renderImageWithDPI(page, 300, ImageType.RGB);
                // 创建输出流缓存图像数据
                ByteArrayOutputStream baosImage = new ByteArrayOutputStream();
                // 保存图片到缓存流
                ImageIO.write(image, type, baosImage);
                // 将图像字节添加到ZIP文件中
                zipOut.putNextEntry(new ZipEntry(file.getOriginalFilename() + "_page_" + (page + 1) + "." + type));
                zipOut.write(baosImage.toByteArray());
                zipOut.closeEntry();
            }

            // 完成ZIP输出流写入操作并关闭之
            IOUtils.closeQuietly(zipOut);

            // 关闭PDF文档
            IOUtils.closeQuietly(document);

            // 创建用户指定的文件,用于保存ZIP
            String zipFilename = filename + "_converted_images_" + type + ".zip";
            File outputFile = new File(outputPath + zipFilename);
            FileUtils.writeByteArrayToFile(outputFile, baosZip.toByteArray());

            // 返回成功的状态响应
            return R.Success("转换成功,保存路径为:" + outputFile.getAbsolutePath(), 200);

        } catch (IOException e) {
            // 发生异常时打印堆栈跟踪并返回错误信息
            e.printStackTrace();
            return R.Failed(500, "转换失败:" + e.getMessage());
        }
    }

此处的R是我自己做的一个返回响应类,读者可以根据自己项目的实际情况设置自己的响应类,或者后台私信我获取,代码中均做有注释,若有疑问之处请留言~

项目成功运行之后会根据指定文件名的生成规则生成一个压缩包到指定的文件中,若没有指定文件则会用默认的文件生成路径。

接下来使用postman进行运行:

运行成功后,便可以在对应文件夹下面查看对应生成成功的文件:

后面直接将文件解压缩即可~


http://www.kler.cn/a/229572.html

相关文章:

  • linux自动分区后devmappercentos-home删除后合并到其它分区上
  • 【STM32-学习笔记-6-】DMA
  • 高级java每日一道面试题-2025年01月13日-框架篇[Spring篇]-Spring 是怎么解决循环依赖的?
  • vue的KeepAlive应用(针对全部页面及单一页面进行缓存)
  • SQLite 语法快速入门
  • el-table自定义按钮控制扩展expand
  • JDWP 简介
  • 勒索病毒最新变种.halo勒索病毒来袭,如何恢复受感染的数据?
  • 商汤科技「日日新4.0」正式发布,多维度升级大模型体系,能力比肩GPT-4!
  • CentOS 中文乱码
  • Google Chrome Close AutoUpdate
  • 小程序:类型三级分类
  • 【51单片机】LED的三个基本项目(LED点亮&LED闪烁&LED流水灯)(3)
  • (已解决)vue+element-ui实现个人中心,仿照原神
  • Ubuntu重装kubernetes集群
  • 【课程作业_01】国科大2023模式识别与机器学习实践作业
  • OpenWrt之有线中继无缝漫游mesh组网详解
  • 使用webstorm调试vue 2 项目
  • 对象存储minio
  • PAT-Apat甲级题1008(python和c++实现)
  • Blender教程(基础)-顶点的移动、滑移-16
  • GaussDB HCS 轻量化部署软件下载指引
  • spring.jpa.hibernate 配置和源码解析
  • Java10-BigDecimal使用(位数、舍入、计算、比较、绝对值)
  • git rebase # |REBASE 1/1 #rebase in progress; onto
  • 可解释性AI(XAI)的主要实现方法和研究方向