2015-07-22 30 views
5

Pracuję z podpisem przykładu PDF w polu CreateVisableSignature i chciałbym, aby kod zapisał obraz podpisu w polu podpisu o nazwie "ApplicantSignature" na trzeciej stronie.W jaki sposób uzyskać właściwość PDVisibleSigProperties, aby zapisać podpis na 3 stronie w polu podpisu

Czy ktoś może wskazać, dlaczego pisze podpis w lewym górnym rogu pierwszej strony?

Oto kod:

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

Próbowałem również:

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

i próbowałem:

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

To gdzie chcę podpis, aby przejść na trzecia strona. This is where I want the signature to go on the third page.

Tutaj następuje pierwsza strona. This is where it is going on the first page.

To są nazwy pól w formularzu. This shows the field names.

+0

Czy [to (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) Twój formularz? Jeśli tak, to ** A ** pole podpisu dla podpisu wnioskodawcy ma nazwę "topmostSubform [0] .Page3 [0] .SignatureField1 [0]", a nie "ApplicantSignature", i ** B ** formularz jest hybrydową formą AcroForm/XFA, która może trochę komplikować. Jeśli jednak nie jest, proszę podać swoją wersję formularza do analizy i odtworzenia problemu. – mkl

+0

@mkl jeśli naprawdę chce podpisać ten dokument, to nie będzie działało z PDFBoxem w ogóle. Ten dokument ma uprawnienia/UR3, których nie obsługujemy. Dokument zostaje podpisany, ale pojawia się komunikat o błędzie, że rozszerzone właściwości zostały utracone. –

+0

@TilmanHausherr Obawiam się, że w kodzie jest więcej złamanych elementów, tworząc widoczny podpis. OP w szczególności używa 'signatureFieldName (" ApplicantSignature ") mając nadzieję, że ustawi to nazwę (wartość ** T **) pola formularza podpisu. W kodzie widzę tylko, że wartość jest używana do ustawienia nazwy (** Nazwa **) w jakimś słowniku sygnatur. Ponadto nie widzę żadnego kodu do używania istniejącego pustego pola formularza podpisu; ale myślę, że dokładnie to, co OP chce zrobić, podpisuje puste pole podpisu, które zakłada, że ​​ma nazwę "ApplicantSignature". – mkl

Odpowiedz

0

Zobacz tę linię w CreateVisibleSignature.java w signPDF() (nieuwzględnione w swoim pytaniu, ale część kodu przykład w PDFBox wspomnieć):

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

usunąć "//" a na stronie pojawi 3.

pozycję Re zmienić tę część kodu

xAxis(0).yAxis(0) 

innym układzie współrzędnych, np podpis te:

xAxis(100).yAxis(715) 

Teraz o których mowa w pytaniu kod jest poprawny - ostatnia jest:

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

3 w PDVisibleSignDesigner jest wybór rozmiaru strony. Drugi 3 to zapisanie numeru strony na później. Numery stron dotyczą tutaj.

+0

Dziękuję i mkl za wszystkie komentarze. Mam pytanie na temat innych argumentów strony: Jakiej wartości powinienem użyć dla PDVisibleSignDesigner visibleSig = new PDVisibleSignDesigner ( args [2], image, 3) Mam 3. Jaką wartość powinienem użyć dla signatureProperties.signerName ("name"). SignerLocation ("location") .signatureReason ("Security"). PreferredSize (0) .page (3) .visualSignEnabled (true) .setPdVisibleSignature (visibleSig) .buildSignature(); Ja też mam 3. – DenisMP

+0

@DenisMP użyj 3 dla obu. Pierwszy (PDVisibleSignDesigner) decyduje o wielkości strony. Drugi to numer strony. Poprawię moją odpowiedź. –

+0

Dziękuję Tilman. Zamierzam opublikować odpowiedź na podstawie tego, czego się nauczyłem. Prosimy o komentarz. – DenisMP

1

Na podstawie ustawień strony podanych mi przez osoby, które odpowiedziały na moje pytanie, publikuję bazę odpowiedzi na temat mojej aktualnej wiedzy na temat działania podpisów w pdfbox.

Przede wszystkim, istniejący wcześniej formularz, z którym pracuję, przynajmniej z perspektywy pdfbox, wydaje się mieć tylko jedną stronę. Kiedy używam programu adobe DC pro do wyświetlania współrzędnych, pokazuje on tylko koordynuje do około połowy drugiej strony. Mimo że ustawiam współrzędne X, Y na 100, 715, obraz podpisu pojawia się na dole pierwszej strony, a nie na trzecim.

Proszę mnie poprawić, jeśli się mylę, ale uważam, że pdfbox pozwala tylko podpisać cały dokument, a nie poszczególne pola podpisu, które już istnieją w dokumencie. Wcześniejsze pola podpisu nie mają wpływu na PDFbox, ponieważ wydaje się, że pdfbox nie może ich odwoływać.

Po wyświetleniu pliku pdf na stronie adobe dc pro i kliknięciu panelu podpisu można zobaczyć, że plik PDF został podpisany przez pdfbox, ale wcześniej istniejące pola podpisu nadal wskazują, że muszą być podpisane.

Zgaduję w tym momencie, że pdfbox dodaje podpisy, które podpisuje do wcześniej istniejącego dokumentu.

Zauważyłem również, że podpisy w formacie pdfbox są niewidoczne, mimo że ustawione zostały "kto", "lokalizacja", "powód" i data oraz, że obraz, który umieścisz w podpisie, który podpisuje pdfbox jest jedyną rzeczą, która jest widoczna w wynikowym pliku pdf. Jeśli nie ma obrazu, wydruki drukowane nie pokazują, że dokument jest podpisany.

Jeszcze raz, proszę, popraw mnie, jeśli się mylę.

+1

** A ** Jeśli nie masz rozwiązania, a jedynie tymczasowy raport, edytuj swoje pytanie i dołącz tam te informacje. Odpowiedzi są przeznaczone na rozwiązania. ** B ** * "Wierzę, że pdfbox pozwala tylko podpisać cały dokument" * - ściśle mówiąc podpisy PDF zawsze podpisują całą wersję dokumentu. Jest inaczej w przypadku oryginalnych podpisów XFA, ale specyfikacja XFA nie jest częścią standardu PDF. – mkl

+0

** C ** * "nie indywidualne pola podpisu, które już istnieją w dokumencie" * - rzeczywiście wygląda na to, że kod PDFBox do tworzenia widocznych podpisów PDF ignoruje istniejące pola podpisu.Ale tylko pola podpisu są tam, gdzie znajdują się i wizualizowane podpisy, * podpis cyfrowy * pod spodem wciąż podpisuje całą wersję. ** D ** * "Zauważyłem również, że podpisy w formacie pdfbox są niewidoczne ..." * - błędnie postrzegasz * wygląd * podpisu i * podpis cyfrowy * pod spodem. Podpis cyfrowy nigdy nie jest widoczny. ... – mkl

+0

... Ale oprogramowanie do podpisywania może dodać widoczny wygląd do pliku PDF, a różne oprogramowanie do podpisywania wprowadza różne informacje do tej wizualizacji. Ale nigdy nie należy ufać informacji w takiej wizualizacji, nie ma gwarancji, że to prawda, należy zawsze sprawdzić właściwości podpisu, aby uzyskać ostateczne informacje. ** E ** * "wydruki papierowe nie pokazują, że dokument jest podpisany" * - kopie nigdy nie zawierają wiarygodnych informacji dotyczących podpisów PDF. Mogą pokazywać coś wyglądającego jak podpis Adobe, który w rzeczywistości nie był opatrzony podpisem cyfrowym. – mkl