使用 HIBC 在 Java 中对 PDF 进行条形码签名
如果您正在构建制药或医疗保健物流软件,可能已经遇到纸质跟踪、签名丢失和审计噩梦的难题。在 PDF 上使用条形码签名——尤其是 HIBC 数据矩阵或 QR 码——可以创建防篡改、机器可读的痕迹,能够经受打印、扫描和监管审查。在本教程中,您将看到如何使用 GroupDocs.Signature for Java 将数据矩阵和 QR 条形码同时添加到 PDF 中。
快速答案
- 什么库在 Java 中处理 HIBC 条形码? GroupDocs.Signature for Java。
- 哪种条形码格式最紧凑? Data Matrix – 适用于小标签。
- 我可以在同一个 PDF 中同时添加 QR 和 Data Matrix 吗? 是的,只需创建单独的
QrCodeSignOptions。 - 运行时需要互联网连接吗? 不需要,库在安装后可完全离线工作。
- 推荐使用哪个 Java 版本? Java 11+ 以获得生产级性能。
什么是 HIBC 条形码 PDF 签名?
Signature 是 GroupDocs.Signature 的核心类,代表 PDF 文档并支持嵌入数字签名。GroupDocs.Signature for Java 中的 Signature 类提供将 HIBC 条形码作为数字签名嵌入的方法。通过使用 HIBC 条形码对 PDF 进行签名,您可以创建可验证、防篡改的记录,供应链中的任何环节都可以扫描。
为什么要同时使用 Data Matrix 和 QR 码?
Data Matrix 提供最小的占用空间,同时可容纳多达 2,335 个字母数字字符,非常适合密集的标签区域。QR 码则支持多达 4,296 个字符,并且可以被智能手机普遍读取。将两者结合,可在空间效率和数据容量之间取得最佳平衡,确保从仓库扫描仪到移动应用的所有利益相关者都能读取所需信息。
前提条件
- JDK 11 或更高(Java 8 也可运行,但推荐使用 Java 11+ 以获得最佳性能)。
- IDE,如 IntelliJ IDEA、Eclipse 或带有 Java 扩展的 VS Code。
- Maven 或 Gradle 用于依赖管理(示例见下)。
- 示例 PDF(例如
sample.pdf)用于测试实现。 - 有效的 GroupDocs.Signature 许可证(开发阶段免费试用,生产环境需付费许可证)。
为 Java 设置 GroupDocs.Signature
Maven 配置
将依赖添加到您的 pom.xml:
<dependency>
<groupId>com.groupdocs</groupId>
<artifactId>groupdocs-signature</artifactId>
<version>23.12</version>
</dependency>
Gradle 配置
对于 Gradle 项目,将以下内容添加到您的 build.gradle:
implementation 'com.groupdocs:groupdocs-signature:23.12'
直接下载选项
您也可以直接从 GroupDocs.Signature for Java 发布 下载 JAR 文件,并手动将其添加到项目的类路径中。这种方式在受限网络环境下效果良好。
获取许可证
向 GroupDocs 申请免费试用或临时许可证,以去除水印并解锁所有功能。生产部署需要购买许可证。
基本初始化
Signature 是所有签名操作的入口。它加载 PDF,应用条形码,并写入签名文件。
import com.groupdocs.signature.Signature;
class InitializeSignature {
public static void main(String[] args) {
Signature signature = new Signature("sample.pdf");
// Proceed with signing operations...
}
}
如何使用 HIBC 条形码创建 Data Matrix PDF?
实例化 Signature 并提供源 PDF,将 QrCodeSignOptions 设置为 Data Matrix 格式,提供正确格式的 HIBC 字符串,然后调用 sign()。库会将签名后的 PDF 写入目标位置,保持布局并将条形码嵌入为防篡改签名。
QrCodeSignOptions 指定签名的条形码类型、内容、大小和放置位置。
- 导入所需的类 – 这些类提供签名引擎和 Data Matrix 选项的访问。
import com.groupdocs.signature.Signature;
import com.groupdocs.signature.options.sign.QrCodeSignOptions;
import com.groupdocs.signature.domain.qrcodes.QrCodeTypes;
- 实例化
Signature对象,使用源文件和目标文件的绝对路径。
String sourceFilePath = "YOUR_DOCUMENT_DIRECTORY";
String destinFilePath = "YOUR_OUTPUT_DIRECTORY/SignWithHIBCLICQR.pdf";
final Signature signature = new Signature(sourceFilePath);
- 配置 Data Matrix 选项 – 设置 HIBC 字符串,选择
QrCodeTypes.HIBCLICDataMatrix,并定义放置坐标。QrCodeTypes列举了 HIBC 签名支持的条形码格式。
QrCodeSignOptions hibcLic_QR = new QrCodeSignOptions("A123PROD30917/75#422011907#GP293", QrCodeTypes.HIBCLICQR);
hibcLic_QR.setLeft(1); // Set the position from left
hibcLic_QR.setTop(1); // Set the position from top
hibcLic_QR.setReturnContent(true); // Return content after signing
hibcLic_QR.setReturnContentType(FileType.PNG); // Specify return content type as PNG
- 将签名应用 到 PDF。
signature.sign(destinFilePath, hibcLic_QR);
- 释放资源,以关闭文件句柄并避免内存泄漏。
finally {
if (signature != null) signature.dispose();
}
完整工作示例
以下是单块完整流程(占位符代表您从前面代码片段中复制的确切代码):
import com.groupdocs.signature.Signature;
import com.groupdocs.signature.options.sign.QrCodeSignOptions;
import com.groupdocs.signature.domain.qrcodes.QrCodeTypes;
public class HibcQrSigning {
public static void main(String[] args) {
String sourceFilePath = "sample.pdf";
String destinFilePath = "output/SignWithHIBCLICQR.pdf";
Signature signature = null;
try {
signature = new Signature(sourceFilePath);
QrCodeSignOptions hibcLic_QR = new QrCodeSignOptions(
"A123PROD30917/75#422011907#GP293",
QrCodeTypes.HIBCLICQR
);
hibcLic_QR.setLeft(1);
hibcLic_QR.setTop(1);
hibcLic_QR.setReturnContent(true);
hibcLic_QR.setReturnContentType(FileType.PNG);
signature.sign(destinFilePath, hibcLic_QR);
System.out.println("PDF signed successfully with HIBC QR code");
} catch (Exception e) {
System.err.println("Error signing PDF: " + e.getMessage());
e.printStackTrace();
} finally {
if (signature != null) signature.dispose();
}
}
}
直接答案(40–70 字)
要 创建 Data Matrix PDF,实例化 Signature 并提供源 PDF,将 QrCodeSignOptions 设置为 QrCodeTypes.HIBCLICDataMatrix 并提供正确格式的 HIBC 字符串,然后调用 signature.sign(outputPath, options)。库会将签名后的 PDF 写入目标位置,保持布局并将条形码嵌入为防篡改签名。
如何使用 GroupDocs.Signature 向 PDF 添加 QR 码?
加载 PDF,配置 QrCodeSignOptions 为 QR 格式,然后调用 sign()。库会缩放 QR 图像以提高可读性,并根据您设置的坐标进行定位,避免与现有内容重叠。这确保条形码在打印后仍可扫描,并符合 HIBC 标准。
QrCodeSignOptions 定义 QR 条形码的内容、大小和位置。
- 导入 QR 专用类
QrCodeSignOptions hibcLic_AZ = new QrCodeSignOptions("A123PROD30917/75#422011907#GP293", QrCodeTypes.HIBCLICAztec);
hibcLic_AZ.setLeft(1); // Set the position from left
hibcLic_AZ.setTop(200); // Set the position from top
hibcLic_AZ.setReturnContent(true); // Return content after signing
hibcLic_AZ.setReturnContentType(FileType.PNG); // Specify return content type as PNG
- 创建并配置 QR 选项 – 注意使用
QrCodeTypes.HIBCLICQR。
signature.sign(destinFilePath, hibcLic_AZ);
- 签署文档
QrCodeSignOptions hibcLic_DM = new QrCodeSignOptions("A123PROD30917/75#422011907#GP293", QrCodeTypes.HIBCLICDataMatrix);
hibcLic_DM.setLeft(1); // Set the position from left
hibcLic_DM.setTop(400); // Set the position from top
hibcLic_DM.setReturnContent(true); // Return content after signing
hibcLic_DM.setReturnContentType(FileType.PNG); // Specify return content type as PNG
直接答案: 在
QrCodeSignOptions中使用QrCodeTypes.HIBCLICQR,设置 HIBC 内容字符串,使用setLeft()和setTop()定位代码,然后调用signature.sign(outputPath, options)。QR 条形码会立即嵌入,随时可供智能手机或扫描仪捕获。
常见错误避免
1. 忘记释放资源
错误:
Signature signature = new Signature("sample.pdf");
signature.sign(destinFilePath, options);
// Oops, no dispose() call
修复: 将 Signature 用法放入 try‑with‑resources 块中,或在 finally 子句中显式调用 close()。
2. 使用不正确的 HIBC 格式字符串
错误: 使用诸如 “12345” 的通用字符串。
修复: 遵循 HIBCC 标准(例如 A123PROD30917/75#422011907#GP293)。使用 HIBCC 在线验证器 进行验证。
3. 硬编码文件路径
错误:
String sourceFilePath = "C:/Users/John/Documents/test.pdf";
修复: 将路径存储在配置文件或环境变量中,并在运行时读取。
4. 忽视条形码位置冲突
将条形码放置在现有文本或签名之外。使用 PDF 坐标(原点在左下角),并使用打印样本进行测试。
5. 未使用真实扫描仪进行测试
打印签名后的 PDF,并使用工作流中实际使用的硬件进行扫描。验证在不同打印质量下的可读性。
医疗保健中的实际应用
| 场景 | 推荐条形码 | 适用原因 |
|---|---|---|
| 药品分销 | QR Code | 高数据容量,智能手机广泛扫描。 |
| 库存管理 | Data Matrix | 占用空间小,适用于密集的货架标签。 |
| 合规监管(FDA 21 CFR Part 11) | QR + Data Matrix | 双格式提供冗余和可审计性。 |
| 医疗器械追踪 | Aztec Code | 紧凑尺寸适用于空间受限的包装。 |
性能考虑因素与最佳实践
批处理模式
List<String> filesToSign = getFileList();
for (String filePath : filesToSign) {
Signature signature = null;
try {
signature = new Signature(filePath);
// Sign and save
} finally {
if (signature != null) signature.dispose();
}
}
- 为每个文件创建新的
Signature实例,以保持内存使用低。 - 使用固定线程池(
Executors.newFixedThreadPool(Runtime.getRuntime().availableProcessors() - 1))进行并行处理,但要监控堆大小,因为每个Signature会在内存中保存完整的 PDF。
保持库更新
GroupDocs 的更新可将处理速度提升至 20 %,并添加新的 HIBC 合规功能。建议每季度进行依赖检查。
缓存模板
一次加载 PDF 模板,针对每种条形码变体进行克隆并签名这些克隆。这样可减少 I/O 并加快大批量工作流的速度。
常见问题解答
Q: GroupDocs.Signature 能签署除 PDF 之外的文件类型吗?
A: 可以,它同样支持 DOCX、XLSX、PPTX、PNG、JPEG 和 TIFF,使用相同的条形码签名 API。
Q: 如何排查 “Invalid barcode content” 错误?
A: 确认您的 HIBC 字符串严格遵循 HIBCC 语法,使用在线验证器,并确保为所选格式使用正确的 QrCodeTypes 常量。
Q: 每种 HIBC 格式的最大数据容量是多少?
A: QR ≈ 4,296 个字母数字字符,Aztec ≈ 3,832 个数字 / 3,067 个字母数字,Data Matrix ≈ 3,116 个数字 / 2,335 个字母数字。为获得最佳扫描可靠性,建议将代码长度保持在 200 字符以下。
Q: 能在同一个 PDF 中嵌入多种条形码类型吗?
A: 完全可以。为不同位置创建单独的 QrCodeSignOptions 对象,并对每个调用 signature.sign()。只需确保它们不重叠。
Q: 运行时签名是否需要互联网连接?
A: 不需要。将 JAR 放入类路径并激活许可证后,所有操作均在本地完成。
其他资源
最后更新: 2026-09-15
测试环境: GroupDocs.Signature 23.12 for Java
作者: GroupDocs