Если у вас есть необходимые сертификаты, CRL, и ответы OCSP доступных в виде байтовых массивов, вы можете добавить их к магазину безопасности Документа, как это с помощью PDFBox:
COSDictionary dss = createDssDictionary(certifiates, crls, ocspResponses);
делает использование этих вспомогательных методов:
COSDictionary createDssDictionary(Iterable<byte[]> certifiates, Iterable<byte[]> crls, Iterable<byte[]> ocspResponses) throws IOException
{
final COSDictionary dssDictionary = new COSDictionary();
dssDictionary.setNeedToBeUpdate(true);
dssDictionary.setName(COSName.TYPE, "DSS");
if (certifiates != null)
dssDictionary.setItem(COSName.getPDFName("Certs"), createArray(certifiates));
if (crls != null)
dssDictionary.setItem(COSName.getPDFName("CRLs"), createArray(crls));
if (ocspResponses != null)
dssDictionary.setItem(COSName.getPDFName("OCSPs"), createArray(ocspResponses));
return dssDictionary;
}
COSArray createArray(Iterable<byte[]> datas) throws IOException
{
COSArray array = new COSArray();
array.setNeedToBeUpdate(true);
if (datas != null)
{
for (byte[] data: datas)
array.add(createStream(data));
}
return array;
}
COSStream createStream(byte[] data) throws IOException
{
RandomAccessBuffer storage = new RandomAccessBuffer();
COSStream stream = new COSStream(storage);
stream.setNeedToBeUpdate(true);
final OutputStream unfilteredStream = stream.createUnfilteredStream();
unfilteredStream.write(data);
unfilteredStream.flush();
return stream;
}
Вы можете добавить такой словарь DSS для исходного документа в качестве дополнительных обновлений, как это:
try ( InputStream source = ...;
FileOutputStream fos = new FileOutputStream(resultFile);
FileInputStream fis = new FileInputStream(resultFile);
)
{
byte[] inputBytes = IOUtils.toByteArray(source);
PDDocument pdDocument = PDDocument.load(new ByteArrayInputStream(inputBytes));
PDDocumentCatalog catalog = pdDocument.getDocumentCatalog();
catalog.getCOSObject().setNeedToBeUpdate(true);
catalog.getCOSDictionary().setItem(COSName.getPDFName("DSS"), dss);
fos.write(inputBytes);
pdDocument.saveIncremental(fis, fos);
pdDocument.close();
}
Ваше использование 'InMemoryDocument', кажется, указывает на то, что вы используете соединение sd-dss для EU. Текущая версия разработки 4.5-SNAPSHOT этого проекта использует PDFBox 1.8.8. Я еще не видел чистого способа использования механизма увеличения PDFBox 1.8.x для чего угодно, кроме добавления подписей. Если я правильно вас понимаю, вы хотите добавить информацию, относящуюся к валидации, в словарь DSS, не добавляя метку времени документа. Таким образом, вам потребуется инкрементное обновление. Я боюсь, что нет простого способа сделать это, возможно, вам придется немного улучшить PDFBox. – mkl
yes Я использую sd-dss для расширения документов до уровня LTA. Например, у меня есть документ, который имеет 1 подпись и 1 временную метку от TSA. В этом случае лицо, подписавшее подпись, не включило информацию об отзыве. Таким образом, adobe скажет, что подпись не поддерживает LTV, а временная метка. Мой вопрос заключается в том, как я могу добавить информацию об аннулировании подписки в словарь DSS. – Hugo
Я попытаюсь изучить это в течение долгих выходных, чтобы начать сейчас. Как уже упоминалось выше, я еще не видел простого способа достижения необходимого, то есть постепенного обновления с помощью PDFBox для чего-то другого, кроме подписи. – mkl