2012-09-14 17 views
10

Próbuję podpisać pdf za pomocą bibliotek pdfbox. Utknąłem teraz i naprawdę potrzebuję pomocy.Jak podpisać pdf w Javie używając pdfbox

To jest mój kod:

private static void signPdf(PDDocument document) throws Exception 
{ 
    PDSignature sig = new PDSignature(); 
    sig.setFilter(COSName.ADOBE_PPKLITE); 
    sig.setSubFilter(COSName.ADBE_PKCS7_DETACHED); 
    sig.setByteRange(new int[] {'a','a','a','a'}); 
    sig.setContents(new byte[]{(byte) 23, (byte) 23, (byte) 23, (byte) 23}); 

    SignatureOptions options = new SignatureOptions(); 

    document.addSignature(sig, new SignatureInterface() { 
     public byte[] sign(InputStream content) 
       throws SignatureException, IOException  {   
      //this should be made MD5 checksum?   
      return new byte[]{(byte) 'a', (byte) 'a', (byte) 'a', (byte) 'a'}; 
     } 
    }, options); 
} 

Następnie Iam uratowanie pdf, ale: 1) Zauważyłem, że znak nie jest metoda o nazwie 2) Gdzie należy dołączyć Certyfikat? w metodzie znaku?

pdf:

/Type /Sig 
/Filter /Adobe.PPKLite 
/SubFilter /adbe.pkcs7.sha1 
/Contents <0000000000. a lot of zeros..000> 
/ByteRange [0 1000000000 1000000000 1000000000] 

Myślę, że brakuje mi czegoś, ale dokumentacja nie mówi nic o tym, jak zapisać plik.

Tahnks z góry JC.

@Ed

Oto jak mogę zapisać PDF:

public static void saveFile(COSDocument doc, String out) 
     throws IOException, COSVisitorException { 
    java.io.OutputStream os = null; 
    COSWriter writer = null; 
    try { 
     os = new java.io.FileOutputStream(out); 
     writer = new COSWriter(os); 
     writer.write(doc); 
    } finally { 
     if (os != null) { 
      os.close(); 
     } 
     if (writer != null) { 
      writer.close(); 
     } 
    } 
} 
+2

Wygląda na to, że podpisywanie w PDFBox jest raczej niskopoziomowe i nieudokumentowane. Możesz przeczytać ten dokument, aby dowiedzieć się więcej na temat podpisów cyfrowych w formacie PDF: http://itextpdf.com/book/digitalsignatures –

+0

W jaki sposób zapisujesz dokument? Tam musimy szukać, aby dowiedzieć się, dlaczego sign() nie jest wywoływany. –

+0

@Ed Dodałem funkcję zapisywania powyżej –

Odpowiedz

6

prowadzi link PDFBox-SignExample.zip jest nieaktualne. Proszę skorzystać z tej próbki zamiast:

https://svn.apache.org/repos/asf/pdfbox/trunk/examples/src/main/java/org/apache/pdfbox/examples/signature/CreateSignature.java

Lepiej udokumentowane i uaktualniane na bieżąco.

+5

Podczas gdy ten link może odpowiedzieć na pytanie, lepiej umieścić tutaj istotne części odpowiedzi i podać link do odsyłacza. Odpowiedzi dotyczące linków mogą stać się nieprawidłowe, jeśli strona z linkami się zmieni. –

+0

Tak, to byłoby lepsze, ale to pytanie jest w tej chwili pod najwyższymi trafieniami podczas wyszukiwania "podpisywania pdfbox" i jest wiele osób, które lubią podpisywać. Punkt odsyłacza w paczce svn pdfbox, więc jeśli projekt nie zostanie przeniesiony do git, link będzie zgodny, w przeciwnym razie zaktualizuję go. Tak naprawdę nie ma problemu. – ThomasCh

Powiązane problemy