2013-03-28 1 views
0

Я создал отчет, содержащий 3 страницы с помощью iReport. Теперь подпись появляется только на одной странице. Но мне нужно подписать каждую страницу с помощью iText.Цифровая подпись на каждой странице с помощью iText

PdfReader reader = new PdfReader(fullFilePath); 

String outputPath = reportPath + randomUUID + fileExtension; 
FileOutputStream fout = new FileOutputStream(outputPath); 
stp = PdfStamper.createSignature(reader, fout, '\0', null, true); 
PdfSignatureAppearance sap = stp.getSignatureAppearance(); 
sap.setCrypto(key, chain, null,PdfSignatureAppearance.SELF_SIGNED); 
sap.setReason("test"); 
sap.setLocation("test"); 

String imagePath = servletContextPath + "/resources/img/signature.png"; 
File file = new File(imagePath); 
byte[] imageByte = new byte[(int) file.length()]; 

try (FileInputStream fileInputStream = new FileInputStream(file)) { 
    fileInputStream.read(imageByte); 
    Image image = Image.getInstance(imageByte); 
    sap.setImage(image); 
} 

// comment next line to have an invisible signature 
for (int page = 1; page <= reader.getNumberOfPages(); page++){ 
    sap.setVisibleSignature(signatureRectangle, page, null); 
} 
+1

Вам нужна одна подпись на странице или одна глобальная подпись с визуализацией на каждой странице? – mkl

+0

одна глобальная подпись с визуализацией на каждой странице. – ziha

+0

Cf. Мой ответ, что невозможно с iText как есть (можно, конечно, расширить iText). Кроме того, юридическая ценность таких подписей с множественными визуализациями сомнительна, и зрители в формате PDF могут, таким образом, начать отказываться от таких подписей в будущем. – mkl

ответ

1
sap.setVisibleSignature(signatureRectangle, page, null); 

наборы визуальное представление, не добавить другой. Поэтому все ваши вызовы этого метода в вашем цикле, но последние, бесполезны.

Код создания подписи IText как есть, может создавать только одно визуальное представление на подпись, и, хотя это возможно в соответствии со спецификацией, например, несколько виджетов, визуализирующих одну и ту же подпись, пользователи PDF могут отклонить ее, поскольку юридическое значение подписи с несколькими визуализациями сомнительно.

EDIT:

Adobe, например, в их Digital Signature Appearances v9 белой бумаге пишут:

Место подписи в документе может иметь отношение к его правового смысла. По этой причине поля подписи никогда не ссылаются на несколько аннотаций. Если более чем одно местоположение связано с подписью, значение может стать неоднозначным.

Таким образом, они могут в будущем прекратить принимать подписи с несколькими аннотациями (то есть визуализацией) в целом.

+0

Вы имеете в виду, что нельзя использовать одну и ту же подпись на нескольких страницах? – ziha

+1

Нет, я сказал что-то другое: iText as is не поддерживает * легкое * создание таких подписей из коробки, а зрители в формате PDF могут * в будущем * решают отклонить такие подписи из-за юридических проблем. Это * не * невозможно. – mkl

+0

спасибо, что посмотрели .. – ziha

0

Помимо юридических вопросов, если вы все еще хотите подписать все страницы с помощью Itext api (версия 5.5. *), Вам нужно немного взломать метод preClose(HashMap<PdfName, Integer> exclusionSizes) класса PdfSignatureAppearance, в котором внешний вид подписи включен в страницы.

поиск writer.addAnnotation(sigField, pagen); линии внутри PdfSignatureAppearance класса и заменить

for (int p = 1; p <= writer.reader.getNumberOfPages(); p++) { 
    writer.addAnnotation(sigField, p); 
} 

Он добавить ссылку подписи на всех страницах.

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