2015-07-22 5 views
5

Ich arbeite mit der pdfbox Beispielsignatur CreateVisableSignature und möchte, dass der Code das Bild der Signatur in ein Signaturfeld namens "ApplicantSignature" schreibt auf der dritten Seite.Wie bekomme ich PDVisibleSigProperties, um die Signatur auf der 3-Seite in das Signaturfeld zu schreiben

Kann jemand einen Hinweis geben, warum er die Unterschrift in der oberen linken Ecke der ersten Seite schreibt? Hier

ist der Code:

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

Ich habe auch versucht:

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

Und ich habe versucht:

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

Dies ist, wo ich die Unterschrift wollen gehen die dritte Seite. This is where I want the signature to go on the third page.

Dies ist, wo es auf der ersten Seite geht. This is where it is going on the first page.

Dies sind die Feldnamen im Formular. This shows the field names.

+0

Ist [dies (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) Ihr Formular? Wenn dies der Fall ist, hat ** A ** das Signaturfeld für die Anmelder-Signatur den Namen 'topmostSubform [0] .Page3 [0] .SignatureField1 [0]', nicht 'ApplicantSignature' und ** B ** das Formular ist eine hybride AcroForm/XFA-Form, die die Dinge ein wenig komplizieren kann. Wenn dies nicht der Fall ist, geben Sie bitte Ihre Version des Formulars zur Analyse und Reproduktion des Problems an. – mkl

+0

@mkl Wenn er wirklich dieses Dokument signieren will, dann wird es überhaupt nicht mit PDFBox funktionieren. Dieses Dokument hat/UR3-Berechtigungen, die wir nicht unterstützen. Das Dokument wird zwar signiert, aber es kommt eine Fehlermeldung, dass die erweiterten Eigenschaften verloren gehen. –

+0

@TilmanHausdrücker Ich fürchte, es gibt mehr im Code gebrochen, der die sichtbare Unterschrift verursacht. Das OP verwendet insbesondere 'signatureFieldName (" ApplicantSignature ")' in der Hoffnung, dass dies den Namen (** T ** - Wert) des Signaturformularfeldes setzt. Im Code sehe ich nur, dass der Wert verwendet wird, um den Namen (** Name ** Wert) in einem Signaturwörterbuch festzulegen. Darüber hinaus sehe ich keinen Code für die Verwendung eines vorhandenen leeren Signaturformularfeldes; aber ich denke, das ist genau das, was der OP tun möchte, unterschreiben Sie das leere Unterschriftsfeld, von dem er annimmt, dass es den Namen 'ApplicantSignature' trägt. – mkl

Antwort

0

Sehen Sie diese Linie in CreateVisibleSignature.java, in signPDF() (nicht in Frage enthalten, aber ein Teil des Beispielcodes in PDFBox Sie erwähnen):

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

die "//" entfernen und die Unterschrift erscheint auf Seite 3.

Wieder Position, ändern Sie diesen Teil des Codes

xAxis(0).yAxis(0) 

in andere Koordinaten, zB diese:

xAxis(100).yAxis(715) 

nun über die Frage, den Code in der Frage richtig ist - die letzte ist:

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

Die 3 in PDVisibleSignDesigner ist die Größe der Seite zu wählen. Die zweite 3 speichert die Nummer der Seite für später. Die Seitenzahlen sind hier 1-basiert.

+0

Vielen Dank und mkl für alle Ihre Kommentare Ich habe eine Frage zu den anderen Seite args: Welchen Wert sollte ich für PDVisibleSignDesigner verwenden visibleSig = new PDVisibleSignDesigner ( args [2], Bild, 3) Ich habe 3. Welchen Wert sollte ich für signatureProperties.signerName ("name") verwenden. SignerLocation ("location") .signatureReason ("Sicherheit"). PreferredSize (0) .page (3) .visualSignEnabled (true) .setPdVisibleSignature (visibleSig) .buildSignature(); Ich habe auch 3. – DenisMP

+0

@DenisMP 3 für beide verwenden. Der erste (PDVisibleSignDesigner) soll die Größe der Seite bestimmen. Die zweite ist die Seitenzahl. Ich werde meine Antwort verbessern. –

+0

Danke Tilman. Ich werde eine Antwort basierend auf dem, was ich gelernt habe, posten. Bitte zögern Sie nicht zu kommentieren. – DenisMP

1

Basierend auf den Seiteneinstellungen, die ich von den Leuten erhalten habe, die auf meine Frage geantwortet haben, gebe ich eine Antwort auf meinem aktuellen Wissen darüber, wie Signaturen in pdfbox funktionieren.

Zunächst scheint das existierende Formular, mit dem ich arbeite, zumindest aus einer pdfbox Perspektive, nur eine Seite es in zu haben. Wenn ich adobe DC Pro verwende, um die Koordinaten zu zeigen, zeigt es nur das an Koordinaten bis etwa zur Mitte der zweiten Seite. Auch wenn ich die X, Y-Koordinaten auf 100, 715 setze, erscheint das Signaturbild unten auf der ersten Seite, nicht auf der 3. Seite.

Bitte korrigieren Sie mich, wenn ich falsch liege, aber ich glaube, dass Sie mit pdfbox nur das gesamte Dokument signieren können und nicht einzelne Unterschriftsfelder, die bereits im Dokument vorhanden sind. Vorhandene Unterschriftsfelder sind von pdfbox nicht betroffen, da PDFbox nicht in der Lage ist, sie zu referenzieren.

Wenn Sie das pdf auf adobe dc pro aufrufen und auf das Unterschriftsfeld klicken, können Sie sehen, dass das PDF von pdfbox signiert wurde, aber die bereits vorhandenen Unterschriftsfelder zeigen immer noch an, dass sie signiert werden müssen.

Ich rate an dieser Stelle, dass pdfbox die Signaturen hinzufügt, die es zu dem bereits bestehenden Dokument signiert.

Ich bemerkte auch, dass die pdfbox-Signaturen unsichtbar sind, obwohl die "wer", "Standort", "Grund" und Datum festgelegt wurden, und dass das Bild, das Sie in der Signatur, die pdfbox signiert, ist Das einzige, was tatsächlich in der resultierenden Ausgabe pdf sichtbar ist. Wenn kein Bild vorhanden ist, zeigen Hardcopy-Ausdrucke nicht an, dass das Dokument signiert ist.

Noch einmal, bitte zögern Sie nicht mich zu korrigieren, wenn ich falsch liege.

+1

** A ** Wenn Sie keine Lösung, sondern lediglich einen Zwischenbericht haben, bearbeiten Sie Ihre Frage und fügen Sie diese Informationen an. Antworten sind für Lösungen gedacht. ** B ** * "Ich glaube, dass Sie mit pdfbox nur das gesamte Dokument signieren können" * - streng genommen signieren PDF-Signaturen immer die gesamte Dokumentenrevision. Dies ist bei echten XFA-Signaturen anders, aber die XFA-Spezifikation ist nicht Teil des PDF-Standards. – mkl

+0

** C ** * "nicht einzelne Unterschriftsfelder, die bereits im Dokument vorhanden sind" * - tatsächlich sieht es wirklich so aus, als ob der PDFBox-Code zum Erstellen sichtbarer PDF-Signaturen bestehende Unterschriftsfelder ignoriert.Aber nur Signaturfelder, in denen Signaturen lokalisiert und visualisiert werden, signiert die * digitale Signatur * darunter immer noch die gesamte Revision. ** D ** * "Ich habe auch bemerkt, dass die pdfbox-Signaturen unsichtbar sind ..." * - Sie verwechseln das * Aussehen * einer Signatur und die tatsächliche * digitale Signatur * darunter. Die digitale Signatur ist niemals sichtbar. ... – mkl

+0

... Die Signiersoftware kann jedoch ein sichtbares Erscheinungsbild auf der PDF-Datei hinzufügen, und verschiedene Signierungssoftwares fügen unterschiedliche Informationen in diese Visualisierung ein. Aber man sollte niemals den Informationen in solch einer Visualisierung vertrauen, es gibt keine Garantie, dass es wahr ist, man sollte immer die Signatureigenschaften überprüfen, um endgültige Informationen zu erhalten. ** E ** * "Hardcopy-Ausdrucke zeigen nicht, dass das Dokument signiert ist" * - Hardcopys enthalten niemals verlässliche Informationen zu PDF-Signaturen. Sie können etwas zeigen, das wie eine Adobe-Signatur aussieht, die tatsächlich nicht durch eine digitale Signatur unterstützt wurde. – mkl