使用iTextPDF填充PDF表单时如何格式化日期时间值
日期时间格式转换实现方案
实现逻辑
在JSON值写入PDF表单前,通过字段后缀判断字段类型,对日期、时间值做对应格式转换后再赋值即可,不需要调整现有Acrobat表单的配置。
代码修改步骤
- 先全局定义线程安全的格式化器,使用Java 8+自带的
java.time包实现,避免老版SimpleDateFormat的线程安全问题:
// JSON输入的日期格式:yyyy-MM-dd private static final DateTimeFormatter INPUT_DATE_FORMAT = DateTimeFormatter.ofPattern("yyyy-MM-dd"); // PDF输出的日期格式:MM/dd/yyyy private static final DateTimeFormatter OUTPUT_DATE_FORMAT = DateTimeFormatter.ofPattern("MM/dd/yyyy"); // JSON输入的时间格式:24小时制 HH:mm private static final DateTimeFormatter INPUT_TIME_FORMAT = DateTimeFormatter.ofPattern("HH:mm"); // PDF输出的时间格式:12小时制 hh:mm a(a对应AM/PM标识) private static final DateTimeFormatter OUTPUT_TIME_FORMAT = DateTimeFormatter.ofPattern("hh:mm a", Locale.US);
- 调整原有遍历赋值的逻辑,增加格式转换判断:
for(Map.Entry<String,String> entry : jsonMap.entrySet()){ if(fields.containsKey(entry.getKey())) { logger.debug(entry.getValue()); String fieldName = entry.getKey(); String originalValue = entry.getValue(); if(originalValue.contains("data:image/png;base64")) { logger.debug("found an image!"); fields.get(fieldName).setValue(originalValue.split(",")[1]); } else { String convertedValue = originalValue; try { // 按字段后缀判断类型做转换 if(fieldName.endsWith("_Date")) { LocalDate date = LocalDate.parse(originalValue, INPUT_DATE_FORMAT); convertedValue = OUTPUT_DATE_FORMAT.format(date); } else if(fieldName.endsWith("_Time")) { LocalTime time = LocalTime.parse(originalValue, INPUT_TIME_FORMAT); convertedValue = OUTPUT_TIME_FORMAT.format(time); } } catch (DateTimeParseException e) { // 格式解析失败时保留原始值,避免阻断整个生成流程 logger.warn("字段{}的取值{}格式解析失败,使用原始值", fieldName, originalValue, e); } fields.get(fieldName).setValue(convertedValue); } } }
可选调整
- 如果不需要显示AM/PM标识,把时间输出格式的
a参数删除即可 - 如果字段没有统一的
_Date/_Time后缀,你可以提前维护两个集合分别存储所有日期字段名、时间字段名,转换前判断当前字段属于哪个集合即可
内容的提问来源于stack exchange,提问作者Connie DeCinko
相关产品推荐
相关产品推荐

