Дайджест 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.