Assinar em mais de uma pagina iText

4 respostas
java
R

Olá, tenho uma aplicação que assina digitalmente PDF’s usando a api iText consigo assinar em qualquer pagina e em qualquer lugar, mas não consigo repetir a assinatura em todas as paginas… tentei criar um PdfAnnotation.createFreeText para copiar o texto da assinatura e replica-lo nas paginas, porem no leitor de PDF do computador ele interpreta de maneira diferente do navegador.
No computador fica certo:
PC

No navegador ele perde a configuração da caixa e fica em amarelo como uma anotação:

Minha duvida e como posso assinar em todas as paginas? e se não for possivel, como faço pra criar um campo de texto ou algo do tipo no final de cada pagina?

4 Respostas

J

Como voce nao postou o código, não dá pra saber o que fez. No geral segue esse exemplo: https://developers.itextpdf.com/examples/page-events/page-events-headers-and-footers

R
private ByteArrayOutputStream criarStampas(PdfReader reader, String textoAss, Rectangle rectangle, String metodo)

throws DocumentException, IOException, DocumentException {

ByteArrayOutputStream out = new ByteArrayOutputStream();

reader = new PdfReader(this.file);

Integer pageCount = Integer.valueOf(reader.getNumberOfPages());

PdfStamper stp1 = new PdfStamper(reader, out, ‘\003, true);
if(metodo.equals("planoDeEnsino")) {
		PdfContentByte pcb = stp1.getOverContent(1);
		textoAss = "\n\n"+textoAss;
		for (int i = 1; i < pageCount.intValue(); i++) {
			
			PdfAnnotation stp = PdfAnnotation.createFreeText(stp1.getWriter(), rectangle, textoAss, pcb);
			stp.setBorderStyle(new PdfBorderDictionary(0, PdfBorderDictionary.STYLE_SOLID));
			stp.put(PdfName.DS, new PdfString("font: Times Roman 10.0pt; font-stretch: Normal; text-alig: left; line-height: 9.2;"));
			stp1.addAnnotation(stp, i);
			System.out.println(" criar estampa " + i);
		}
		stp1.close();
		out.close();
	}else {
		Integer lowerX = Integer.valueOf(0);
		Integer upperX = Integer.valueOf(50);
		
		AcroFields af = reader.getAcroFields();
		if (af != null) {
			ArrayList<String> names = af.getSignatureNames();
			if ((names != null) && (!names.isEmpty())) {
				Integer index = upperX;
				upperX = Integer.valueOf(upperX.intValue() * names.size());
				lowerX = Integer.valueOf(lowerX.intValue() + upperX.intValue());
				upperX = Integer.valueOf(upperX.intValue() + index.intValue());
			}
		}
		
		PdfFormField sig = PdfFormField.createSignature(stp1.getWriter());
		sig.setWidget(new Rectangle(lowerX.intValue(), 0.0F, upperX.intValue(), 25.0F), null);
		sig.setFlags(4);
		sig.put(PdfName.DA, new PdfString("/Helv 0 Tf 0 g"));
		sig.setFieldName(this.name);
		sig.setPage(1);
		for (int i = 1; i <= pageCount.intValue(); i++) {
			stp1.addAnnotation(sig, i);
		}
		stp1.close();
		out.close();
	}
	
	return out;
}

onde eu crio as anotações.

J

Segue o exemplo que te passei.

R

Consegui resolver com o código abaixo:

filename = filename + "_signed.pdf";

		File fileToWrite = File.createTempFile(filename, null);
		reader = new PdfReader(this.file);

		fow = new FileOutputStream(fileToWrite);
		stamper = PdfStamper.createSignature(reader, fow, '\000');
		
		Font fontcabecatable = new Font(Font.FontFamily.TIMES_ROMAN, 10, Font.NORMAL);
		PdfSignatureAppearance appearance = stamper.getSignatureAppearance();
		appearance.setLayer2Font(fontcabecatable);
		appearance.setLayer2Text(textoAss);
		appearance.setSignDate(Calendar.getInstance());
		
		Integer pageCount = Integer.valueOf(reader.getNumberOfPages());
		System.out.println("pageCount "+pageCount);
		
		
		if(position.equals("planoDeEnsino") ) {
			textoAss = "\n"+textoAss;
			
			for(int i = 2; i <= pageCount; i++) {
				PdfContentByte pcb = stamper.getUnderContent(i);
				Paragraph p = new Paragraph(textoAss);
				p.setFont(fontcabecatable);
				p.setLeading((float) 10);
				ColumnText ct = new ColumnText(pcb);
				ct.setSimpleColumn(positionSignature(position));
				ct.addElement(p);
				ct.go();
			}
		}
		
		appearance.setVisibleSignature(positionSignature(position),pagina, null);
Criado 20 de setembro de 2018
Ultima resposta 20 de set. de 2018
Respostas 4
Participantes 2