来看一段有趣的代码

2024-05-11 14:04
文章标签 代码 一段 有趣 来看

本文主要是介绍来看一段有趣的代码,希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!

在这里插入图片描述

最近实现发票连续打印时,直接copy其他项目代码来用,主要是对文件的处理,这部分可以不涉及数据库操作,这种功能也很方便写单元测试。在写单元测试图片转PDF功能时,发现了一段有趣的代码:

protected void scaleImage(com.itextpdf.text.Image image) {float imageHeight = image.getScaledHeight();float imageWidth = image.getScaledWidth();int i = 0;while (imageHeight > 500 || imageWidth > 500) {image.scalePercent(100 - i);i++;imageHeight = image.getScaledHeight();imageWidth = image.getScaledWidth();}
}

这段代码是对图片进行缩放,如果宽和高大于500就进行缩放,有意思的地方是明明可以直接计算出缩放倍率,偏偏要从 100%(i++位置调一下也能避免一次无用功)一直尝试到符合为止,我测试的图片是宽795高528,一直尝试到62%才满足,如果图片缩放涉及IO操作,消耗的资源可能会更大,经过查看 itextpdf 源码发现 scalePercent 里面涉及几十次运算,纯计算执行几百或者几千次也很快。

这段代码的思想很好,但要谨慎使用,如果提前计算直接缩放,代码反而更简单:

protected void scaleImage(Image image) {float imageHeight = image.getScaledHeight();float imageWidth = image.getScaledWidth();float scalePercent = Math.min(500 / imageHeight, 500 / imageWidth) * 100;image.scalePercent(scalePercent);
}

做到这一步就算完事了吗?

当然不是,往PDF放图片为什么缩放呢,为什么宽高限制500呢?为什么只有一个图片的情况下,转成的PDF是一张A4纸的比例呢?为什么不像其他电子发票(不是数电发票)那样刚刚好的尺寸?

宽高限制500的情况下和其他PDF格式的发票合并到一起时明显更窄,样式不统一不好看,通过查看PDF的宽高,经过计算将宽度设置为 595 的时候样式是统一的。另外高度不应该限制500,如果发票很长,按高度缩放后会很窄,内容会看不清,因此应该只限制宽度,不限制高度。经过这种调整后代码如下:

protected void scaleImage(Image image) {float imageWidth = image.getScaledWidth();float scalePercent = 595 / imageWidth * 100;image.scalePercent(scalePercent);
}

另外就是PDF的尺寸,直接和缩放后的图片大小一致就可以,没必要浪费纸,因此改造后的整个方法如下:

protected InputStream imageToPdf(InputStream is, List<File> tempFiles) {File outFile = FileUtil.createTempFile(".pdf", true);try (FileOutputStream out = new FileOutputStream(outFile)) {Image image = Image.getInstance(IoUtil.readBytes(is));//缩放图片scaleImage(image);//设置尺寸Document document = new Document(new Rectangle(image.getScaledWidth(), image.getScaledHeight()),0, 0, 0, 0);PdfWriter.getInstance(document, out);document.open();image.setAlignment(Image.ALIGN_CENTER);document.add(image);document.close();out.flush();return Files.newInputStream(outFile.toPath());} catch (Exception e) {log.error("图片转换成pdf失败", e);throw new BusinessException("图片转换成pdf失败");} finally {IoUtil.close(is);tempFiles.add(outFile);}
}

一开始只用图片宽高设置 Document 时发现高度有截断,增加 margin 设置后变成和图片一致了。最终在合并后的PDF中,所有文档的宽度也变得整齐一致了。

在这里插入图片描述

图中上面是ofd转pdf后的页面,下面是图片转pdf后的页面。可以从图中(绿边)方框截图放大效果中看到对齐的效果,非常完美!

写代码很简单,想要写好需要多思考,还需要对自己有更高的要求。

这篇关于来看一段有趣的代码的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!



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

相关文章

Java中调用数据库存储过程的示例代码

《Java中调用数据库存储过程的示例代码》本文介绍Java通过JDBC调用数据库存储过程的方法,涵盖参数类型、执行步骤及数据库差异,需注意异常处理与资源管理,以优化性能并实现复杂业务逻辑,感兴趣的朋友... 目录一、存储过程概述二、Java调用存储过程的基本javascript步骤三、Java调用存储过程示

Visual Studio 2022 编译C++20代码的图文步骤

《VisualStudio2022编译C++20代码的图文步骤》在VisualStudio中启用C++20import功能,需设置语言标准为ISOC++20,开启扫描源查找模块依赖及实验性标... 默认创建Visual Studio桌面控制台项目代码包含C++20的import方法。右键项目的属性:

MySQL数据库的内嵌函数和联合查询实例代码

《MySQL数据库的内嵌函数和联合查询实例代码》联合查询是一种将多个查询结果组合在一起的方法,通常使用UNION、UNIONALL、INTERSECT和EXCEPT关键字,下面:本文主要介绍MyS... 目录一.数据库的内嵌函数1.1聚合函数COUNT([DISTINCT] expr)SUM([DISTIN

Java实现自定义table宽高的示例代码

《Java实现自定义table宽高的示例代码》在桌面应用、管理系统乃至报表工具中,表格(JTable)作为最常用的数据展示组件,不仅承载对数据的增删改查,还需要配合布局与视觉需求,而JavaSwing... 目录一、项目背景详细介绍二、项目需求详细介绍三、相关技术详细介绍四、实现思路详细介绍五、完整实现代码

Go语言代码格式化的技巧分享

《Go语言代码格式化的技巧分享》在Go语言的开发过程中,代码格式化是一个看似细微却至关重要的环节,良好的代码格式化不仅能提升代码的可读性,还能促进团队协作,减少因代码风格差异引发的问题,Go在代码格式... 目录一、Go 语言代码格式化的重要性二、Go 语言代码格式化工具:gofmt 与 go fmt(一)

HTML5实现的移动端购物车自动结算功能示例代码

《HTML5实现的移动端购物车自动结算功能示例代码》本文介绍HTML5实现移动端购物车自动结算,通过WebStorage、事件监听、DOM操作等技术,确保实时更新与数据同步,优化性能及无障碍性,提升用... 目录1. 移动端购物车自动结算概述2. 数据存储与状态保存机制2.1 浏览器端的数据存储方式2.1.

基于 HTML5 Canvas 实现图片旋转与下载功能(完整代码展示)

《基于HTML5Canvas实现图片旋转与下载功能(完整代码展示)》本文将深入剖析一段基于HTML5Canvas的代码,该代码实现了图片的旋转(90度和180度)以及旋转后图片的下载... 目录一、引言二、html 结构分析三、css 样式分析四、JavaScript 功能实现一、引言在 Web 开发中,

Python如何去除图片干扰代码示例

《Python如何去除图片干扰代码示例》图片降噪是一个广泛应用于图像处理的技术,可以提高图像质量和相关应用的效果,:本文主要介绍Python如何去除图片干扰的相关资料,文中通过代码介绍的非常详细,... 目录一、噪声去除1. 高斯噪声(像素值正态分布扰动)2. 椒盐噪声(随机黑白像素点)3. 复杂噪声(如伪

Java Spring ApplicationEvent 代码示例解析

《JavaSpringApplicationEvent代码示例解析》本文解析了Spring事件机制,涵盖核心概念(发布-订阅/观察者模式)、代码实现(事件定义、发布、监听)及高级应用(异步处理、... 目录一、Spring 事件机制核心概念1. 事件驱动架构模型2. 核心组件二、代码示例解析1. 事件定义

Python实例题之pygame开发打飞机游戏实例代码

《Python实例题之pygame开发打飞机游戏实例代码》对于python的学习者,能够写出一个飞机大战的程序代码,是不是感觉到非常的开心,:本文主要介绍Python实例题之pygame开发打飞机... 目录题目pygame-aircraft-game使用 Pygame 开发的打飞机游戏脚本代码解释初始化部