Java将多张图片合并保存到同一页PDF中
功能
使用Java将多张图片合并保存到同一页PDF中
依赖框架
pdfbox-2.0.19
<dependency><groupId>org.apache.pdfbox</groupId><artifactId>pdfbox</artifactId><version>2.0.19</version></dependency>
代码内容
package com.fangjing.fjdemo.pdf;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 java.awt.image.BufferedImage;
import java.io.ByteArrayInputStream;
import java.io.ByteArrayOutputStream;
import java.io.IOException;
import java.math.BigDecimal;
import java.math.RoundingMode;
import java.util.List;/*** @author:fangjing* @date: Created in 14:21 2021-02-19.* @desc: PDF转换相关*/
public class PdfConverterUtil {private PdfConverterUtil() {// empty method}/*** @desc 将多个图片放置到一个PDF页中* @param imageStreamList 图片流列表* @return 最终生成PDF流* @throws IOException 执行失败的异常*/public static ByteArrayInputStream buildSinglePagePdfFromImage(List<BufferedImage> imageStreamList) throws IOException {// 页高度取所有图片的高度之和+间隔,页宽度取所有图片中最宽的一个+固定间隔*2// 间隔暂时取50int interval = 50;int pageHeight = interval;int pageWidth = 0;for (BufferedImage image : imageStreamList) {pageHeight = image.getHeight() + pageHeight + interval;pageWidth = Math.max(image.getWidth(), pageWidth);}pageWidth = pageWidth + interval * 2;try (PDDocument pdDocument = new PDDocument()) {// 生成单页PDPage pdPage = new PDPage(new PDRectangle(pageWidth, pageHeight));pdDocument.addPage(pdPage);int currentHeight = pageHeight;for (BufferedImage imageStream : imageStreamList) {currentHeight = currentHeight - imageStream.getHeight() - interval;try (PDPageContentStream contentStream = new PDPageContentStream(pdDocument, pdPage, PDPageContentStream.AppendMode.APPEND, false)) {PDImageXObject pdImageObject = LosslessFactory.createFromImage(pdDocument, imageStream);contentStream.drawImage(pdImageObject, getXCoordinate(pageWidth, imageStream.getWidth()), currentHeight, imageStream.getWidth(), imageStream.getHeight());}}ByteArrayOutputStream outputStream = new ByteArrayOutputStream();pdDocument.save(outputStream);pdDocument.close();return new ByteArrayInputStream(outputStream.toByteArray());}}/*** @desc 计算使图片居中的坐标* @param pageWidth 页面宽度* @param imageWidth 图片宽度* @return 图片应该设置的页面坐标*/private static float getXCoordinate(int pageWidth, int imageWidth) {return new BigDecimal(pageWidth - imageWidth).divide(new BigDecimal(2), RoundingMode.DOWN).floatValue();}
}
单测
package com.fangjing.fjdemo.pdf;import org.apache.commons.io.FileUtils;
import org.junit.Assert;
import org.junit.Test;import javax.imageio.ImageIO;
import java.awt.image.BufferedImage;
import java.io.ByteArrayInputStream;
import java.io.File;
import java.io.IOException;
import java.net.URL;
import java.util.Arrays;/*** @author fangjing* @date 8/3/2022-9:52 PM* @desc Pdf转换相关单测*/
public class PdfConverterUtilTest {@Testpublic void testBuildSinglePagePdfFromImage() throws IOException {BufferedImage imageStream1 = ImageIO.read(new URL("https://image1.com/f?raw=1"));BufferedImage imageStream2 = ImageIO.read(new URL("https:/image2/f?raw=1"));ByteArrayInputStream pdfFromImage = PdfConverterUtil.buildSinglePagePdfFromImage(Arrays.asList(imageStream1, imageStream2));File file = new File("test.pdf");FileUtils.copyInputStreamToFile(pdfFromImage, file);Assert.assertNotNull(pdfFromImage);boolean delete = file.delete();Assert.assertTrue(delete);}}
最终效果
Java将多张图片合并保存到同一页PDF中相关推荐
- Java实现多张图片合并成一份PDF文件
Java实现多张图片合并成一份PDF文件,一行两列展示 引入依赖包 <dependency><groupId>com.lowagie</groupId><ar ...
- java Flink使用addSink方法保存流到mysql数据库中
博主把核心的内容写在最前面,其他内容和完整的代码放在最后面哈: 文章目录 pom配置 主要代码 其他内容:MyData2类,与生成数据源的类MyDataSource2 pom配置 <depend ...
- java 图片合成pdf_java将多张图片合并转为PDF
所需jar包:com.lowagie.text package weaver.gy.util; import java.awt.image.BufferedImage; import java.io. ...
- java 图片合并成pdf_java将多张图片合并转为PDF
[实例简介] [实例截图] [核心代码] package weaver.gy.util; import java.awt.image.BufferedImage; import java.io.Fil ...
- 多张图片合并转为PDF
需要使用的依赖 <dependency><groupId>com.lowagie</groupId><artifactId>itext</arti ...
- 练习 | 01 | 把多张图片合并成一张图片
1 实现方式 1.1 第一种方案 import javax.imageio.ImageIO; import java.awt.image.BufferedImage; import java.io.F ...
- 通过java将多张图片生成GIF,并通过前端隐式下载
前言 接到一个项目功能需求,客户需要将多张图片合并起来下载成GIF,本想着前端去解决找了GIF.js等多个前端插件,发现不是插件没有人维护就是一些重量级的插件,太多东西要弄,不容易上手,于是使用jav ...
- python多张图片合并拼接,python制作sprite图、雪碧图
python多张图片合并拼接,python制作sprite图.雪碧图 整理图片集 找两个文件夹,yangying和zhaoliying,分别放上照片8张,共16张照片. 创建sprite.py # 多 ...
- java实现word文件合并
java实现word文件合并 前言 一.Spire.Doc.jar 二.使用步骤 1.引入库 2.写接口 前言 本文使用了Free Spire.Office for Java这个工具,下面是官网地址 ...
- java 图片 rgb_简单的java图片处理——如何用Java读出一张图片的RGB值?
如何用Java读出一张图片的RGB值? (牛人可以从第六步开始看,牛人看了代码就知道怎么建文件夹啦!! ) (1) 在刚刚建立项目的根目录新建一个文件夹date,例如,我的这个项目的根目录是:E:\W ...
最新文章
- PHP与MySQL连接菜鸟教程_PHP 连接 MySQL - PHP 教程 - 菜鸟学堂-脚本之家
- python全栈简介_Python全栈(一)编程语言介绍
- Hhadoop环境部署
- grep 打印出过滤字段及后3行内容
- [集训队作业2018] 三角形(贪心,堆,线段树合并)
- python 字典练习 记录学生是否交作业的小程序
- 程序员必杀技——《编程全能词典》即将震憾上市
- IC卡CPU卡32位单片机S3系列接触式读写模块分类与性能攻略
- latex中表格怎么加标题_LaTeX中表格怎么加标题
- 强大的Pidgin,Pidgin的使用
- python中path函数_示例1-path函数
- java中的subtract_【java】Java.math.BigDecimal.subtract()方法实例
- ARFoundation多图切换识别
- 几款非常优秀且常用的代码编辑器
- VideoCapture()的使用------python
- (玩转zabbix)硬盘硬件健康状态监控,部件寿命监控
- Blender 3D Architecture, Buildings, and Scenery
- linux 防火墙 功能点,功能点(Funciton Point FP)估算法(三) 调整因子
- linux双显卡配置_Linux系统怎么配置双显卡
- 解决Excel打开UTF-8编码CSV文件乱码的问题亲测有效