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

Java使用pdfbox进行pdf和图片之间的转换

简介

pdfbox是Apache开源的一个项目,支持pdf文档操作功能。
官网地址: Apache PDFBox | A Java PDF Library
支持的功能如下图.
在这里插入图片描述引入依赖

        <dependency><groupId>org.apache.pdfbox</groupId><artifactId>pdfbox-app</artifactId><version>2.0.19</version></dependency>

pdf转换成图片

   /*** 经过测试,dpi为96,100,105,120,150,200中,105显示效果较为清晰,体积稳定,dpi越高图片体积越大,一般电脑显示分辨率为96*/public static final float DEFAULT_DPI = 105;/*** 默认转换的图片格式为jpg*/public static final String DEFAULT_FORMAT = "jpg";/*** pdf转换成图片** @param pdfPath    pdf文件的路径   例如: D:\\test\\test.pdf (2页)* @param targetPath 输出的图片路径        D:\\test\\* @return 抽取出来的图片路径数组         Arrays.asList( "D:\\test\\1.jpg","D:\\test\\2.jpg" )*/public static List<String> pdfToManyImage(String pdfPath, String targetPath) {File file = new File(pdfPath);if (!file.exists()) {return null;}try {//加载pdf文件PDDocument doc = PDDocument.load(file);//读取pdf文件PDFRenderer renderer = new PDFRenderer(doc);int pageCount = doc.getNumberOfPages();List<String> stringList = new ArrayList<>(pageCount);String filePath = null;BufferedImage image;for (int i = 0; i < pageCount; i++) {//96/144/198// Windows native DPIimage = renderer.renderImageWithDPI(i, DEFAULT_DPI);// BufferedImage srcImage = resize(image, 240, 240);//产生缩略图filePath = targetPath + (i + 1) + "." + DEFAULT_FORMAT;//保存图片ImageIO.write(image, DEFAULT_FORMAT, new File(filePath));stringList.add(filePath);}return stringList;} catch (IOException e) {e.printStackTrace();return null;}}

图片合成pdf

    /*** 多图片合成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 pagepdImage = 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);}//保存pdfdoc.save(target);//关闭pdfdoc.close();}

多个pdf合成1个pdf

 /*** pdf合并拼接** @param files      pdf文件列表    例如:  Arrays.asList(new File("D:\\1.pdf"),new File("D:\\2.pdf"))* @param targetPath 合并后的文件         D:\\merge.pdf* @return 合并后的文件File对象*/public static File manyPdfToOne(List<File> files, String targetPath) {try {PDFMergerUtility mergePdf = new PDFMergerUtility();for (File f : files) {if (f.exists() && f.isFile()) {// 循环添加要合并的pdfmergePdf.addSource(f);}}// 设置合并生成pdf文件名称mergePdf.setDestinationFileName(targetPath);// 合并pdfmergePdf.mergeDocuments(MemoryUsageSetting.setupMainMemoryOnly());return new File(targetPath);} catch (Exception e) {return null;}}

相关文章:

  • pix2tex - LaTeX OCR 安装使用记录
  • Rocky9 上安装 redis-dump 和redis-load 命令
  • uinapp微信小程序隐私政策授权
  • httpclient工具类(支持泛型转换)
  • Vue3.0 provide与inject依赖注入:VCA
  • 线程同步——互斥量解锁、解锁
  • Python教程---Python交互界面
  • idea 配置checkstyle全过程
  • 在PyCharm中直接启动mitmproxy并自动打开关闭系统代理
  • 采用XML作为GUI描述语言
  • 本地idea远程调试服务器程序
  • 隐私安全|隐私安全已从国家法律法规转向商业企业应用,如何理解以及落地建设,相信大家正在经历隐私安全的困扰
  • 性能优于BERT的FLAIR:一篇文章入门Flair模型
  • MapReduce WordCount程序实践(IDEA版)
  • 使用vscode开发uniapp项目常用的辅助插件,提升开发效率
  • 《Java编程思想》读书笔记-对象导论
  • Apache Zeppelin在Apache Trafodion上的可视化
  • const let
  • Javascript Math对象和Date对象常用方法详解
  • Java基本数据类型之Number
  • js中forEach回调同异步问题
  • node-sass 安装卡在 node scripts/install.js 解决办法
  • PAT A1050
  • Terraform入门 - 3. 变更基础设施
  • underscore源码剖析之整体架构
  • 构造函数(constructor)与原型链(prototype)关系
  • 前端js -- this指向总结。
  • 如何实现 font-size 的响应式
  • 应用生命周期终极 DevOps 工具包
  • AI算硅基生命吗,为什么?
  • 阿里云重庆大学大数据训练营落地分享
  • 昨天1024程序员节,我故意写了个死循环~
  • ​ 全球云科技基础设施:亚马逊云科技的海外服务器网络如何演进
  • #include到底该写在哪
  • #我与Java虚拟机的故事#连载17:我的Java技术水平有了一个本质的提升
  • ${factoryList }后面有空格不影响
  • (11)工业界推荐系统-小红书推荐场景及内部实践【粗排三塔模型】
  • (8)Linux使用C语言读取proc/stat等cpu使用数据
  • (pojstep1.3.1)1017(构造法模拟)
  • (pytorch进阶之路)扩散概率模型
  • (三)uboot源码分析
  • (十五)Flask覆写wsgi_app函数实现自定义中间件
  • (转)Mysql的优化设置
  • .net core IResultFilter 的 OnResultExecuted和OnResultExecuting的区别
  • .NET delegate 委托 、 Event 事件
  • .Net6 Api Swagger配置
  • /proc/vmstat 详解
  • @CacheInvalidate(name = “xxx“, key = “#results.![a+b]“,multi = true)是什么意思
  • @FeignClient 调用另一个服务的test环境,实际上却调用了另一个环境testone的接口,这其中牵扯到k8s容器外容器内的问题,注册到eureka上的是容器外的旧版本...
  • @zabbix数据库历史与趋势数据占用优化(mysql存储查询)
  • [ C++ ] STL---string类的使用指南
  • [20170705]lsnrctl status LISTENER_SCAN1
  • [20171101]rman to destination.txt
  • [2024] 十大免费电脑数据恢复软件——轻松恢复电脑上已删除文件
  • [bzoj1901]: Zju2112 Dynamic Rankings