2012-09-14 213 views
10

Estoy intentando firmar PDF usando las bibliotecas de pdfbox. Me he estancado ahora y realmente necesito ayuda.Cómo firmar pdf en Java usando pdfbox

Este es mi código:

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); 
} 

Entonces Iam salvar mi pdf, pero: 1) Me he dado cuenta que el método señal nunca es llamado 2) ¿Dónde debo colocar certyficate? en el método de signo?

pdf:

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

Creo que he perdido algo, pero la documentación no dice nada acerca de cómo firmar un archivo.

Tahnks en avance JC.

@Ed

Así es como puedo guardar mi 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

Parece que la firma con PDFBox es de bajo nivel y no está documentada. Le recomendamos que lea este documento para comprender mejor las firmas digitales en PDF: http://itextpdf.com/book/digitalsignatures –

+0

¿Cómo está guardando el documento? Ahí es donde tenemos que mirar, para descubrir por qué no se llama a sign(). –

+0

@Ed He agregado mi función de guardado por encima de –

Respuesta

6

El ligado PDFBox-SignExample.zip no está actualizado. Por favor, utilice esta muestra en su lugar:

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

es mejor documentado y mantenido al día.

+5

Si bien este enlace puede responder la pregunta, es mejor incluir las partes esenciales de la respuesta aquí y proporcionar el enlace de referencia. Las respuestas de solo enlace pueden dejar de ser válidas si la página vinculada cambia. –

+0

Sí, esto sería mejor, pero esta pregunta está actualmente por debajo de los principales resultados al buscar "firmas de pdfbox" y hay muchas personas a las que les gusta firmar. El punto de enlace en el tronco de pdfbox svn, por lo que si el proyecto no se mueve a git, el enlace coincidirá, de lo contrario lo actualizaré. Entonces realmente no hay problema – ThomasCh

Cuestiones relacionadas