Generování PDF - zámek při provedení podpisu rubrika: Programování: PHP

1 Misfit
položil/-a 8.1. 9:26
 
upravil/-a 8.1. 9:32

Zdravím,

pro klienta generujeme z dat PDF ve kterých jsou editovatelné inputy a dva inputy s podpisem, který lze podepsat v Adobe Acrobat Readeru. Při podepsání klient žádá, aby se zamkly všechna/některá pole automaticky. Lze toho docílit v Adobe Acrobat Readeru zaškrtnutím checkboxu při podpisu, ale klient je prostě klient a nebude na ten jeden checkbox klikat. Že to jde udělat víme, avšak se nám nedaří to provést. Pro generování PDFka z HTML používáme knihovnu TCPDF ( https://tcpdf.org/ ). Tato knihovna zamykání po podpisu neumí. Našel sem si však kus kódu, kde se podpis generuje:

// widget annotation for empty signature
$out = $this->_getobj($esa['objid']) . "\n";
$out .= '<< /Type /Annot';
$out .= ' /Subtype /Widget';
$out .= ' /Rect [' . $esa['rect'] . ']';
$out .= ' /P ' . $this->page_obj_id[($esa['page'])] . ' 0 R'; // link to signature appearance page
$out .= ' /F 4';
//$out .= ' /BS /S';
//$out .= ' /BS /U';
$out .= ' /FT /Sig';
$signame = $esa['name'] . sprintf(' [%03d]', ($key + 1));
$out .= ' /T ' . $this->_textstring($signame, $esa['objid']);
$out .= ' /Ff 0';
$out .= ' >>';
$out .= "\n" . 'endobj';
$this->_out($out);

Dle oficiální specifikace PDF ( https://www.adobe.com/content/dam/acom/en/devnet/pdf/pdf_reference_archi... ) - strana 695 a níže, by mělo jít přidat přepínač /Lock a k tomu nějaké parametry asi, ale úplně tomu nerozumím, jak to funguje. Zkoušel sem do kódu výše přidat například:

$out .= ' /FT /Sig /Lock';
$out .= ' /FT /Sig /Lock TRUE';
$out .= ' /FT /Sig /Lock <</Action/All/Type/SigFieldLock>>';
... vícero takových pokusů

Máme jedno PDFko, kde tohle již funguje(nemáme ale zdroják, ani jak se to udělalo) a to pokud si otevřu ve VSCODE, tak tam je:

232 0 obj
<</AP<</N 255 0 R>>/DA(/TrebuchetMS 0 Tf 0 g)/F 4/FT/Sig/Lock 256 0 R/MK<<>>/P 36 0 R/Rect[432.984 753.0 576.984 825.0]/Subtype/Widget/T(Certifikace_spravce)/Type/Annot>>
endobj

kde za /Lock je 256 0 - to dle mě znamená referenci na další objekt a to je:

256 0 obj
<</Action/All/Type/SigFieldLock>>
endobj

Což by mělo zamknout všechny pole. Takže jsem zkoušel udělat něco podobného v kódu, ale stejně mi to nefunguje s výstupem:

20 0 obj
<< /Type /Annot /Subtype /Widget /Rect [300.473000 283.888026 552.756465 354.754168] /P 24 0 R /F 4 /FT /Sig /Lock 55 0 /T (vlozpodpis) /Ff 0 >>
endobj
55 0 obj
<</Action/All/Type/SigFieldLock>>
endobj

Ještě lze při generování PDF přilinkovat Javascript. Abobe k tomu má vlastní JS api, kde lze pracovat s inputy. Bohužel ty funkce které potřebuju já jsou "chráněné" a je třeba povolit jim oprávnění v Adobe Acrobat Readeru => to je pro klienta též nereálné. Ještě je v JS další metoda označit inputy jako readonly, ale tam dle mě vzniká problém, že pokud někdo bude mít Adobe Acrobat Reader PRO, tak by si tam mohl přidat vlastní JS, které by mu pole jako readonly odznačil, což určitě nechceme. Takže snippet Javascript kódu který jsem zkoušel nedávám, jelikož je to dle mě nepoužitelné.

Jakýkoliv můj marný pokus znamená, že se podpisy vůbec nezobrazí.

Nemá zde někdo zkušenosti s generováním PDF? Moc by mi to pomohlo, už sem celkem v koncích.. Díky za jakoukoliv pomoc.

odkaz
1 Misfit
odpověděl/-a 8.1. 13:44

Tak už to nepotřebuji, podařilo se mi to po 3 dnech dle té specifikace nějak udělat.. Udělám pull request do knihovny, určitě se to bude ještě někomu hodit...

Pro plný přístup na Devel.cz se prosím přihlaste:

Rychlé přihlášení přes sociální sítě:

Nebo se přihlaste jménem a heslem:

Zadejte prosím svou e-mailovou adresu.
Zadejte své heslo.