Статус: Новичок
Группы: Участники
Зарегистрирован: 22.04.2024(UTC) Сообщений: 1
|
Добрый день, подскажите пожалуйста причину ошибки Error encountered while BER decoding?
Так выглядит создание контейнера:
private byte[] createSignatureContainer(byte[] bytes, SignerInfoDto signerInfo) {
try (ByteArrayInputStream inputStream = new ByteArrayInputStream(bytes); ByteArrayOutputStream baos = new ByteArrayOutputStream()) {
PdfReader infoReader = new PdfReader(inputStream);
PdfDocument document = new PdfDocument(infoReader); int totalPages = document.getNumberOfPages(); document.close(); infoReader.close();
inputStream.reset();
PdfReader signerReader = new PdfReader(inputStream); PdfWriter writer = new PdfWriter(baos);
PdfSigner signer = new PdfSigner(signerReader, writer, new StampingProperties());
PdfSignatureAppearance appearance = signer.getSignatureAppearance();
PdfFont f1 = PdfFontFactory.createFont(fontPath, "Cp1251");
appearance.setPageRect(new Rectangle(36, 100, 170, 120)).setLayer2Font(f1).setPageNumber(totalPages);
String description = "Некоторое описание";
appearance.setLayer2Text(description); signer.setFieldName("sign-container");
PdfDictionary dictionary = new PdfDictionary(); dictionary.put(PdfName.Filter, PdfName.Adobe_PPKLite); dictionary.put(PdfName.SubFilter, PdfName.Adbe_pkcs7_detached); ExternalBlankSignatureContainer signatureContainer = new ExternalBlankSignatureContainer(dictionary); signer.signExternalContainer(signatureContainer, 16384);
return baos.toByteArray();
} catch (Exception e) { logger.error("Ошибка при создании контейнера для подписи в PDF-протоколе"); throw new PdfSigningException("Ошибка при создании контейнера для подписи в PDF-протоколе"); } }
Метод, вызывающий signDeferred:
public void insertSignature(String signingFileUri, MultipartFile signatureFile) { try { multipartFileValidator.validate(signatureFile, null);
if (!fileStorageCore.fileExists(signingFileUri)) { throw new ResourceNotFoundException("Подписываемый файл не найден"); }
byte[] signatureBytes; String base64Content = encodeToBase64(signatureFile.getInputStream()); signatureBytes = Base64.getDecoder().decode(base64Content); IExternalSignatureContainer external = new MyExternalSignatureContainer(signatureBytes); File file = new File(signingFileUri); try ( ByteArrayOutputStream byteArrayOutputStream = new ByteArrayOutputStream(); FileOutputStream outputStream = new FileOutputStream(file.getName()); InputStream is = fileStorage.readFile(signingFileUri); PdfReader reader = new PdfReader(is); PdfWriter writer = new PdfWriter(outputStream); PdfDocument document = new PdfDocument(reader, writer, new StampingProperties());) { SignatureUtil signatureUtil = new SignatureUtil(document); PdfSignature signature = signatureUtil.getSignature("sign-container");
PdfSigner.signDeferred(document, "sign-container", outputStream, external);
is.close(); byteArrayOutputStream.writeTo(outputStream); } catch (Exception e) { logger.error("Ошибка при вставке ЭЦП: {}", e.getMessage(), e); return; } } catch (Exception e) { logger.error(e); } }
Таким образом выглядит мой простенький класс контейнера:
class MyExternalSignatureContainer implements IExternalSignatureContainer {
private byte[] signature;
public MyExternalSignatureContainer(byte[] signature) { this.signature = signature; }
public void modifySigningDictionary(PdfDictionary signDic) { }
@Override public byte[] sign(InputStream arg0) throws GeneralSecurityException { return signature; } }
|
|
|
|
Быстрый переход
Вы не можете создавать новые темы в этом форуме.
Вы не можете отвечать в этом форуме.
Вы не можете удалять Ваши сообщения в этом форуме.
Вы не можете редактировать Ваши сообщения в этом форуме.
Вы не можете создавать опросы в этом форуме.
Вы не можете голосовать в этом форуме.
Important Information:
The Форум КриптоПро uses cookies. By continuing to browse this site, you are agreeing to our use of cookies.
More Details
Close