Automatyczne "podpisywanie"dokumentów

Jedną z zalet posiadania trójki dzieci jest ciągła konieczność mikrooptymalizacji różnych około-domowych procesów. Wyzwaniem jest ogarnianie zakupów, posiłków i prania, a czasmi dochodzą jeszcze różne “jednorazowe” (ale przecież cykliczne) zadania, na które jeszcze nie mam stworzonego procesu, a które irytują mnie samym faktem swojego istnienia.
Jednym z takich zadań jest cotygodniowe wysyłanie do zastępowej ZHR dokumentu, w którym swierdzam, że w tym tygodniu moja córka dobrze się czuje i może brać udział w zbiórce harcerskiej.
Co tydzień muszę usiąść do komputera, rozłożyć tablet graficzny, otworzyć w prorgamie Gimp
dokument pdf, podpisać go ręcznie, wpisując również datę, a następnie wyeksportować stronę z podpisem jako obraz i skleić ją wraz z innymi stronami-obrazami przy użyciu narzędzia convert
, aby uzyskać dokument .pdf, który wysyłam do zastępowej mailem.
Zastanawiałam się wielokrotnie, czy tego procesu nie uprościć. Miałam jednak wątpliwości: czy, jeśli wygeneruję takiego .pdf-a automatycznie, nastapił akt “podpisania”? Po namyśle doszłam do wniosku, że tak naprawdę to sam fakt wysłania dokumentu do osoby prowadzącej zbiórkę jest wyrazem czy też potwierdzeniem mojej woli. Podpis nałożony automatem niewiele się różni od rzeczywiście złożonego, a z prawnego punktu widzenia pewnie tak samo nic nie znaczy.
Dobrze by było stworzyć małe narządko, któremu podam datę, a ono wypełni mi odpowiednie pola i wygeneruje gotowy “podpisany” pdf.
Co chcę zrobić?
Chcę na podstawie dokumentu pdf zawierającego formularz automatycznie wygenerować inny dokument pdf, w którym na określonej pozycji pojawi się imię i nazwisko mojej córki, a na innej ręcznie wpisana data i mój własnoręczny podpis.
Jak to zrobić?
Utworzenie obrazków
Potrzebuję kilku obrazków:
- imienia i nazwiska dziecka
- mojego imienia i nazwiska
- obrazków z cyframi
- obrazka z kropką (data będzie w formacie
dd.MM.rrr
)
Uruchamiam Gimp-a, otwieram pdf i sprawdzam, ile mam miejsca na formularzu.

Tworzę dwa obrazki o odpowiednich wymiarach (mój podpis oraz imię i nazwisko córki) oraz serię obrazków przedstawiających cyfry (które zapisuję w plikach o nazwach reprezentujących te ctfry, za wyjątkiem kropki, którą zapisuję w pliku d.png):

Utworzenie projektu
Uruchamiam IntellijIdea, tworzę projekt mavenowy i dodaję zależności. Do generowania pdf-a w świecie Javy służy biblioteka itext, ale dopiero po chwili orientuję się, że sprawy są skomplikowane:
- wersja 5 to jeden jar, który początkowo włączyłam do projetu
- wersja 7 to wersja zmodularyzowana (jest dostępniona na licencji AGPL) Na stronie z porównaniem obydwu wersji można poczytać o tym, co każda z nich oferuje.
Postanowiłam trzymać się wersji 7, tym bardziej, że to dla tej wersji znalazłam:
- średniej jakości dokumentację
- przykłady na githubie
Dodanie zależności:
Oto zależności, których użyłam:
|
|
W zasadzie to mój programik powstał po przeczytaniu jednego przykładu dodawanie znaków wodnych do obrazków i przejrzeniu kilku innych. Nigdy wcześniej nie korzystałam z biblioteki itext.
Położenie obrazków
Czas nałożyć obrazek na dokument pdf. API, z którego skorzystałam, wymaga podania współrzędnych bezwzględnych. Układ współrzędnych ma swój początek (0, 0) w lewym, dolnym rogu, ale współrzędne punktu, w którym miał być nałożony obrazek, a jakie ustaliłam w Gimpie zostały chyba inaczej zinterpretowane i nie wyrenderowały się tam, gdzie się ich spodziewałam. Dlatego właśnie całe to pozycjonowanie odbywało się metodą prób i błędów.
Do wyrenderowania daty użyłam obrazków-cyfr, układając je w poziomie obok siebie. Oddaliłam je od siebie o pewną dobraną na oko wielkość. Używam datę podaną w wierszu poleceń bądź - jeśi jej nie podano - datę dzisiejszą.
Program
Założenia
Program zakłada, że w katalogu resources
znajdują się:
-
plik
input.pdf
zawierający pusty, dwustronicowy formularz -
pliki
0.png
,1.png
, …,9.png
orazd.png
(z kropką)- które będą nakładane co 15 pikseli, począwszy od współrzędnych (
dateLeft
,dateBottom
), czyli (200, 580)
- które będą nakładane co 15 pikseli, począwszy od współrzędnych (
-
plik
signature.png
z moim podpisem, który zostanie nałożony- na współrzędnych (350, 580)
- na stronie 2
-
plik
kid_name.png
z imieniem i nazwiskiem córki (w dopełniaczu), który zostanie nałożony- na współrzędnych (50, 245)
- na stronie 1
o - imię i nazwisko dziecka napisane ręcznie"/>
Do bieżącego katalogu wygenerowany zostanie plik output.pdf
.
Kod
Kod jest krótki i robi, co trzeba.
|
|
Uruchomienie
Przy uruchomieniu można podać datę w formacie dd.MM.yyy
. Uruchomienie bez daty używa daty bieżącej.
|
|

Ładniejszy pdf
Wygenerowany pdf byłby ładniejszy, gdybym na przykład zainwestowała więcej czasu i stworzyła własną czcionkę, imitującą mój charakter pisma. Artykuł Tworzenie czcionek w Inkscape pokazuje, jak to zrobić krok po kroku.
Początkowo miałam ochotę od tego zacząć, ale w końcu zdecydowałam, że zrobię prototyp wklejając zwykłe rastry.
Nad piękną czcionką może jeszcze kiedyś się zastanowię…
Github
Kod wrzuciłam do repozytorium na githubie.