用itext生成指定宽和动态高的二维码图片

2023-10-31

    标题和摘要中都提到,本文的一个目的就是生成定宽的二维码图片(还有一个很特别的要求,打印出来得图片需要被条码枪识别),用的第三方工具类库是itext,版本是2.0。

    为了实现二维码的指定宽高,我的第一个想法是“先用itext生成图片,然后通过缩放或者剪裁来指定图片的宽高”,代码可以参考 http://my.oschina.net/psuyun/blog/228908 ,这种做法,达到了生成指定宽高的效果,让人遗憾的一点是,用此法打印出来的二维码不能被条码枪识别,无奈之下,只能寻求他法。

    其实针对第一个想法的失败,我一直有个担心是,生成的图片dpi不够,这个说法可以参考http://blog.csdn.net/chenweionline/article/details/2026855 

    回到正题,这次我的思路是研究itext的源码,看看是怎么生成图片的,很遗憾,这次让我成功了。下面给出关键代码和说明(有兴趣的同学,可以去研究下他的源码):

//BarcodePDF417 为itext中生成二维码图片的工具类
  BarcodePDF417 barcodePDF417 = new BarcodePDF417();
  
  //下面两行很重要,用于定宽
  barcodePDF417.setOptions(BarcodePDF417.PDF417_FIXED_COLUMNS);
  
  //设置codeColumns,主要用于指定生成二维码图片的长度,他的计算公式为: (17 * codeColumns +3)+ 18,得到的这个值,正是二维码图片的宽度,公文二维码的宽度一般是188,所以我的codeColumns=7 
  barcodePDF417.setCodeColumns(7);
  
  //下面两行动态决定二维码图片的高度,分别说明如下:
  //1、setText方法用于设置二维码图片的内容,也是动态高的由来,因为图片保存的内容有多有少(有上限,string.length < 926, 一个大概值 ),相对 codeColumns,还有一个概念 codeRows,codeRows跟二维码的高度有关系。
  //关于codeRows值的计算,codeRows = (tot - 1) / codeColumns + 1; 这行代码能给我们一个说法,codeRows跟tot 和 codeColumns 有关系,其中tot的重要组成部分就是二维码的内容也就是setText的值,内容越多,codeRows就会大一些
  //所以说二维码的高其实是一个动态的高
  //2、再来看看yHeight这个东西有什么用
  //int h = (int)yHeight;
  //java.awt.Image img = canvas.createImage(new MemoryImageSource(bitColumns, codeRows * h, pix, 0, bitColumns));
  //对于二维码图片的高,相信不用我在多说了,额外补充一点,bitColumns其实就是188
  barcodePDF417.setText(strInfo.getBytes());
  barcodePDF417.setYHeight(2);
  
  //生成图片
  Image pdfImg = barcodePDF417.createAwtImage(Color.black, Color.white);

相关的说明,在示例代码中都有说明了,还有什么不清楚,可以找到我的qq进行交流。

好在功夫不负有心人,这个问题就这么OK了。

转载于:https://my.oschina.net/psuyun/blog/262640

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

用itext生成指定宽和动态高的二维码图片 的相关文章

  • 不接受任何内容也不返回任何内容的函数接口[重复]

    这个问题在这里已经有答案了 JDK中是否有一个标准的函数式接口 不接受也不返回任何内容 我找不到一个 像下面这样 FunctionalInterface interface Action void execute 可运行怎么样 Functi
  • 关键字“table”附近的语法不正确,无法提取结果集

    我使用 SQL Server 创建了一个项目 其中包含以下文件 UserDAO java public class UserDAO private static SessionFactory sessionFactory static se
  • 如何区分用户点击链接和页面自动重定向?

    拥有 C WebBrowser control http msdn microsoft com en us library system windows forms webbrowser aspx在我的 WinForms 应用程序中 并意识
  • DbContext 和 ObjectContext 有什么区别

    From MSDN 表示工作单元和存储库模式的组合 使您能够查询数据库并将更改分组在一起 然后将这些更改作为一个单元写回存储 DbContext在概念上类似于ObjectContext 我虽然DbContext只处理与数据库的连接以及针对数
  • Opencv Java 灰度

    我编写了以下程序 尝试从彩色转换为灰度 Mat newImage Imgcodecs imread q1 jpg Mat image new Mat new Size newImage cols newImage rows CvType C
  • Qt - ubuntu中的串口名称

    我在 Ubuntu 上查找串行端口名称时遇到问题 如您所知 为了在 Windows 上读取串口 我们可以使用以下代码 serial gt setPortName com3 但是当我在 Ubuntu 上编译这段代码时 我无法使用这段代码 se
  • 使用自定义堆的类似 malloc 的函数

    如果我希望使用自定义预分配堆构造类似 malloc 的功能 那么 C 中最好的方法是什么 我的具体问题是 我有一个可映射 类似内存 的设备 已将其放入我的地址空间中 但我需要获得一种更灵活的方式来使用该内存来存储将随着时间的推移分配和释放的
  • 等待进程释放文件

    我如何等待文件空闲以便ss Save 可以用新的覆盖它吗 如果我紧密地运行两次 左右 我会得到一个generic GDI error
  • CMake 无法确定目标的链接器语言

    首先 我查看了this https stackoverflow com questions 11801186 cmake unable to determine linker language with c发帖并找不到解决我的问题的方法 我
  • Cmake 链接共享库:包含库中的头文件时“没有这样的文件或目录”

    我正在学习使用 CMake 构建库 构建库的代码结构如下 include Test hpp ITest hpp interface src Test cpp ITest cpp 在 CMakeLists txt 中 我用来构建库的句子是 f
  • 将 MQTTNet 服务器与 MQTT.js 客户端结合使用

    我已经启动了一个 MQTT 服务器 就像this https github com chkr1011 MQTTnet tree master例子 该代码托管在 ASP Net Core 2 0 应用程序中 但我尝试过控制台应用程序 但没有成
  • 为什么 gcc 抱怨“错误:模板参数 '0' 的类型 'intT' 取决于模板参数”?

    我的编译器是gcc 4 9 0 以下代码无法编译 template
  • 使用 %d 打印 unsigned long long

    为什么我打印以下内容时得到 1 unsigned long long int largestIntegerInC 18446744073709551615LL printf largestIntegerInC d n largestInte
  • 按 Esc 按键关闭 Ajax Modal 弹出窗口

    我已经使用 Ajax 显示了一个面板弹出窗口 我要做的是当用户按 Esc 键时关闭该窗口 这可能吗 如果有人知道这一点或以前做过这一点 请帮助我 Thanks 通过以下链接 您可以通过按退出按钮轻松关闭窗口 http www codepro
  • 不同类型指针之间的减法[重复]

    这个问题在这里已经有答案了 我试图找到两个变量之间的内存距离 具体来说 我需要找到 char 数组和 int 之间的距离 char data 5 int a 0 printf p n p n data 5 a long int distan
  • 如果没有抽象成员,基类是否应该标记为抽象?

    如果一个类没有抽象成员 可以将其标记为抽象吗 即使没有实际理由直接实例化它 除了单元测试 是的 将不应该实例化的基类显式标记为抽象是合理且有益的 即使在没有抽象方法的情况下也是如此 它强制执行通用准则来使非叶类抽象 它阻止其他程序员创建该类
  • 双枢轴快速排序和快速排序有什么区别?

    我以前从未见过双枢轴快速排序 是快速排序的升级版吗 双枢轴快速排序和快速排序有什么区别 我在 Java 文档中找到了这个 排序算法是双枢轴快速排序 作者 弗拉基米尔 雅罗斯拉夫斯基 乔恩 本特利和约书亚 布洛赫 这个算法 在许多数据集上提供
  • C++ 条件编译

    我有以下代码片段 ifdef DO LOG define log p record p else define log p endif void record char data 现在如果我打电话log hello world 在我的代码中
  • Spring Boot 无法更新 azure cosmos db(MongoDb) 上的分片集合

    我的数据库中存在一个集合 documentDev 其分片键为 dNumber 样本文件 id 12831221wadaee23 dNumber 115 processed false 如果我尝试使用以下命令通过任何查询工具更新此文档 db
  • 当从finally中抛出异常时,Catch块不会被评估

    出现这个问题的原因是之前在 NET 4 0 中运行的代码在 NET 4 5 中因未处理的异常而失败 部分原因是 try finallys 如果您想了解详细信息 请阅读更多内容微软连接 https connect microsoft com

随机推荐

  • Linux操作系统简介

    文章目录 Linux发行版简介 学习Linux的必备硬件知识 关键硬件器件 CPU 关键硬件器件 存储 关键硬件器件 内存 其他一些查看硬件信息的命令 Linux开机过程 以Ubuntu16 04为例 阶段1 BIOS 阶段2 boot L
  • 技术人修炼之道阅读笔记(一)让自己更值钱的5个能力

    如何让自己更值钱 回答这个问题 需要使用黄金圈理论 黄金圈理论是一种由内而外的思维模式 提倡 why 为什么这么做 how 如何做 what 做什么 三个圈来思考或决策 首先是 why 你因为什么而值钱 要值钱 就要时刻保持稀缺性 别人不会
  • Python网络爬虫学习笔记(四)解析库的使用

    解析库的使用 使用正则表达式 比较烦琐 而且万一有地方写错了 可能导致匹配失败 对于网页的节点来说 有 id class 或其他属性 而且节点之间还有层次关系 在网页中可以通过 XPath 或 css 选择器来定位一个或多个节点 利用 XP
  • Halcon Qt 环境一次性配置

    新建 halcon pri文件 halcon pri 内容 INCLUDEPATH C Program Files MVTec HALCON 20 11 Steady include INCLUDEPATH C Program Files
  • 六、操作系统之文件管理

    六 文件管理 文件系统的概念 文件系统时OS与用户关系最紧密的一部分 对用户来说 它是OS中最直观的部分 能否方便使用OS 以及OS的可信赖程度往往取决于文件系统的功能和性能 1 文件和文件系统 2 文件系统的功能 3
  • 18 回文字符串 (后续用动态规划再做一下)

    题目 思路 题解 方法1 思路都在代码里了 class Solution public int countSubstrings string s 每个值都作为中心值 左右两个指针 但是要考虑奇偶的情况bb 和 aba gt i前面的字符串是
  • sql_mode设置(临时or永久)

    临时和永久设置MySQL sql mode非容器方式和容器方式 MySQL 文章目录 临时和永久设置MySQL sql mode 前言 查看sql mode 临时修改sql mode 永久修改sql mode 永久修改sql mode 容器
  • 工业操作系统不是ARM吗?鸿蒙是

    未来工厂如何建 工厂要怎样的数字化平台 褚健认为 面向未来的数字化工厂建议 需要走一条大规模 低成本 生态化之路 正如移动互联时代需要安卓 iOS APP 智能工厂时代需要工厂操作系统 工业APP 工厂操作系统的基础理念包括统一的数据底座
  • ykhmi是什么触摸屏软件_一体机使用中常见问题-中达优控

    1 一体机的屏在组态软件中选择的型号 4 3寸一体机选S430A 5寸一体机选S500A 7寸一体机选S700A 10寸一体机选S1001A 2 一体机发脉冲的Y点用法 A 步进电机驱动器 伺服电机驱动器可以直接接 B 可以用来驱动指示灯
  • Java程序员不得不会的124道面试题(含答案)

    专注于编程 互联网动态 最终将总结的技术 心得 经验 数据结构与算法 源码分析等 享给大家 这里不只限于技术 还有职场心得 生活感悟 以及面经 点击上方 关注按钮 第一时间送达 多线程 并发及线程的基础问题 1 Java 中能创建 vola
  • Chandy-Lamport快照算法仿真实现

    Chandy Lamport快照算法仿真实现 分布式系统中存在的问题 在简单的非分布式环境中发现的问题 如互斥 饿死和死锁等 它们都有可能出现在分布式环境中 实际上 后一种环境下出现这些问题的可能性更大 因为它涉及到很多的实体 它们会引起混
  • 《Java基础教程案例》读书心得

    建议新入门的Java程序猿观看 书籍里面共包含 11 章内容 涵盖了Java基础的全部知识 配备了 20 个任务案例 22到思考题 这本书在我读完以后觉得还是挺不错的一本书 每章的知识点讲的还是挺详细的 最主要的还是你学过此章节的知识点后
  • 传统制造业进行转型过程当中所要面临的主要难点

    在历史上 人类经历了四次工业革命 每一次工业革命都会伴随着一个标志性事物的出现 比如蒸汽机 这标志着人类进入了蒸汽时代 这也是第一次工业革命的开始 第二次工业革命以电力的出现为代表 标志着人类进入了电力时代 以计算机的出现为代表的第三次工业
  • 使用 Kotlin Compose Desktop 实现了一个简易的"手机助手"

    1一 adbd connector adbd connector 是一个实现 adb server 和 adb daemon 之间的通信协议的库 使用 Kotlin 编写 支持 PC 端直接连接 Android 设备操作 adb 相关的指令
  • Vue命令行终端插件使用——vue-web-terminal

    今天分享一个用Vue写的网页端终端插件 可以在web页面模拟原生命令行终端实现一些高级的操作 插件地址 https github com tzfun vue web terminal npm地址 https www npmjs com pa
  • echarts两个饼图关联

    需求一开始显示两张饼图 第一张是各罪名数量的饼图 第二张是嫌疑人各文化数量的饼图 显示之后 要求点击第一个饼图的某个罪名 第二张饼图显示该罪名嫌疑人各文化数量的饼图 给第一张饼图绑定点击事件 默认传入params参数 会输出你点击的这个饼图
  • 代码启动流程

    1 新建Vue项目 vue create app 2 运行项目 yann serve 3 安装electron插件 vue add vue cli plugin electron builder 选择Electron版本 这里需要等很久 请
  • QT实现浏览器访问网页,使用QWebEngineView,支持播放mp4

    QT实现浏览器访问网页 使用QWebEngineView 支持播放mp4 参考 https blog csdn net weixin 40355471 article details 120698537 增加了调试和播放mp4的功能 屏幕放
  • moment.js

    将时间戳转换为number moment Number date format
  • 用itext生成指定宽和动态高的二维码图片

    为什么80 的码农都做不了架构师 gt gt gt 标题和摘要中都提到 本文的一个目的就是生成定宽的二维码图片 还有一个很特别的要求 打印出来得图片需要被条码枪识别 用的第三方工具类库是itext 版本是2 0 为了实现二维码的指定宽高 我