ITEXT-小图片并排显示,大图片按行显示

2023-10-29 18:58

本文主要是介绍ITEXT-小图片并排显示,大图片按行显示,希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!

问题场景

使用itext开发PDF过程中,有这样一个需求:有N个图片,每个图片大小不一,要求小图片每2个并排显示,大图片逐一按行显示。那么问题来了,图片多小算小?由API知image01.getWidth()与image01.getWeight()可以判断图片大小。

代码

需导入的jar包:itext-pdfa-5.5.6.jar、itext-xtra-5.5.6.jar、itext-5.5.6.jar、itext-asian.jar

/*** 添加图片(有并排需求)  图片高度必须一致* 思路:* 1.   通过图片的宽度是否小于pos值决定是否并排显示,是-> half; 否->all* 2.   新建一个2列的PdfTable* 3.   根据得到的half与all集合判断显示图片* @param imagesDNA             图片集合* @param size                  样品编号数量* @param reportCompile         信息载体,应用的时候可根据情况忽略* @param document* @param writer* @param baseFont1* @param yahei09* @param imageLocalAddr        本地图片前缀* @param pos                   图片宽度标准* @throws DocumentException* @throws MalformedURLException* @throws IOException*/private void addFulu(List<PdfImage> imagesDNA, int size, ReportCompile reportCompile, Document document, PdfWriter writer, BaseFont baseFont1,Font yahei09, String imageLocalAddr, Float pos) throws DocumentException, MalformedURLException, IOException {String bigTitle = "";String completeCheck = reportCompile.getCompleteCheck();if (completeCheck != null && completeCheck.equals("1") || completeCheck.equals("2")) {bigTitle = "a";} else if (completeCheck != null && completeCheck.equals("3")){bigTitle = "b";} else if (completeCheck != null && completeCheck.equals("4")){bigTitle = "c";}if (imagesDNA == null) {System.out.println("在图片库没有查到值.");PdfPTable table = new PdfPTable(1);PdfPCell cell0 = new PdfPCell();Paragraph p = new Paragraph(bigTitle, yahei09);p.setFirstLineIndent(-14f);p.setSpacingAfter(20f);cell0.addElement(p);String imagePath = imageLocalAddr + "error.png";Image image01 = Image.getInstance(imagePath);image01.scaleAbsoluteWidth(250); image01.scaleAbsoluteHeight(80); cell0.setBorder(0);cell0.setPaddingLeft(100f);cell0.addElement(image01);table.addCell(cell0);table.setSplitLate(false);table.setSplitRows(false);document.add(table);} else {PdfImage[] images = new PdfImage[imagesDNA.size() > size ? size : imagesDNA.size()];images = imagesDNA.toArray(images);List<String> flags = this.getFlagRowOrCol(imagesDNA, pos, imageLocalAddr);PdfPTable table = new PdfPTable(2);int halfFlagNum = 0;for (int i = 0; i < images.length; i++) {if (flags.get(i).equals("half")) {halfFlagNum++;}PdfPCell cell = new PdfPCell();if (i == 0) {Paragraph p = new Paragraph(bigTitle, yahei09);p.setSpacingAfter(14f);cell.addElement(p);}String imagePath = images[i].getImagePath();if (imagePath == null || imagePath == "") {imagePath = imageLocalAddr + "error.png";} else {imagePath = "http://file.xxx.com" + imagePath;}Image image01 = null;try {image01 = Image.getInstance(imagePath);} catch (FileNotFoundException e) {image01 = Image.getInstance(imageLocalAddr + "error.png");}if (flags.get(i).equals("half")) {image01.scalePercent(75);//设置对齐方式if (halfFlagNum % 2 == 1) {image01.setAlignment(Image.RIGHT);cell.setPaddingLeft(-21f);cell.setPaddingRight(15f);} else {cell.setPaddingLeft(35f);}cell.setRowspan(2);} else {if (image01.getWidth() <= pos) {image01.scalePercent(75);} else {image01.scalePercent(45);}image01.setAlignment(Image.MIDDLE);cell.setColspan(2);if (images.length == 1) {cell.setPaddingLeft(-21f);}}cell.addElement(image01);cell.setBorder(0);if (i > 0) {cell.setPaddingTop(32f);}table.addCell(cell);table.setSplitLate(false);table.setSplitRows(false);}document.add(table);}}/*** 获取标志位* 直接通过图片的宽度来判断是否并排显示* @param imagesDNA* @param pos               图片宽度标准,2个小图片放在一行* @param imageLocalAddr        * @return* @throws IOException * @throws MalformedURLException * @throws BadElementException */private List<String> getFlagRowOrCol(List<PdfImage> imagesDNA, Float pos, String imageLocalAddr) throws BadElementException, MalformedURLException, IOException {List<String> res = new ArrayList<String>();List<Float> list = new ArrayList<Float>();if (imagesDNA != null && imagesDNA.size() > 0) {for (int i = 0; i < imagesDNA.size(); i++) {String imagePath = imagesDNA.get(i).getImagePath();if (imagePath == null || imagePath == "") {imagePath = imageLocalAddr + "error.png";} else {imagePath = "http://file.xxx.com" + imagePath;}Image image01 = null;try {image01 = Image.getInstance(imagePath);} catch (FileNotFoundException e) {image01 = Image.getInstance(imageLocalAddr + "error.png");}list.add(image01.getWidth());}}if (list.size() <= imagesDNA.size()) {res = this.judgeRowOrCol(list, pos);}return res;}/*** 此方法用于判断是合并列还是合并行* @param list  判断依据* @param pos   连续两个在一起的且小于等于pos值的标志位为half,否则为all* @return*/private List<String> judgeRowOrCol(List<Float> list, Float pos) {List<String> res = new ArrayList<String>();String half = "half";String all = "all";int couple = 0;if (list != null && list.size() > 0) {for (int i = 0; i < list.size(); i++) {float current = list.get(i);if (i < list.size() - 1) {float next = list.get(i + 1);if (current <= pos) {couple++;if (next <= pos && couple != 2) {res.add(half);} else {if (couple == 2) {res.add(half);couple = 0;} else {res.add(all);}}} else {res.add(all);couple = 0;}} else {float previous = list.size() == 1 ? current : list.get(i - 1);if (previous <= pos && current <= pos) {if (list.size() == 1) {res.add(all);} else {if (couple == 0) {res.add(all);} else {res.add(half);}}} else {res.add(all);}}}}return res;}

这篇关于ITEXT-小图片并排显示,大图片按行显示的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!



http://www.chinasem.cn/article/302688

相关文章

Python FastAPI+Celery+RabbitMQ实现分布式图片水印处理系统

《PythonFastAPI+Celery+RabbitMQ实现分布式图片水印处理系统》这篇文章主要为大家详细介绍了PythonFastAPI如何结合Celery以及RabbitMQ实现简单的分布式... 实现思路FastAPI 服务器Celery 任务队列RabbitMQ 作为消息代理定时任务处理完整

使用C#代码在PDF文档中添加、删除和替换图片

《使用C#代码在PDF文档中添加、删除和替换图片》在当今数字化文档处理场景中,动态操作PDF文档中的图像已成为企业级应用开发的核心需求之一,本文将介绍如何在.NET平台使用C#代码在PDF文档中添加、... 目录引言用C#添加图片到PDF文档用C#删除PDF文档中的图片用C#替换PDF文档中的图片引言在当

详解C#如何提取PDF文档中的图片

《详解C#如何提取PDF文档中的图片》提取图片可以将这些图像资源进行单独保存,方便后续在不同的项目中使用,下面我们就来看看如何使用C#通过代码从PDF文档中提取图片吧... 当 PDF 文件中包含有价值的图片,如艺术画作、设计素材、报告图表等,提取图片可以将这些图像资源进行单独保存,方便后续在不同的项目中使

Java实现文件图片的预览和下载功能

《Java实现文件图片的预览和下载功能》这篇文章主要为大家详细介绍了如何使用Java实现文件图片的预览和下载功能,文中的示例代码讲解详细,感兴趣的小伙伴可以跟随小编一起学习一下... Java实现文件(图片)的预览和下载 @ApiOperation("访问文件") @GetMapping("

基于Python开发批量提取Excel图片的小工具

《基于Python开发批量提取Excel图片的小工具》这篇文章主要为大家详细介绍了如何使用Python中的openpyxl库开发一个小工具,可以实现批量提取Excel图片,有需要的小伙伴可以参考一下... 目前有一个需求,就是批量读取当前目录下所有文件夹里的Excel文件,去获取出Excel文件中的图片,并

Java实现数据库图片上传与存储功能

《Java实现数据库图片上传与存储功能》在现代的Web开发中,上传图片并将其存储在数据库中是常见的需求之一,本文将介绍如何通过Java实现图片上传,存储到数据库的完整过程,希望对大家有所帮助... 目录1. 项目结构2. 数据库表设计3. 实现图片上传功能3.1 文件上传控制器3.2 图片上传服务4. 实现

Java实现数据库图片上传功能详解

《Java实现数据库图片上传功能详解》这篇文章主要为大家详细介绍了如何使用Java实现数据库图片上传功能,包含从数据库拿图片传递前端渲染,感兴趣的小伙伴可以跟随小编一起学习一下... 目录1、前言2、数据库搭建&nbsChina编程p; 3、后端实现将图片存储进数据库4、后端实现从数据库取出图片给前端5、前端拿到

Linux虚拟机不显示IP地址的解决方法(亲测有效)

《Linux虚拟机不显示IP地址的解决方法(亲测有效)》本文主要介绍了通过VMware新装的Linux系统没有IP地址的解决方法,主要步骤包括:关闭虚拟机、打开VM虚拟网络编辑器、还原VMnet8或修... 目录前言步骤0.问题情况1.关闭虚拟机2.China编程打开VM虚拟网络编辑器3.1 方法一:点击还原VM

CSS模拟 html 的 title 属性(鼠标悬浮显示提示文字效果)

《CSS模拟html的title属性(鼠标悬浮显示提示文字效果)》:本文主要介绍了如何使用CSS模拟HTML的title属性,通过鼠标悬浮显示提示文字效果,通过设置`.tipBox`和`.tipBox.tipContent`的样式,实现了提示内容的隐藏和显示,详细内容请阅读本文,希望能对你有所帮助... 效

Python使用PIL库将PNG图片转换为ICO图标的示例代码

《Python使用PIL库将PNG图片转换为ICO图标的示例代码》在软件开发和网站设计中,ICO图标是一种常用的图像格式,特别适用于应用程序图标、网页收藏夹图标等场景,本文将介绍如何使用Python的... 目录引言准备工作代码解析实践操作结果展示结语引言在软件开发和网站设计中,ICO图标是一种常用的图像