关于JHove能否在程序内直接获取输出而非仅写入文件的技术问询
解决JHove程序内获取TIFF验证输出的方案
是的,完全可以通过实现JHove的Handler接口编写自定义处理器,直接在程序内捕获验证输出,无需依赖文件写入。以下是具体实现步骤和示例代码:
1. 自定义Handler实现类
JHove的Handler接口定义了处理模块输出的方法,我们可以实现这个接口,将验证数据存储到内存对象中,而不是写入文件。
示例代码:
import edu.harvard.hul.ois.jhove.*; import java.util.ArrayList; import java.util.List; public class InMemoryTiffHandler implements Handler { private List<String> validationMessages = new ArrayList<>(); private RepInfo repInfo; @Override public void setBase(String base) {} @Override public void setOutputDir(String outputDir) {} @Override public void setEncoding(String encoding) {} @Override public void setErrorStream(java.io.PrintStream errorStream) {} @Override public void setInfoStream(java.io.PrintStream infoStream) {} @Override public void setVerbosity(int verbosity) {} @Override public void setTempDirectory(String tempDirectory) {} @Override public void initialize() throws Exception {} @Override public void show(RepInfo info) throws Exception { // 核心方法:接收验证结果RepInfo对象 this.repInfo = info; // 提取关键验证信息存入内存 validationMessages.add("文件格式: " + info.getFormat()); validationMessages.add("文件状态: " + info.getStatus()); validationMessages.add("验证通过: " + info.isWellFormed()); validationMessages.add("验证有效: " + info.isValid()); // 提取错误/警告消息 if (!info.getMessages().isEmpty()) { validationMessages.add("验证消息:"); for (Message msg : info.getMessages()) { validationMessages.add(String.format("[%s] %s", msg.getType(), msg.getMessage())); } } } @Override public void terminate() throws Exception {} // 提供获取验证结果的方法 public List<String> getValidationMessages() { return validationMessages; } public RepInfo getRepInfo() { return repInfo; } }
2. 在程序中使用自定义Handler调用JHove验证
创建JHove的JhoveBase实例,配置TIFF模块,传入自定义Handler执行验证后,直接从Handler中获取结果。
示例代码:
import edu.harvard.hul.ois.jhove.*; import java.util.List; public class TiffValidationDemo { public static void main(String[] args) throws Exception { // 初始化JHove基础配置 JhoveBase jhove = new JhoveBase(); jhove.init(); // 获取TIFF验证模块 Module tiffModule = jhove.getModule("TIFF-hul"); if (tiffModule == null) { throw new Exception("未找到TIFF验证模块"); } // 创建自定义内存Handler InMemoryTiffHandler customHandler = new InMemoryTiffHandler(); // 配置待验证文件路径 String filePath = "path/to/your/tiff/file.tif"; String[] jhoveArgs = new String[]{"-m", "TIFF-hul", filePath}; // 执行验证 jhove.process(jhoveArgs, tiffModule, customHandler); // 直接从Handler中获取验证结果 List<String> results = customHandler.getValidationMessages(); RepInfo repInfo = customHandler.getRepInfo(); // 输出或使用结果 System.out.println("TIFF验证结果:"); for (String msg : results) { System.out.println(msg); } // 直接操作RepInfo获取更详细数据 if (!repInfo.isWellFormed()) { System.err.println("文件格式不规范"); } } }
3. 关键说明
RepInfo是JHove验证结果的核心载体,包含文件格式、合规状态、错误/警告消息等所有验证数据,可直接从中提取所需信息。- 自定义Handler的
show()方法是接收验证结果的关键入口,所有验证完成后的数据都会通过这个方法传递。 - 确保项目引入JHove核心库和TIFF模块的依赖,可通过Maven或手动添加jar包实现。
内容的提问来源于stack exchange,提问作者JB007
相关产品推荐
相关产品推荐

