2015-07-22 27 views
5

Sto lavorando con la firma di esempio pdfbox CreateVisableSignature e vorrei che il codice scrivesse l'immagine della firma in un campo firma chiamato "ApplicantSignature" sulla terza pagina.Come posso ottenere PDVisibleSigProperties per scrivere la firma sulla pagina 3 nella casella della firma

Qualcuno può dare un indizio sul motivo per cui scrive la firma nell'angolo in alto a sinistra della prima pagina?

Ecco il codice:

public static void main(String[] args) throws KeyStoreException, 
     NoSuchAlgorithmException, CertificateException, 
     FileNotFoundException, IOException, COSVisitorException, 
     SignatureException { 

    if (args.length != 4) { 
     usage(); 
     System.exit(1); 
    } else { 
     File ksFile = new File(args[0]); 
     KeyStore keystore = KeyStore.getInstance("PKCS12", provider); 
     char[] pin = args[1].toCharArray(); 
     keystore.load(new FileInputStream(ksFile), pin); 
     File document = new File(args[2]); 
     CreateVisibleSignature signing = new CreateVisibleSignature(
       keystore, pin.clone()); 
     String jpgFile = CreateVisibleSignature.convertPngToJpeg(args[3]); 
     FileInputStream image = new FileInputStream(jpgFile); 
     PDVisibleSignDesigner visibleSig = new PDVisibleSignDesigner(
       args[2], image, 1); 
     visibleSig.xAxis(0).yAxis(0).zoom(-75) 
       .signatureFieldName("ApplicantSignature"); 
     PDVisibleSigProperties signatureProperties = new PDVisibleSigProperties(); 
     signatureProperties.signerName("name").signerLocation("location") 
       .signatureReason("Security").preferredSize(0).page(3) 
       .visualSignEnabled(true).setPdVisibleSignature(visibleSig) 
       .buildSignature(); 
     signing.signPDF(document, signatureProperties); 
    } 
} 

Ho anche provato:

PDVisibleSignDesigner visibleSig = new PDVisibleSignDesigner(
       args[2], image, 3); 
     visibleSig.xAxis(0).yAxis(0).zoom(-75) 
       .signatureFieldName("ApplicantSignature"); 
     PDVisibleSigProperties signatureProperties = new PDVisibleSigProperties(); 
     signatureProperties.signerName("name").signerLocation("location") 
       .signatureReason("Security").preferredSize(0).page(1) 
       .visualSignEnabled(true).setPdVisibleSignature(visibleSig) 
       .buildSignature(); 

e ho provato:

PDVisibleSignDesigner visibleSig = new PDVisibleSignDesigner(
       args[2], image, 3); 
     visibleSig.xAxis(0).yAxis(0).zoom(-75) 
       .signatureFieldName("ApplicantSignature"); 
     PDVisibleSigProperties signatureProperties = new PDVisibleSigProperties(); 
     signatureProperties.signerName("name").signerLocation("location") 
       .signatureReason("Security").preferredSize(0).page(3) 
       .visualSignEnabled(true).setPdVisibleSignature(visibleSig) 
       .buildSignature(); 

Questo è dove voglio la firma per andare avanti la terza pagina. This is where I want the signature to go on the third page.

Questo è dove sta andando sulla prima pagina. This is where it is going on the first page.

Questi sono i nomi dei campi nel modulo. This shows the field names.

+0

È [questo (http://www.ors.od.nih.gov/ser/dpsac/bgchecks/Documents/hhs-745.pdf)](http://www.ors.od.nih.gov /ser/dpsac/bgchecks/Documents/hhs-745.pdf) il tuo modulo? Se lo è, allora ** A ** il campo firma per la firma del richiedente ha il nome 'topmostSubform [0] .Page3 [0] .SignatureField1 [0]', non 'ApplicantSignature', e ** B ** il modulo è un modulo ibrido di AcroForm/XFA che può complicare un po 'le cose. In caso contrario, fornire la versione del modulo per l'analisi e la riproduzione del problema. – mkl

+0

@mkl se vuole davvero firmare quel documento allora non funzionerà affatto con PDFBox. Quel documento ha permessi/UR3, che non supportiamo. Il documento viene firmato, ma viene visualizzato un messaggio di errore che le proprietà estese vengono perse. –

+0

@TilmanHausherr Temo che ci sia più spazio nel codice che crea la firma visibile. L'OP in particolare usa 'signatureFieldName (" ApplicantSignature ")' sperando che questo imposti il ​​nome (** T ** value) del campo del modulo di firma. Nel codice vedo solo che il valore è usato per impostare il nome (** Nome ** valore) in un dizionario delle firme. Inoltre non vedo alcun codice per l'utilizzo di un campo modulo firma vuota esistente; ma penso che sia esattamente ciò che l'OP vuole fare, firmare il campo firma vuoto che assume per avere il nome 'ApplicantSignature'. – mkl

risposta

0

Vedi questa linea in CreateVisibleSignature.java, in signPDF() (non incluso nella tua domanda, ma una parte del codice di esempio in PDFBox si parla):

// options.setPage(signatureProperties.getPage()); 

rimuovere il "//" e appare la firma a pagina 3.

posizione Re, modificare questa parte del codice

xAxis(0).yAxis(0) 

ad altre coordinate, ad esempio, questi:

xAxis(100).yAxis(715) 

Ora sulla questione, che il codice in questione è corretta - l'ultimo è:

PDVisibleSignDesigner visibleSig = new PDVisibleSignDesigner(args[2], image, 3); 
visibleSig.xAxis(0).yAxis(0).zoom(-75).signatureFieldName("ApplicantSignature"); 
PDVisibleSigProperties signatureProperties = new PDVisibleSigProperties(); 
signatureProperties.signerName("name").signerLocation("location") 
    .signatureReason("Security").preferredSize(0).page(3) 
    .visualSignEnabled(true).setPdVisibleSignature(visibleSig) 
    .buildSignature(); 

Il 3 in PDVisibleSignDesigner è quello di scegliere le dimensioni della pagina. Il secondo 3 è quello di memorizzare il numero della pagina per dopo. I numeri di pagina sono basati su 1 qui.

+0

Grazie mille per tutti i vostri commenti Ho una domanda sugli argomenti della pagina: Quale valore dovrei usare per PDVisibleSignDesigner visibleSig = new PDVisibleSignDesigner ( args [2], image, 3) Ho 3. Quale valore dovrei usare per signatureProperties.signerName ("name"). SignerLocation ("location") .signatureReason ("Security"). PreferredSize (0) .page (3) .visualSignEnabled (true) .setPdVisibleSignature (visibleSig) .buildSignature(); Ne ho anche 3. – DenisMP

+0

@DenisMP usa 3 per entrambi. Il primo (PDVisibleSignDesigner) consiste nel decidere la dimensione della pagina. Il secondo è il numero di pagina. Migliorerò la mia risposta. –

+0

Grazie, Tilman. Ho intenzione di pubblicare una risposta in base a ciò che ho imparato. Non esitate a commentare. – DenisMP

1

Sulla base delle impostazioni della pagina fornite dalla gente che ha risposto alla mia domanda, sto postando una base di risposta sulla mia attuale conoscenza di come le firme funzionano in pdfbox.

Prima di tutto, il modulo preesistente con cui sto lavorando, almeno da una prospettiva in PDFbox, sembra avere solo una pagina. Quando uso Adobe adobe DC per mostrare le coordinate, mostra solo il coordina fino a circa la metà della seconda pagina. Quindi, anche se imposto le coordinate X, Y su 100, 715, l'immagine della firma appare nella parte inferiore della prima pagina, non sulla terza.

Per favore correggimi se ho torto, ma credo che pdfbox ti permetta solo di firmare l'intero documento e non i singoli campi firma già esistenti nel documento. I campi delle firme preesistenti non sono influenzati da pdfbox poichè PDFbox sembra non essere in grado di farvi riferimento.

Se si apre il pdf su adobe dc pro e si fa clic sul pannello Firma, è possibile vedere che il pdf è stato firmato da pdfbox, ma i campi di firma preesistenti indicano ancora che è necessario firmarli.

Immagino a questo punto che pdfbox aggiunga le firme che firma al documento preesistente.

Ho anche notato che le firme PDFbox sono invisibili, anche se "chi", "posizione", "ragione" e data sono stati impostati e che l'immagine che si inserisce nella firma che firma pdfbox è l'unica cosa che è effettivamente visibile nel pdf di output risultante. Se non ci sono immagini, le stampe cartacee non mostrano che il documento è firmato.

Ancora una volta, non esitate a correggermi se ho torto.

+1

** A ** Se non si dispone di una soluzione ma solo di un rapporto intermedio, si prega di modificare la domanda e aggiungere le informazioni lì. Le risposte sono pensate per soluzioni. ** B ** * "Credo che pdfbox ti permetta solo di firmare l'intero documento" * - in senso stretto le firme PDF firmano sempre l'intera revisione del documento. Questo è diverso per le autentiche firme XFA, ma le specifiche XFA non fanno parte dello standard PDF. – mkl

+0

** C ** * "non singoli campi firma già esistenti nel documento" * - infatti, sembra davvero che il codice PDFBox per la creazione di firme PDF visibili ignori i campi firma esistenti.Ma solo i campi firma sono dove le segnature sono localizzate e visualizzate, la * firma digitale * sotto firma ancora l'intera revisione. ** D ** * "Ho anche notato che le firme PDFbox sono invisibili ..." * - erroneamente l'* aspetto * di una firma e l'effettiva * firma digitale * sotto. La firma digitale non è mai visibile. ... – mkl

+0

... Ma il software di firma può aggiungere un aspetto visibile al PDF, e diversi software di firma mettono diverse informazioni in questa visualizzazione. Ma non ci si dovrebbe mai fidare delle informazioni in tale visualizzazione, non c'è alcuna garanzia che sia vero, si dovrebbe sempre ispezionare le proprietà della firma per recuperare le informazioni finali. ** E ** * "le stampe cartacee non mostrano che il documento è firmato" * - le copie cartacee non contengono mai informazioni affidabili relative alle firme PDF. Potrebbero mostrare qualcosa che assomiglia a un aspetto di firma Adobe che in realtà non era supportato da una firma digitale. – mkl