You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

关于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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.06.20 10:25:04