2015-03-30 1 views
1

Я использую IText 5.5.5 для Java, и я хотел бы создать подписанный PDF с внешней подписью следующим образом:IText Java Подписание PDF DocumentException: Не хватает мест

Возьмите PDF документ, который должен быть подписан и создать PDF с пустой подписью и обеспечить кодировкой Base64 байт должен быть подписан внешним механизмом подписи:

PdfReader reader = new PdfReader(src); 
FileOutputStream os = new FileOutputStream(dest); 
PdfStamper stamper = PdfStamper.createSignature(reader, os, '\0'); 
PdfSignatureAppearance appearance = stamper.getSignatureAppearance(); 
appearance.setVisibleSignature(new Rectangle(36, 748, 144, 780), 1, "test"); 
appearance.setCertificate(chain[1]); 
ExternalSignatureContainer external = new ExternalBlankSignatureContainer(PdfName.ADOBE_PPKLITE, PdfName.ADBE_PKCS7_DETACHED); 
MakeSignature.signExternalContainer(appearance, external, 8192); 

InputStream is = appearance.getRangeStream(); 
byte[] toSign = getBytes(is); 
this.b64String = new String(Base64.encode(toSign)); 

b64String Знак с внешним механизмом подписи обеспечивая подпись, как PKCS # 7 подписал данные в base64.

Создать ExternalSignatureContainer иметь только PKCS # 7 подписали данные от внешнего механизма подписания:

public class MyExternalSignatureContainer implements ExternalSignatureContainer { 
    protected byte[] sig; 

    public MyExternalSignatureContainer(byte[] sig) { 
     this.sig = sig; 
    } 

    @Override 
    public void modifySigningDictionary(PdfDictionary arg0) { 
    } 

    @Override 
    public byte[] sign(InputStream arg0) throws GeneralSecurityException { 
     return sig; 
    } 
} 

Создать подписанный PDF документ с MyExternalSignatureContainer:

PdfReader reader = new PdfReader(dest); 
FileOutputStream os = new FileOutputStream(signedpdf); 
ExternalSignatureContainer external = new MyExternalSignatureContainer(signedData); 
MakeSignature.signDeferred(reader, "test", os, external); 

Но я на последней строке MakeSignature.signDeferred(reader, "test", os, external); в следующее исключение:

com.itextpdf.text.DocumentException: Not enough space 

Где проблема и как ее решить?

+0

Проверьте ссылку, и я надеюсь, что это вам поможет. http://stackoverflow.com/questions/17149053/cant-add-ltv-to-pdf-document-error –

+0

Эй, можете ли вы помочь мне в этом, у меня есть строка PKCS7 (получена как ответ от api) «MIILwwYJKoZIhvcNAQcCoIILtDCCC7ACAQExDzANBglghkgBZQMEAgEFADALBgkqkiG9w0BBwGg ..........» – Mudit

+0

И мне нужно подписать pdf-файл, используя его. Я просмотрел ваш код, но я не могу понять, как его применять. Пожалуйста, помогите – Mudit

ответ

1

Вы сделали оценку, что подпись будет вписываться в 8192 байта. Однако количество байтов подписи byte[] превышает 8192, поэтому исключение Недостаточно места. Например: ваш внешний контейнер подписи возвращает подпись, которая измеряет 10000 байт. iText сообщает вам, что 10000 больше, чем 8192, и что вы спрашиваете то, что невозможно.

Как исправить это: сделайте лучшую оценку при создании PDF-файла с пустой подписью.

+0

ОК, поэтому я вижу, что байты данных, подписанные PKCS # 7, имеют 54916 байт. Поэтому я сделал изменение в оценке следующим: 'MakeSignature.signExternalContainer (внешний вид, внешний, 55000);'. Тогда нет никакого исключения, но файл, сохраненный в 'signedpdf', имеет 0 байт. Что не так? – user1563721

+0

У меня нет хрустального шара. Я не знаю, почему что-то, что работает для меня (и многих других людей), не работает для вас. –

+0

Я понял, что подписанный файл был сохранен после остановки сервера приложений (не знаю, почему он не был сохранен сразу после вызова 'MakeSignature'). Похоже, что эта проблема не связана с библиотекой itext, а находится где-то на сервере приложений WildFly 8. Вышеупомянутое устраняет исключение «Недостаточно пространства». – user1563721

1

Скажите ваш контейнер размер оценивается:

MakeSignature.signExternalContainer(appearance, external, 0); 

Согласно MakeSignature API

estimatedSize - зарезервированной размера для подписи. Будет оценено, если 0

Смежные вопросы