2013-01-24 3 views
0

iText를 사용하여 pdf 서명을위한 다른 코드를 작성 중입니다. 라이브러리는 새롭고 다운로드 된 코드의 소스입니다. 나는 자바와 iText를 처음 사용한다. 코드에서 긴 게시물에 대한 죄송합니다 :itext "main"스레드의 예외 java.lang.NoSuchMethodError

Exception in thread "main" java.lang.NoSuchMethodError: com.itextpdf.text.pdf.PdfSignatureAppearance.setCertificate(Ljava/security/cert/Certificate;)V 
    at com.itextpdf.text.pdf.security.MakeSignature.signDetached(MakeSignature.java:115) 
    at c2_01_signhelloworld.C2_01_SignHelloWorld.sign(C2_01_SignHelloWorld.java:59) 
    at c2_01_signhelloworld.C2_01_SignHelloWorld.main(C2_01_SignHelloWorld.java:71) 
Java Result: 1 

이 코드는이 두 파일을 만들지 만, 나는 오류를 얻을 수 unsigned1_signed.pdf 열려고하면

package c2_01_signhelloworld; 

import java.io.FileInputStream; 
import java.io.FileOutputStream; 
import java.io.IOException; 
import java.security.GeneralSecurityException; 
import java.security.KeyStore; 
import java.security.PrivateKey; 
import java.security.Security; 
import java.security.cert.Certificate; 

import org.bouncycastle.jce.provider.BouncyCastleProvider; 

import com.itextpdf.text.DocumentException; 
import com.itextpdf.text.Rectangle; 
import com.itextpdf.text.pdf.PdfReader; 
import com.itextpdf.text.pdf.PdfSignatureAppearance; 
import com.itextpdf.text.pdf.PdfStamper; 
import com.itextpdf.text.pdf.security.BouncyCastleDigest; 
import com.itextpdf.text.pdf.security.DigestAlgorithms; 
import com.itextpdf.text.pdf.security.ExternalDigest; 
import com.itextpdf.text.pdf.security.ExternalSignature; 
import com.itextpdf.text.pdf.security.MakeSignature; 
import com.itextpdf.text.pdf.security.MakeSignature.CryptoStandard; 
import com.itextpdf.text.pdf.security.PrivateKeySignature; 

public class C2_01_SignHelloWorld { 

    public static final String KEYSTORE = "C:/Users/Documents/itext/2/ks"; 
    public static final char[] PASSWORD = "password".toCharArray(); 
    public static final String SRC = "C:/Users/Documents/itext/2/unsigned1.pdf"; 
    public static final String DEST = "C:/Users/Documents/itext/2/unsigned1_signed.pdf"; 

    public void sign(String src, String dest, 
      Certificate[] chain, 
      PrivateKey pk, String digestAlgorithm, String provider, 
      CryptoStandard subfilter, 
      String reason, String location) 
        throws GeneralSecurityException, IOException, DocumentException { 
     // Creating the reader and the stamper 
     PdfReader reader = new PdfReader(src); 
     FileOutputStream os = new FileOutputStream(dest); 
     PdfStamper stamper = PdfStamper.createSignature(reader, os, '\0'); 
     // Creating the appearance 
     PdfSignatureAppearance appearance = stamper.getSignatureAppearance(); 
     appearance.setReason(reason); 
     appearance.setLocation(location); 
     appearance.setVisibleSignature(new Rectangle(36, 748, 144, 780), 1, "sig"); 
     // Creating the signature 
     ExternalDigest digest = new BouncyCastleDigest(); 
     ExternalSignature signature = new PrivateKeySignature(pk, digestAlgorithm, provider); 
     MakeSignature.signDetached(appearance, digest, signature, chain, null, null, null, 0, subfilter); 
    } 

    public static void main(String[] args) throws GeneralSecurityException, IOException, DocumentException { 
     BouncyCastleProvider provider = new BouncyCastleProvider(); 
     Security.addProvider(provider); 
     KeyStore ks = KeyStore.getInstance(KeyStore.getDefaultType()); 
     ks.load(new FileInputStream(KEYSTORE), PASSWORD); 
     String alias = (String)ks.aliases().nextElement(); 
     PrivateKey pk = (PrivateKey) ks.getKey(alias, PASSWORD); 
     Certificate[] chain = ks.getCertificateChain(alias); 
     C2_01_SignHelloWorld app = new C2_01_SignHelloWorld(); 
     app.sign(SRC, String.format(DEST, 1), chain, pk, DigestAlgorithms.SHA256, provider.getName(), CryptoStandard.CMS, "Test 1", "Ghent"); 
     app.sign(SRC, String.format(DEST, 2), chain, pk, DigestAlgorithms.SHA512, provider.getName(), CryptoStandard.CMS, "Test 2", "Ghent"); 
     app.sign(SRC, String.format(DEST, 3), chain, pk, DigestAlgorithms.SHA256, provider.getName(), CryptoStandard.CADES, "Test 3", "Ghent"); 
     app.sign(SRC, String.format(DEST, 4), chain, pk, DigestAlgorithms.RIPEMD160, provider.getName(), CryptoStandard.CADES, "Test 4", "Ghent"); 
    } 
} 

코드를 실행 한 후 나는이 오류가 발생합니다.

+1

버전 문제 일 가능성이 큽니다. 항아리를 확인하십시오. – madhead

+1

@madhead가 말했듯이, 항아리를 확인하십시오; 클래스 패스에 다른 버전의 iText 클래스가있는 것 같습니다. 컨텍스트 및 해당 호출자에서 누락 된 메소드는 지난 6 월 주요 서명 관련 코드 재구성 중에 추가되었습니다. – mkl

+0

예, 방금 iText 5.3.5 리소스를 사용하고 잘 작동합니다. 고맙습니다 – superhik13

답변

1

이것은 프로젝트에서 사용중인 lib가 시스템 라이브러리와 같지 않다는 것을 의미합니다.

그래서 같은 방법이 없습니다.

0

iText 5.3.5를 사용하면이 문제를 해결할 수 있습니다. iText 라이브러리의 이전 버전은이 코드에서 작동하지 않습니다. 확인할 수 있습니다. 5.4.0 PdfSignatureAppearance에 대한 스냅 샷 here

관련 문제