Дайджест SHA1 из двух PDF-файлов отличается, но при конвертации в PDF/A равен

Я генерирую два PDF-файла из яшмы, передавая одинаковые параметры им обоим, когда я хеширую эти два PDF-файла, их хеш-код отличается, что, я думаю, является правильным результатом, поскольку, несмотря на то, что они имеют одинаковое содержимое, они были созданы в разное время. Но когда я конвертирую эти два PDF-файла в PDF/A, их sha1-хэш становится равным.

Может кто-нибудь помочь мне с этим вопросом? Как это возможно?

РЕДАКТИРОВАТЬ:

  private static final String OUTPUT_FORMAT = "fi_pdfa";

  public void convert(String exeFullPath, String inputFile,
                    String outputFile, String fontDirectory) {
    String[] execParams = new String[4];

    execParams[0] = exeFullPath;

    execParams[1] = "\"inputpath_u=" + base64Encode(inputFile) + "\"";
    execParams[2] = "\"outputpath_u=" + base64Encode(outputFile) + "\"";
    execParams[3] = "\"outputid=" + OUTPUT_FORMAT + "\"";

  //  execParams[1] = "inputpath_u=\"" + base64Encode(inputFile) + "\"";
  //  execParams[2] = "outputpath_u=\"" + base64Encode(outputFile) + "\"";
  //  execParams[3] = "outputid=" + OUTPUT_FORMAT;
  //  execParams[4] = "fontdirectory=\"" + fontDirectory + "\"";

    Runtime runtime = Runtime.getRuntime();
    Process process = null;
    ExportStatusCode statusCode = null;
    ExportShutdownHook shutdownHook = null;
    try {
        process = runtime.exec(execParams);


        // Install a shutdown hook to perform cleanup if we're interrupted.
        shutdownHook = new ExportShutdownHook(process);
        runtime.addShutdownHook(shutdownHook);

        process.waitFor();
        InputStream is = process.getInputStream();
        BufferedReader reader = new BufferedReader(new InputStreamReader(is));

        String line = null;
        while ((line = reader.readLine()) != null)
           System.out.println(line);
        reader.close(); 
        runtime.removeShutdownHook(shutdownHook);
        shutdownHook.finished();

        statusCode = new ExportStatusCode(process.exitValue());
    } catch (IOException ex) {
        log.error(ex);
        if (shutdownHook != null) {
            runtime.removeShutdownHook(shutdownHook);
            shutdownHook.finished();
        }
        statusCode = ExportStatusCode.SCCERR_JAVA_IO_ERROR;
    } catch (InterruptedException ex) {
        log.error(ex);
        runtime.removeShutdownHook(shutdownHook);
        shutdownHook.finished();
        process.destroy();
        statusCode = ExportStatusCode.SCCERR_JAVA_INTERRUPTED;
    }
}

1 ответ

Судя по описанию, я не считаю, что это проблема вашего кода, так же как и используемого конвертера PDF/A.

Есть некоторые функции PDF, которые требуют или предлагают использовать временную метку (например, цифровые подписи, аннотации, словари PieceInfo), и есть некоторые функции, которые требуют или предлагают использовать уникальный идентификатор.

Справочник PDF настоятельно рекомендует производителям PDF создавать идентификаторы файлов (хранящиеся в массиве в словаре трейлера), поэтому даже если остальные файлы были созданы одинаково, записи идентификаторов в словаре трейлера должны быть уникальными и вызывать значение хеш-функции для файлы должны отличаться... что строго указывает на то, что массив идентификаторов либо не заполняется конвертером PDF, либо что генерация идентификаторов имеет недостатки; Это можно проверить, открыв два PDF-файла в Hex Viewer и прокрутив файл до конца.

Отказ от ответственности: Когда-то я предоставлял техническую поддержку для продуктов OutsideIn.

Другие вопросы по тегам