功能

使用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中相关推荐

  1. Java实现多张图片合并成一份PDF文件

    Java实现多张图片合并成一份PDF文件,一行两列展示 引入依赖包 <dependency><groupId>com.lowagie</groupId><ar ...

  2. java Flink使用addSink方法保存流到mysql数据库中

    博主把核心的内容写在最前面,其他内容和完整的代码放在最后面哈: 文章目录 pom配置 主要代码 其他内容:MyData2类,与生成数据源的类MyDataSource2 pom配置 <depend ...

  3. java 图片合成pdf_java将多张图片合并转为PDF

    所需jar包:com.lowagie.text package weaver.gy.util; import java.awt.image.BufferedImage; import java.io. ...

  4. java 图片合并成pdf_java将多张图片合并转为PDF

    [实例简介] [实例截图] [核心代码] package weaver.gy.util; import java.awt.image.BufferedImage; import java.io.Fil ...

  5. 多张图片合并转为PDF

    需要使用的依赖 <dependency><groupId>com.lowagie</groupId><artifactId>itext</arti ...

  6. 练习 | 01 | 把多张图片合并成一张图片

    1 实现方式 1.1 第一种方案 import javax.imageio.ImageIO; import java.awt.image.BufferedImage; import java.io.F ...

  7. 通过java将多张图片生成GIF,并通过前端隐式下载

    前言 接到一个项目功能需求,客户需要将多张图片合并起来下载成GIF,本想着前端去解决找了GIF.js等多个前端插件,发现不是插件没有人维护就是一些重量级的插件,太多东西要弄,不容易上手,于是使用jav ...

  8. python多张图片合并拼接,python制作sprite图、雪碧图

    python多张图片合并拼接,python制作sprite图.雪碧图 整理图片集 找两个文件夹,yangying和zhaoliying,分别放上照片8张,共16张照片. 创建sprite.py # 多 ...

  9. java实现word文件合并

    java实现word文件合并 前言 一.Spire.Doc.jar 二.使用步骤 1.引入库 2.写接口 前言 本文使用了Free Spire.Office for Java这个工具,下面是官网地址 ...

  10. java 图片 rgb_简单的java图片处理——如何用Java读出一张图片的RGB值?

    如何用Java读出一张图片的RGB值? (牛人可以从第六步开始看,牛人看了代码就知道怎么建文件夹啦!! ) (1) 在刚刚建立项目的根目录新建一个文件夹date,例如,我的这个项目的根目录是:E:\W ...

最新文章

  1. PHP与MySQL连接菜鸟教程_PHP 连接 MySQL - PHP 教程 - 菜鸟学堂-脚本之家
  2. python全栈简介_Python全栈(一)编程语言介绍
  3. Hhadoop环境部署
  4. grep 打印出过滤字段及后3行内容
  5. [集训队作业2018] 三角形(贪心,堆,线段树合并)
  6. python 字典练习 记录学生是否交作业的小程序
  7. 程序员必杀技——《编程全能词典》即将震憾上市
  8. IC卡CPU卡32位单片机S3系列接触式读写模块分类与性能攻略
  9. latex中表格怎么加标题_LaTeX中表格怎么加标题
  10. 强大的Pidgin,Pidgin的使用
  11. python中path函数_示例1-path函数
  12. java中的subtract_【java】Java.math.BigDecimal.subtract()方法实例
  13. ARFoundation多图切换识别
  14. 几款非常优秀且常用的代码编辑器
  15. VideoCapture()的使用------python
  16. (玩转zabbix)硬盘硬件健康状态监控,部件寿命监控
  17. Blender 3D Architecture, Buildings, and Scenery
  18. linux 防火墙 功能点,功能点(Funciton Point FP)估算法(三) 调整因子
  19. linux双显卡配置_Linux系统怎么配置双显卡
  20. 解决Excel打开UTF-8编码CSV文件乱码的问题亲测有效

热门文章

  1. Origin不显示零刻度
  2. Visio自制直角箭头
  3. 微服务网关 gateway
  4. Linux开机自动挂载Windows分区的两种方法
  5. php 100元 换算,货币换算的PHP脚本
  6. Misra-Gries 算法
  7. MATLAB全局变量
  8. 深度学习教程(14) | 序列模型与RNN网络(吴恩达·完整版)
  9. nmap输出xml转换htm方法
  10. 机械臂运动空间的计算_深圳全气动式工业助力机械手定做