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;}}

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.hqwc.cn/news/157352.html

如若内容造成侵权/违法违规/事实不符,请联系编程知识网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

【源码分析系列】antdv table滚动时固定表头

背景 当页面滚动的时候&#xff0c;如果超过表格的部分&#xff0c;表格的头部会固定在某个位置&#xff0c;方便用户看到数据栏的标。项目采用的是vue2antdv&#xff0c;但是这个版本的table没有sticky属性&#xff0c;所以需要自行解决。 滚动前&#xff1a; 滚动后&#x…

做海外问卷调查有什么答题技巧和方法?

大家好&#xff0c;我是橙河老师&#xff0c;这篇文章聊一聊做海外问卷调查有什么答题技巧和方法&#xff1f; 海外问卷调查&#xff0c;其实就是一些外国公司&#xff0c;对外发放的有偿市场调查问卷&#xff0c;目的是收集消费者的意见和反馈&#xff0c;我们只要按照要求去…

Redis Sentinel 哨兵模式

Sentinel 哨兵模式 Redis Sentinel 官网 Redis 的 Sentinel 文档 -- Redis中国用户组&#xff08;CRUG&#xff09; Sentinel Redis 命令参考&#xff08;红色&#xff09; Sentinel 通过监控的方式获取主机的工作状态是否正常&#xff0c;当主机发生故障时&#xff0c; Senti…

Postman测试金蝶云星空Webapi【协同开发云】

文章目录 Postman测试金蝶云星空Webapi【协同开发云】环境说明业务背景大致流程具体操作请求登录接口请求标准接口查看保存提交审核反审核撤销 请求自定义接口参数是字符串参数是实体类单个实体类实体类是集合 其他 Postman测试金蝶云星空Webapi【协同开发云】 环境说明 金蝶…

性能测试计划注意事项

在做任何事情之前,唯有进行了良好的计划,方可收到好的效果,性能测试 也是如此,一份定义明确的测试计划将为我们的测试提供良好的保证。下面和大 家讨论一下制定性能测试计划时的一些注意事项。 1. 分析应用程序 测试人员应当对系统的软硬件以及配置情况非常熟悉,这样模…

页面淘汰算法模拟实现与比较

1.实验目标 利用标准C 语言&#xff0c;编程设计与实现最佳淘汰算法、先进先出淘汰算法、最近最久未使用淘汰算法、简单 Clock 淘汰算法及改进型 Clock 淘汰算法&#xff0c;并随机发生页面访问序列开展有关算法的测试及性能比较。 2.算法描述 1. 最佳淘汰算法&#xff08;Op…

Redis与Mysql的数据一致性(双写一致性)

双写一致性&#xff1a;当修改了数据库的数据也要同时的更新缓存的数据&#xff0c;使缓存和数据库的数据要保持一致。 一般是在写数据的时候添加延迟双删的策略 先删缓存 再修改数据 延迟一段时间后再次删除缓存 这种方式其实不是很靠谱 一致性要求高 共享锁&#xff1a;读…

制作网页版H5页面商城源码系统+随心DIY 带前后端完整搭建教程

随着智能手机的广泛普及&#xff0c;人们越来越依赖手机进行日常生活中的各种活动&#xff0c;包括购物。传统的PC端购物模式已经无法满足人们的需求&#xff0c;因此开发移动端的购物系统势在必行。而现如今H5技术不断发展成熟&#xff0c;使得在手机等移动设备上展示网页版商…

vue-cli5.0.x优雅降级,配置项目兼容旧版浏览器

兼容低版本谷歌浏览器 vue-cli5.0.x脚手架下的&#xff0c;如何降低项目版本以适用于底版本的浏览器。 直接使用默认配置打包部署出来的项目再40&#xff0c;60、70版本的谷歌浏览器跑不起来&#xff0c;蓝屏或者浏览器白屏一般这种情况都需要通过Babel去做转换&#xff0c;我…

数据库概论

目录 什么是数据库数据库的概念模型层次模型网状模型关系模型 为什么要使用关系型数据库完整性约束结构化查询语言SQL基本语句 什么是数据库 考虑这些问题&#xff1a;当用户使用软件计算时&#xff0c;如果想要保存计算结果或者想选择不同的题目&#xff0c;是否要保存、读取…

爱写bug的小邓程序员个人博客

博客网址: http://www.006969.xyz 欢迎来到我的个人博客&#xff0c;这里主要分享我对于前后端相关技术的学习笔记、项目实战经验以及一些技术感悟。 在我的博客中&#xff0c;你将看到以下主要内容&#xff1a; 技术文章 我将会分享我在学习前后端技术过程中的一些感悟&am…

解决在Win7下运行一些老游戏花屏或色彩异常问题的方法

有一些喜欢回顾经典老游戏的玩家们&#xff0c;在目前最新的windows7的操作系统下&#xff0c;运行某些游戏会出现花屏&#xff0c;问题的原因是因为win7对这些游戏的DirectDraw不兼容&#xff0c;一种方法是改游戏配置文件&#xff0c;把游戏色彩8bit改成16bit&#xff0c;当然…