登录
注册
开源
企业版
高校版
搜索
帮助中心
使用条款
关于我们
开源
企业版
高校版
私有云
模力方舟
登录
注册
代码拉取完成,页面将自动刷新
开源项目
>
其他开源
>
教程配套代码
&&
捐赠
捐赠前请先登录
取消
前往登录
扫描微信二维码支付
取消
支付完成
支付提示
将跳转至支付宝完成支付
确定
取消
Watch
不关注
关注所有动态
仅关注版本发行动态
关注但不提醒动态
204
Star
1.7K
Fork
463
Gitee Community
/
bullshit-codes
代码
Issues
0
Pull Requests
0
Wiki
统计
流水线
服务
JavaDoc
PHPDoc
质量分析
Jenkins for Gitee
腾讯云托管
腾讯云 Serverless
悬镜安全
阿里云 SAE
Codeblitz
SBOM
我知道了,不再自动展开
440
来看一段有趣的代码
已合并
abel533:master
Gitee Community:master
abel533
创建于 2025-08-06 11:29
克隆/下载
HTTPS
SSH
复制
下载 Email Patch
下载 Diff 文件
## 编码技巧 去年实现发票连续打印时,直接copy了别人的代码来用,主要是对文件的处理,这部分可以不涉及数据库操作,这种功能也很方便写单元测试。在写单元测试图片转PDF功能时,发现了一段有趣的代码: ```java 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` 里面涉及几十次运算,纯计算执行几百或者几千次还算能接受。 这段代码的思想很好,还是少用为妙,如果提前计算直接缩放,代码反而更简单: ```java 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,如果发票很长,按高度缩放后会很窄,内容会看不清,因此应该只限制宽度,不限制高度。经过这种调整后代码如下: ```java protected void scaleImage(Image image) { float imageWidth = image.getScaledWidth(); float scalePercent = 595 / imageWidth * 100; image.scalePercent(scalePercent); } ``` 另外就是PDF的尺寸,直接和缩放后的图片大小一致就可以,没必要浪费纸,因此改造后的整个方法如下: ```java 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后的页面。可以从图中(绿边)方框截图放大效果中看到对齐的效果,非常完美! 写代码很简单,想要写好需要多动脑子,还需要对自己有更高的要求。
怎样手动合并此 Pull Request
git checkout master
git pull https://gitee.com/free/bullshit-codes.git master
git push origin master
评论
1
提交
1
文件
1
检查
代码问题
0
批量操作
展开设置
折叠设置
审查
Code Owner
审查人员
红薯
ld
诺墨
normalcoder
Gitee
oschina-org
红豆泥
gao-zhanr
未设置
最少人数
0
测试
红薯
ld
诺墨
normalcoder
Gitee
oschina-org
红豆泥
gao-zhanr
未设置
最少人数
0
优先级
不指定
严重
主要
次要
不重要
标签
未设置
关联 Issue
未关联
Pull Request 合并后将关闭上述关联 Issue
里程碑
未关联里程碑
参与者
(2)
1
https://gitee.com/gitee-community/bullshit-codes.git
git@gitee.com:gitee-community/bullshit-codes.git
gitee-community
bullshit-codes
bullshit-codes
点此查找更多帮助
搜索帮助
Git 命令在线学习
如何在 Gitee 导入 GitHub 仓库
Git 仓库基础操作
企业版和社区版功能对比
SSH 公钥设置
如何处理代码冲突
仓库体积过大,如何减小?
如何找回被删除的仓库数据
Gitee 产品配额说明
GitHub仓库快速导入Gitee及同步更新
什么是 Release(发行版)
将 PHP 项目自动发布到 packagist.org
评论
仓库举报
回到顶部
登录提示
该操作需登录 Gitee 帐号,请先登录后再操作。
立即登录
没有帐号,去注册