PDFStamper.close()

0 respostas
J

Bom dia Pessoal,
Gostaria que me ajudassem com uma questão.
Tenho um assinador digital que é uma applet.
Essa applet assina um arquivo pdf, usando a API iText.
O assinador funciona perfeitamente em todas as máquinas exceto em uma máquina só, que na hora de fechar o arquivo (PDFStamper.close())
me retorna a seguinte exceção:

java.lang.NoSuchFieldError: INSTANCE
at com.itextpdf.text.pdf.PdfPKCS7.getEncodedPKCS7(PdfPKCS7.java:1200)
at com.itextpdf.text.pdf.PdfPKCS7.getEncodedPKCS7(PdfPKCS7.java:1151)
at com.itextpdf.text.pdf.PdfSigGenericPKCS.setSignInfo(PdfSigGenericPKCS.java:107)
at com.itextpdf.text.pdf.PdfSignatureAppearance.preClose(PdfSignatureAppearance.java:973)
at com.itextpdf.text.pdf.PdfSignatureAppearance.preClose(PdfSignatureAppearance.java:897)
at com.itextpdf.text.pdf.PdfStamper.close(PdfStamper.java:192)
at AssinadorDigitalApplet.assinaDocumento(AssinadorDigitalApplet.java:854)
at AssinadorDigitalApplet.signFile(AssinadorDigitalApplet.java:685)
at AssinadorDigitalApplet.signSelectedFile(AssinadorDigitalApplet.java:462)
at AssinadorDigitalApplet.init(AssinadorDigitalApplet.java:160)
at sun.plugin2.applet.Plugin2Manager$AppletExecutionRunnable.run(Unknown Source)
at java.lang.Thread.run(Unknown Source)

abaixo segue o metodo assinaDocumento:

System.out.println("*******************************************Entrou no metodo assina documento*************************************************");
     	PdfReader reader;
     	PrivateKey key;
     	java.security.cert.Certificate[] chain = null;
     	ByteArrayOutputStream os = new ByteArrayOutputStream();
     	String cpf = "";
     	String email = "";
     	String location = "";
     	
		try {
			
			System.out.println("Instancia parametros da assinatura digital");
			
			KeyStore ks = KeyStore.getInstance("PKCS11");
			ks.load(null, aPinCode.toCharArray());
			String alias = (String)ks.aliases().nextElement();
			key = (PrivateKey)ks.getKey(alias,aPinCode.toCharArray()); 
			chain = ks.getCertificateChain(alias); 
			
			System.out.println("Cria objeto para guardar arquivo pdf");
			reader = new PdfReader(aDocumentToSign);
						
			//PdfStamper stp = PdfStamper.createSignature(reader, os, '\0');
			System.out.println("Cria assinatura no pdfStamper");
			PdfStamper stp = PdfStamper.createSignature(reader, os, '\0', null, true);
     
			PdfSignatureAppearance sap = stp.getSignatureAppearance();
			sap.setCrypto(key, chain, null, PdfSignatureAppearance.WINCER_SIGNED);
			sap.setReason("Eu sou o autor");
											
			sap.setLocation("AGU");
			// comente a linha abaixo caso queira uma assinatura invisivel
			//sap.setVisibleSignature(new Rectangle(100, 100, 200, 200), 1, null);
			
			System.out.println("inclui certificado X509");
			String nome = PdfPKCS7.getSubjectFields((X509Certificate)chain[0]).getField("CN");
			
			//------------------------------------------------------------------------------------------------
			//										CPF
			//------------------------------------------------------------------------------------------------
			
			System.out.println("Captura dados da assinatura");
			
			X509Certificate cert = (X509Certificate)chain[0];
			for (List<?> subjectAlternativeName : cert.getSubjectAlternativeNames()) {      
	            Pair<DERObjectIdentifier, String> otherName;   
	            int pos;   
	            // O primeiro elemento é um Integer com o valor 0 = otherName, 1 = rfc822name etc.   
	            // O segundo valor é um byte array ou uma String. Veja o javadoc de   
	            // getSubjectAlternativeNames.   
	            switch (((Number) subjectAlternativeName.get(0)).intValue()) {   
	            case 0: // OtherName - contém CPF, CNPJ etc.   
	                otherName = getOtherName((byte[]) subjectAlternativeName.get(1));
	                String t2 = otherName.second;
	                
					if (otherName.first.toString().equals("2.16.76.1.3.1")){
	                	cpf = t2.substring(8, 19);  	
					}
	                // o OID fica em otherName.first   
	                break;   
	            case 1: // rfc822Name - usado para email   
	                email = (String) subjectAlternativeName.get(1);   
	                //props.put("email", email);   
	                break;   
	            default:   
	                break;   
	            }
			}
			
			System.out.println("Verifica responsavel");
			System.out.println("indicador de verificação de responsavel: " + inVerificarResponsavel);
			
			if (inVerificarResponsavel.equals("1")){
				
				System.out.println("inicia verificação de responsável");
				
				//Busca pessoa
				if (dsAmbiente.equalsIgnoreCase("producao")){
					location = "";
				}else{
					if(dsAmbiente.equalsIgnoreCase("homologacao")){
						location = "";
					}else{
						if (dsAmbiente.equalsIgnoreCase("desenvolvimento") || dsAmbiente.equalsIgnoreCase("gesis") || dsAmbiente.equalsIgnoreCase("clone")){
							location = "";
							//location = "";
						}
					}
				}
				
				System.out.println("Location: " + location);
				
				HttpURLConnection con = (HttpURLConnection) getServletConnection(location);
				ObjectInputStream inputFromServletPessoa = new ObjectInputStream(con.getInputStream());
				
				PessoaBean pessoa = (PessoaBean) inputFromServletPessoa.readObject();
	         	inputFromServletPessoa.close();
	         	
	         	System.out.println("Buscou pessoa");
				
				
				if (!pessoa.getCpf().equals(cpf)){
					System.out.println("Token do assinador não corresponde ao proprietário do documento.");
					
					autoriza = "Nao"; 
					os = null;
					retornoApplet(hdnRetorno, "Propietario token");
					
					log.setIdMidia(Integer.parseInt(midia));
			 		log.setErro("Token do assinador não corresponde ao proprietário do documento.");
			 		log.setEtapa("Assinando arquivo");
			 		gravaLog(log, dsAmbiente); 
					
					throw new Exception("Token do assinador não corresponde ao proprietário do documento.");
				}
			}		
		
			
			System.out.println("Verifica se é para colocar a chancela");
			
			if (inChancela.equalsIgnoreCase("1") && inMultiplasAssinaturas.equals("0")){
				System.out.println("Coloca Chancela");
				
				String chancela =  formatar(cpf, "###.###.###-##") + " - " + nome;
			
				//-----------------------------------------------------------------------
				//                          Chancela
				//-----------------------------------------------------------------------
				for (int page = 1; page <= reader.getNumberOfPages(); page++){
					PdfContentByte conteudoPdfByte = stp.getOverContent(page);
					conteudoPdfByte.beginText();
					BaseFont baseFont = BaseFont.createFont(BaseFont.HELVETICA, BaseFont.CP1252, BaseFont.NOT_EMBEDDED);
					conteudoPdfByte.setFontAndSize(baseFont, 9);
					conteudoPdfByte.showTextAligned(conteudoPdfByte.ALIGN_CENTER, chancela, conteudoPdfByte.getPdfDocument().getPageSize().getWidth() - 20, conteudoPdfByte.getPdfDocument().getPageSize().getHeight()/2, 90);
					conteudoPdfByte.endText();   
				}
			
			}
			
			System.out.println("fecha stamper do pdf");
			stp.close();  //(Parte que provoca a excecão)
									
		} catch (IOException e) {
			
			log.setIdMidia(Integer.parseInt(midia));
	 		log.setErro(e.getMessage());
	 		log.setEtapa("Assinando arquivo");
	 		gravaLog(log, dsAmbiente); 
	 		
			e.printStackTrace();
		} catch (DocumentException e) {
			
			log.setIdMidia(Integer.parseInt(midia));
	 		log.setErro(e.getMessage());
	 		log.setEtapa("Assinando arquivo");
	 		gravaLog(log, dsAmbiente); 
			
			e.printStackTrace();
		} catch (KeyStoreException e) {
			
			log.setIdMidia(Integer.parseInt(midia));
	 		log.setErro(e.getMessage());
	 		log.setEtapa("Assinando arquivo");
	 		gravaLog(log, dsAmbiente); 
			
			e.printStackTrace();
		} catch (NoSuchAlgorithmException e) {
			
			log.setIdMidia(Integer.parseInt(midia));
	 		log.setErro(e.getMessage());
	 		log.setEtapa("Assinando arquivo");
	 		gravaLog(log, dsAmbiente); 
			
			e.printStackTrace();
		} catch (CertificateException e) {
			
			log.setIdMidia(Integer.parseInt(midia));
	 		log.setErro(e.getMessage());
	 		log.setEtapa("Assinando arquivo");
	 		gravaLog(log, dsAmbiente); 
			
			e.printStackTrace();
		} catch (UnrecoverableKeyException e) {
			
			log.setIdMidia(Integer.parseInt(midia));
	 		log.setErro(e.getMessage());
	 		log.setEtapa("Assinando arquivo");
	 		gravaLog(log, dsAmbiente); 
			
			e.printStackTrace();
		} catch (InstantiationException e) {
			
			log.setIdMidia(Integer.parseInt(midia));
	 		log.setErro(e.getMessage());
	 		log.setEtapa("Assinando arquivo");
	 		gravaLog(log, dsAmbiente); 
			
			e.printStackTrace();
		} catch (IllegalAccessException e) {
			
			log.setIdMidia(Integer.parseInt(midia));
	 		log.setErro(e.getMessage());
	 		log.setEtapa("Assinando arquivo");
	 		gravaLog(log, dsAmbiente); 
			
			e.printStackTrace();
		} catch (ClassNotFoundException e) {
			
			log.setIdMidia(Integer.parseInt(midia));
	 		log.setErro(e.getMessage());
	 		log.setEtapa("Assinando arquivo");
	 		gravaLog(log, dsAmbiente); 
			
			e.printStackTrace();
		} catch (SQLException e) {
			
			log.setIdMidia(Integer.parseInt(midia));
	 		log.setErro(e.getMessage());
	 		log.setEtapa("Assinando arquivo");
	 		gravaLog(log, dsAmbiente); 
			
			e.printStackTrace();
		} catch (Exception e) {
			System.out.println("Erro na instancia do arquivo");		
			log.setIdMidia(Integer.parseInt(midia));
	 		log.setErro(e.getMessage());
	 		log.setEtapa("Assinando arquivo");
	 		gravaLog(log, dsAmbiente); 
			
			e.printStackTrace();
		}
		System.out.println("retorna arquivo assinado");
		return os;
	   
   }

Eu ja desisntalei e reinstalei o plugin java, ja desinstalei e reinstalei o browser. Não sei o que pode esta ocasionando esse erro. Se alguém puder me ajudar.

Obrigado

Criado 16 de agosto de 2012
Respostas 0
Participantes 1