PDF подпиÑÑÑ Ðµ пÑедимно оÑÑиÑане на байÑове и именно в Ñова оÑÑиÑане неÑаÑа Ñе обÑÑкваÑ. ÐÑипÑогÑаÑиÑÑа ÑабоÑи Ñ ÐºÐ¾Ð´, койÑо е одиÑиÑан в пÑодÑлжение на две деÑеÑилеÑиÑ, и Ñази ÑаÑÑ Ð¿Ð¾ÑÑи никога не Ñе пÑовалÑ. Това, коеÑо Ñе пÑÐ¾Ð²Ð°Ð»Ñ Ð² пÑоизводÑÑвена ÑÑеда, е по-пÑоÑÑо: запазен конÑейнеÑ, койÑо е ÑвÑÑде малÑк за иÑÑинÑÐºÐ¸Ñ Ð¿Ð¾Ð´Ð¿Ð¸Ñ, Ñ ÐµÑ, Ð²Ð·ÐµÑ Ð²ÑÑÑ Ñ Ð³ÑеÑна ÑаÑÑ Ð¾Ñ Ñайла, или âзапиÑванеâ?Ñлед подпиÑване, коеÑо ÑÐ¸Ñ Ð¾Ð¼Ñлком пÑенапиÑва байÑове, коиÑо подпиÑÑÑ Ð²ÐµÑе е замÑазил. РазположеÑе байÑовеÑе пÑавилно и зеленаÑа оÑмеÑка Ñе Ñе погÑижи Ñама за Ñебе Ñи.
HotPDF покÑива подпиÑванеÑо за Delphi и C++Builder на ÑÑи нива, каÑо избиÑаÑе Ð¼ÐµÐ¶Ð´Ñ ÑÑÑ , оÑговаÑÑйки на един вÑпÑоÑ: кÑде Ñе намиÑа ÑаÑÑниÑÑ ÐºÐ»ÑÑ? PFX Ñайл на диÑка изиÑква еднокÑаÑно повикване на ÑÑнкÑиÑ. ÐлÑÑ, заклÑÑен в HSM или ÑÑлÑга за оÑдалеÑено подпиÑване, Ñе нÑждае Ð¾Ñ Ð¿Ð¾ÑледоваÑелноÑÑÑа ÑезеÑваÑиÑ-Ñ ÐµÑиÑане-вмÑкване, ÑÑй каÑо ниÑо една библиоÑека не може да бÑÑкне в Ñокен и да извлеÑе клÑÑа. ÐодпиÑ, койÑо ÑÑÑбва да оÑговаÑÑ Ð½Ð° евÑопейÑкиÑе ÑегÑлаÑии, Ñе нÑждае допÑлниÑелно и Ð¾Ñ Ð±Ð°Ð·Ð¾Ð²Ð¸Ñе ÑÑÑÑкÑÑÑи на PAdES. РазделиÑе по-Ð´Ð¾Ð»Ñ ÑÐ»ÐµÐ´Ð²Ð°Ñ Ñази пÑогÑеÑиÑ.
Ðак /ByteRange ÑикÑиÑа подпиÑаниÑе байÑове
ÐодпиÑÑÑ ÑÑÑбва да живее вÑÑÑе вÑв Ñайла, койÑо подпиÑва, и не може да подпиÑе ÑÐ°Ð¼Ð¸Ñ Ñебе Ñи. PDF Ð·Ð°Ð¾Ð±Ð¸ÐºÐ°Ð»Ñ Ñози паÑадокÑ, каÑо оÑÑÐ°Ð²Ñ Ð¿Ñазнина. ÐÑеди подпиÑване запиÑваÑоÑо ÑÑÑÑойÑÑво ÑезеÑвиÑа Ð·Ð°Ð¿Ð¸Ñ /Contents Ñ ÑикÑиÑан ÑазмеÑ, пÑлен Ñ Ð½Ñли, и ÑегиÑÑÑиÑа маÑив /ByteRange за дваÑа диапазона Ð¾Ñ Ð´Ð²ÐµÑе Ð¼Ñ ÑÑÑани: вÑиÑко пÑеди пÑазнинаÑа и вÑиÑко Ñлед неÑ. ÐодпиÑваÑиÑÑ Ñ
еÑиÑа Ñези два диапазона и запиÑва полÑÑенаÑа CMS ÑÑÑÑкÑÑÑа в пÑазнинаÑа каÑо ÑеÑÑнадеÑеÑиÑен код. ÐапанÑÑ Ðµ в дÑмаÑа ÑикÑиÑан. Ðие Ñе ангажиÑаÑе Ñ ÑазмеÑа на Ñази пÑазнина, пÑеди да знаеÑе колко голÑм Ñе бÑде кÑайниÑÑ Ð¿Ð¾Ð´Ð¿Ð¸Ñ, Ñака Ñе ÑезеÑваÑиÑÑа ÑÑÑбва да бÑде ÑигÑÑна надÑенка. ÐÑем килобайÑа Ñдобно ÑÑдÑÑÐ¶Ð°Ñ Ð¾Ñделен CMS Ð¿Ð¾Ð´Ð¿Ð¸Ñ Ñ ÐºÑаÑка веÑига Ð¾Ñ ÑеÑÑиÑикаÑи.
HotPDF ÑÐ°Ð·Ð´ÐµÐ»Ñ Ð´Ð²Ð°Ñа ÑлÑÑÐ°Ñ Ð½Ð° две Ð¸Ð·Ð²Ð¸ÐºÐ²Ð°Ð½Ð¸Ñ Ð¸ обÑÑкванеÑо им е ÑеÑÑа Ñанна гÑеÑка. AddSignatureField поÑÑÐ°Ð²Ñ Ð¿Ñазно, видимо поле, коеÑо поÑÑебиÑелÑÑ Ð´Ð° подпиÑе по-кÑÑно в ÑеÑÐµÑ Ð½Ð° PDF. AddSignedSignatureField ÑÑздава полеÑо и ÑезеÑвиÑа пÑазнинаÑа /Contents, коеÑо е ÑоÑно Ñова, коеÑо иÑкаÑе, когаÑо код, а не Ñовек, Ñе завÑÑÑи подпиÑванеÑо. Ðко дадеÑе на вÑнÑен подпиÑÐ²Ð°Ñ Ð¿Ñазно поле, Ñой нÑма да има какво да попÑлни.
ÐÑÑÑÑ Ñ ÐµÐ´Ð½Ð¾ извикване: подпиÑване Ð¾Ñ PFX
ÐогаÑо ÑеÑÑиÑикаÑÑÑ Ð¸ неговиÑÑ ÑаÑÑен клÑÑ Ñе намиÑÐ°Ñ Ð² PFX/PKCS#12 Ñайл, койÑо ваÑиÑÑ Ð¿ÑоÑÐµÑ Ð¼Ð¾Ð¶Ðµ да пÑоÑеÑе, ÑелиÑÑ ÑÑÑбопÑовод Ñе Ñвежда до една клаÑова ÑÑнкÑиÑ:
if THotPDF.SignPDFWithPFX('invoice-unsigned.pdf', 'invoice-signed.pdf',
'company-cert.pfx', 'pfx-password') then
Writeln('Signed: invoice-signed.pdf')
else
raise Exception.Create('PFX signing failed');
ÐогаÑо Ñова Ñе пÑовали, PDF ÑайлÑÑ ÑÑдко е пÑоблемÑÑ. ÐÑоблемÑÑ Ðµ в PFX Ñайла. HotPDF ÑеÑе конÑейнеÑи, заÑиÑени Ñ PBES2, коеÑо ознаÑава деÑиваÑÐ¸Ñ Ð½Ð° клÑÑове PBKDF2 вÑÑÑ Ñ AES-256-CBC. PFX, екÑпоÑÑиÑан Ð¾Ñ Ð¿Ð¾-ÑÑÐ°Ñ ÑÑвеÑник за ÑеÑÑиÑикаÑи на Windows или Ð¾Ñ OpenSSL пÑеди 3.0, обикновено е опакован в наÑледена RC2 или 3DES заÑиÑа и пÑоÑÑо нÑма да Ñе анализиÑа. РеÑениеÑо е да екÑпоÑÑиÑаÑе конÑейнеÑа оÑново Ñ Ð¼Ð¾Ð´ÐµÑна заÑиÑа. ÐнеÑниÑÑ OpenSSL пÑави Ñова по подÑазбиÑане и Ñова не изиÑква пÑомÑна в кода. Така Ñе, когаÑо подпиÑванеÑо ÑпÑе незабавно пÑи ÑеÑÑиÑикаÑ, койÑо âÑабоÑи навÑÑкÑде дÑÑгадеâ? вижÑе как е ÑÑздаден PFX ÑайлÑÑ, пÑеди да подозиÑаÑе ÑобÑÑÐ²ÐµÐ½Ð¸Ñ Ñи код.
ÐÑÑÑÑ ÑезеÑваÑиÑ-Ñ ÐµÑиÑане-вмÑкване за HSM и Ñокени
ÐÑÑÑÑ Ñ ÐµÐ´Ð½Ð¾ извикване пÑедполага, Ñе ваÑиÑÑ Ð¿ÑоÑÐµÑ Ð¼Ð¾Ð¶Ðµ да пÑоÑеÑе клÑÑа каÑо Ñайл. ÐÑе по-ÑеÑÑо обаÑе Ñова е невÑзможно. ÐлÑÑÑÑ Ñе намиÑа в HSM, на USB Ñокен или зад API на ÑÑлÑга за подпиÑване и нÑма наÑин библиоÑека да го доÑÑÑпи диÑекÑно. HotPDF Ñе ÑпÑÐ°Ð²Ñ Ñ Ñова, каÑо ÑÐ°Ð·Ð´ÐµÐ»Ñ Ð¿Ð¾Ð´Ð¿Ð¸ÑванеÑо на ÑÑÑпки на ниво байÑове: запиÑване на докÑÐ¼ÐµÐ½Ñ Ñ ÑезеÑвиÑано мÑÑÑо, извлиÑане на диапазониÑе за Ñ ÐµÑиÑане Ð¾Ñ Ð±Ð¸Ð±Ð»Ð¸Ð¾ÑекаÑа, пÑедаване на Ð²Ñ Ð¾Ð´Ð° за Ñ ÐµÑиÑане на ÑÑÑÑойÑÑвоÑо, коеÑо ÑÑдÑÑжа клÑÑа, и Ñлед Ñова вмÑкване на вÑÑнаÑÐ¸Ñ CMS обÑаÑно в пÑазнинаÑа.
var
Doc: THotPDF;
Fs: TFileStream;
PdfBytes, HashInput, SigHex: AnsiString;
R1Start, R1Len, R2Start, R2Len, CStart, CLen: Integer;
begin
// 1. Write the document with a reserved /Contents hole
Doc := THotPDF.Create(nil);
try
Doc.FileName := 'placeholder.pdf';
Doc.BeginDoc;
Doc.CurrentPage.AddSignedSignatureField('Sig1',
Rect(50, 100, 350, 150), 8192, 'adbe.pkcs7.detached',
'Contract approval', 'Boston, MA', 'legal@example.com');
Doc.EndDoc;
finally
Doc.Free;
end;
// 2. Load the saved bytes; the returned offsets are 0-based
Fs := TFileStream.Create('placeholder.pdf', fmOpenRead);
try
SetLength(PdfBytes, Fs.Size);
Fs.ReadBuffer(PdfBytes[1], Fs.Size);
finally
Fs.Free;
end;
THotPDF.PreparePDFForSigning(PdfBytes, R1Start, R1Len, R2Start, R2Len,
CStart, CLen);
// 3. Hash both spans and sign externally (HSM, token, service)
HashInput := Copy(PdfBytes, R1Start + 1, R1Len) +
Copy(PdfBytes, R2Start + 1, R2Len);
SigHex := SignWithHsm(HashInput); // your integration: returns CMS as hex
// 4. Splice the signature into the reserved hole
THotPDF.InsertSignatureHex(PdfBytes, SigHex);
Fs := TFileStream.Create('signed.pdf', fmCreate);
try
Fs.WriteBuffer(PdfBytes[1], Length(PdfBytes));
finally
Fs.Free;
end;
end;
Ðве подÑобноÑÑи в Ñази поÑледоваÑелноÑÑ Ð¿ÑиÑинÑÐ²Ð°Ñ Ð¿Ð¾Ð²ÐµÑеÑо Ð¾Ñ Ð¿ÐµÑиодиÑниÑе пÑоблеми. ÐÑÑваÑа е, Ñе PreparePDFForSigning ÑабоÑи вÑÑÑ
Ñ Ð±Ð°Ð¹ÑовеÑе на завÑÑÑен Ñайл. ÐокÑменÑÑÑ Ñ ÑезеÑвиÑаноÑо мÑÑÑо ÑÑÑбва да бÑде запиÑан и запазен изÑÑло, пÑеди оÑмеÑÑваниÑÑа (offsets) да ознаÑÐ°Ð²Ð°Ñ Ð½ÐµÑо. Ðко ги изÑиÑлиÑе ÑпÑÑмо поÑок, койÑо вÑе оÑе Ñе ÑглобÑва, Ñе нÑма да ÑÑÐ²Ð¿Ð°Ð´Ð½Ð°Ñ Ñ Ð±Ð°Ð¹ÑовеÑе, коиÑо впоÑледÑÑвие Ñе Ñ
еÑиÑаÑе. ÐÑоÑаÑа подÑобноÑÑ Ðµ ÑазмеÑÑÑ Ð½Ð° ÑезеÑваÑиÑÑа. ÐаÑвениÑе Ð¾Ñ Ð²Ð°Ñ 8192 байÑа ÑÑÑбва да побеÑÐ°Ñ ÐºÑÐ°Ð¹Ð½Ð¸Ñ CMS код, а подпиÑ, ноÑÐµÑ Ð¼ÐµÐ¶Ð´Ð¸Ð½Ð½Ð¸ ÑеÑÑиÑикаÑи или декоÑиÑан Ð¾Ñ ÑÑлÑгаÑа ÑÑÑ Ð¿Ð¾Ð´Ð¿Ð¸Ñани аÑÑибÑÑи, може да надÑ
вÑÑли Ñози ÑазмеÑ. InsertSignatureHex нÑма да ÑвелиÑи пÑазнинаÑа, за да оÑвободи мÑÑÑо. ÐÑизнакÑÑ Ð·Ð° Ñова е ÑÑÑбопÑовод, койÑо ÑабоÑи оÑлиÑно Ñ ÐµÐ´Ð¸Ð½ ÑеÑÑиÑÐ¸ÐºÐ°Ñ Ð¸ Ñе пÑÐ¾Ð²Ð°Ð»Ñ ÑÑÑ ÑледваÑиÑ. РеÑениеÑо е да генеÑиÑаÑе оÑново докÑменÑа Ñ ÑезеÑвиÑано мÑÑÑо, изÑиÑлено Ð¾Ñ Ñеален подпиÑ, генеÑиÑан Ð¾Ñ ÑÑоÑвеÑÐ½Ð¸Ñ Ð¿Ð¾Ð´Ð¿Ð¸ÑваÑ, а не на база на пÑедположениÑ.
Ðазови нива на PAdES и вÑемеви оÑпеÑаÑÑÑи, коиÑо поддÑÑÐ¶Ð°Ñ Ð¿Ð¾Ð´Ð¿Ð¸Ñа валиден
Ðко подпиÑваÑе ÑÑглаÑно евÑопейÑкиÑе пÑавила, използваниÑÑ ÑÑандаÑÑ Ðµ ETSI EN 319 142-1, койÑо ÑÑÑеÑава ÑеÑиÑи базови нива на PAdES. B-B е обикновениÑÑ Ð¿Ð¾Ð´Ð¿Ð¸Ñ. B-T Ð´Ð¾Ð±Ð°Ð²Ñ Ð´Ð¾Ð²ÐµÑен вÑемеви оÑпеÑаÑÑк, койÑо доказва кога е напÑавен подпиÑÑÑ. B-LT вгÑажда данниÑе за валидиÑане, ÑеÑÑиÑикаÑиÑе и данниÑе за оÑÑеглÑне вÑÑÑе в докÑменÑа, за да може Ñой да бÑде пÑовеÑÑван години по-кÑÑно. B-LTA Ð´Ð¾Ð±Ð°Ð²Ñ Ð¿ÐµÑиодиÑни вÑемеви оÑпеÑаÑÑÑи за докÑменÑи, Ñака Ñе доказаÑелÑÑваÑа да надживеÑÑ Ð°Ð»Ð³Ð¾ÑиÑмиÑе, вÑÑÑ Ñ ÐºÐ¾Ð¸Ñо Ñа изгÑадени. HotPDF ÑÑздава ÑÑоÑвеÑниÑе ÑÑÑÑкÑÑÑи Ð¾Ñ ÑÑÑана на докÑменÑа за вÑÑко ниво:
// PAdES baseline signature field (ETSI EN 319 142-1)
Pdf.CurrentPage.AddPAdESSignatureField(
'ApprovalSig', Rect(50, 100, 350, 150), 'B-B',
'Contract approval', 'Boston, MA', 'legal@example.com');
// Document timestamp: larger reservation for the TSA token and chain
Pdf.CurrentPage.AddDocumentTimestampSignature('ArchiveTS', 16384);
РезеÑваÑиÑÑа Ð¾Ñ 16384 байÑа за вÑÐµÐ¼ÐµÐ²Ð¸Ñ Ð¾ÑпеÑаÑÑк е ÑмиÑлена. ÐÑганÑÑ Ð·Ð° вÑемеви оÑпеÑаÑÑÑи (TSA) вÑÑÑа Ñокен, койÑо ноÑи ÑвоÑÑа ÑобÑÑвена веÑига Ð¾Ñ ÑеÑÑиÑикаÑи, Ñака Ñе обикновено Ñе нÑждае Ð¾Ñ Ð¿Ð¾Ð²ÐµÑе мÑÑÑо, оÑколкого 8 KB, коиÑо Ñа доÑÑаÑÑÑни за обикновен подпиÑ. Тези вÑемеви оÑпеÑаÑÑÑи на докÑменÑи Ñа ÑÑÑо Ñака Ð¼ÐµÑ Ð°Ð½Ð¸Ð·Ð¼ÑÑ Ð·Ð°Ð´ B-LTA: повÑоÑноÑо поÑÑавÑне на вÑемеви оÑпеÑаÑÑк вÑÑÑ Ñ Ð°ÑÑ Ð¸Ð²Ð¸Ñан Ð¿Ð¾Ð´Ð¿Ð¸Ñ Ð½Ð° вÑеки нÑколко години Ñ Ð°ÐºÑÑални алгоÑиÑми е Ñова, коеÑо поддÑÑжа докÑменÑа, подпиÑан пÑез 2026 г., пÑовеÑим и пÑез 2040 г.
ÐÑколко дÑми за низовеÑе за пÑиÑина (reason), меÑÑоположение (location) и конÑÐ°ÐºÑ (contact), коиÑо и двеÑе Ð¸Ð·Ð²Ð¸ÐºÐ²Ð°Ð½Ð¸Ñ Ð½Ð° полеÑа пÑиемаÑ: Ñе Ñа пÑоÑÑо меÑаданни за ÑдобÑÑво и ниÑо повеÑе. HotPDF ги ÑÑÑ ÑанÑва каÑо обикновени запиÑи в ÑеÑник и ги изобÑазÑва вÑв Ð²Ð¸Ð´Ð¸Ð¼Ð¸Ñ Ð¾Ð±Ð»Ð¸Ðº на подпиÑа, но никой валидаÑÐ¾Ñ Ð½Ðµ ги пÑовеÑÑва. ÐопÑлвайÑе ги поÑледоваÑелно Ð¾Ñ Ð´Ð°Ð½Ð½Ð¸Ñе за ÑабоÑÐ½Ð¸Ñ Ð²Ð¸ пÑоÑеÑ, ÑÑй каÑо одиÑоÑиÑе ги ÑеÑаÑ, но никога не ги бÑÑкайÑе Ñ Ð´Ð¾ÐºÐ°Ð·Ð°ÑелÑÑво. ÐейÑÑвиÑелноÑо кÑипÑогÑаÑÑко ÑвÑÑдение Ñе ÑÑдÑÑжа изÑÑло в CMS и неговаÑа веÑига Ð¾Ñ ÑеÑÑиÑикаÑи, а валидаÑоÑÑÑ Ð½Ð°Ð¿Ñлно игноÑиÑа Ð²Ð¸Ð´Ð¸Ð¼Ð¸Ñ ÑекÑÑ.
След подпиÑване ÑайлÑÑ Ð¼Ð¾Ð¶Ðµ Ñамо да ÑаÑÑе
РмоменÑа, в койÑо подпиÑÑÑ ÑÑÑеÑÑвÑва, байÑовеÑе в неговиÑе диапазони Ñе замÑазÑваÑ. ÐдинÑÑвениÑÑ Ð»ÐµÐ³Ð¸Ñимен наÑин за пÑомÑна на Ñайла Ñлед Ñова е инкÑеменÑално акÑÑализиÑане по ISO 32000-1 §7.5.6 изиÑкваниÑ, коеÑо Ð´Ð¾Ð±Ð°Ð²Ñ Ð½Ð¾Ð²Ð¸ и пÑоменени обекÑи Ñлед оÑигиналниÑе байÑове и ÑвÑÑзва нова ÑекÑÐ¸Ñ Ð·Ð° кÑÑÑÑоÑани пÑепÑаÑки обÑаÑно кÑм ÑÑÑ . ÐÑи Ñози Ð¿Ð¾Ð´Ñ Ð¾Ð´ подпиÑÑÑ Ð¾ÑÑава валиден за ÑвоÑÑа веÑÑÐ¸Ñ Ð¸ ÑеÑеÑÑÑ Ð¾ÑÑиÑа пÑавилноÑо ÑÑÑÑоÑние: подпиÑанаÑа веÑÑÐ¸Ñ Ðµ непокÑÑнаÑа, докÑменÑÑÑ Ðµ бил ÑазÑиÑен Ñлед Ñова. ÐмеÑÑо Ñова, ако ÑеÑеÑиализиÑаÑе ÑÐµÐ»Ð¸Ñ Ñайл, Ñе пÑенапиÑеÑе подпиÑаниÑе диапазони, коеÑо ÑниÑожава подпиÑа, доÑи ако ниÑо видимо не Ñе е пÑоменило. СÑÑиÑÑ Ð¼ÐµÑ Ð°Ð½Ð¸Ð·Ñм за веÑÑии е и наÑинÑÑ, по койÑо един докÑÐ¼ÐµÐ½Ñ Ð¼Ð¾Ð¶Ðµ да ноÑи нÑколко подпиÑа: вÑеки нов Ð¿Ð¾Ð´Ð¿Ð¸Ñ Ñе Ñазполага в ÑÐ²Ð¾Ñ Ð¸Ð½ÐºÑеменÑална акÑÑализаÑиÑ, а неговиÑе диапазони Ð¾Ð±Ñ Ð²Ð°ÑÐ°Ñ Ð²ÑиÑко пÑеди него, вклÑÑиÑелно по-ÑанниÑе подпиÑи. ÐÐµÑ Ð°Ð½Ð¸ÐºÐ°Ñа на добавÑне в кÑÐ°Ñ Ð½Ð° Ñайла и кога е безопаÑно да Ñе компÑеÑиÑÐ°Ñ Ð¾Ð±ÐµÐºÑиÑе Ñа Ñазгледани в ÑÑаÑиÑÑа за поÑоÑи Ð¾Ñ Ð¾Ð±ÐµÐºÑи и инкÑеменÑални акÑÑализаÑии.
СÑÑÑва Ñи да имаÑе пÑедвид две огÑаниÑениÑ, докаÑо пÑоекÑиÑаÑе. ÐÐ·Ñ Ð¾Ð´Ð½Ð¸ÑÑ Ñежим PDF/A на HotPDF оÑÑ Ð²ÑÑÐ»Ñ Ð½Ð°Ð¿Ñлно полеÑаÑа за подпиÑ, Ñака Ñе аÑÑ Ð¸Ð²Ð½Ð¾Ñо ÑÑоÑвеÑÑÑвие и вгÑадениÑÑ Ð¿Ð¾Ð´Ð¿Ð¸Ñ ÑÑÑбва да Ñе доÑÑавÑÑ ÐºÐ°Ñо оÑделни Ñайлове. ÐÑвен Ñова подпиÑванеÑо не гаÑанÑиÑа конÑиденÑиалноÑÑ: Ñо доказва кой е ÑÑздал докÑменÑа и Ñе Ñой не е пÑоменÑн оÑÑогава, но вÑеки може да го пÑоÑеÑе. СкÑиванеÑо на ÑÑдÑÑжаниеÑо е оÑделна задаÑа, коÑÑо Ñе ÑеÑава ÑÑез AES-256 ÑиÑÑоване и полиÑика на ÑазÑеÑениÑ.
ÐаквоÑо и да ÑазÑабоÑиÑе, ÑеÑÑвайÑе го Ñ Ð½ÐµÑо ÑазлиÑно Ð¾Ñ ÐºÐ¾Ð´Ð°, койÑо е запиÑал Ñайла. ÐÑвоÑеÑе ÑезÑлÑаÑа в панела за подпиÑи на Acrobat и поÑвÑÑдеÑе ÑÑи неÑа: подпиÑÑÑ Ðµ валиден, иденÑиÑноÑÑÑа Ñе ÑвÑÑзва Ñ Ð¾ÑÐ°ÐºÐ²Ð°Ð½Ð¸Ñ Ð¾Ñ Ð²Ð°Ñ ÐºÐ¾Ñенов ÑеÑÑиÑÐ¸ÐºÐ°Ñ Ð¸ панелÑÑ Ð½Ðµ оÑÑиÑа пÑомени Ñлед подпиÑванеÑо. След Ñова пÑоменеÑе един Ð±Ð°Ð¹Ñ Ð² подпиÑÐ°Ð½Ð¸Ñ Ð´Ð¸Ð°Ð¿Ð°Ð·Ð¾Ð½ на ÑеÑÑово копие и Ñе ÑвеÑеÑе, Ñе панелÑÑ Ð²ÐµÑе опÑÐµÐ´ÐµÐ»Ñ Ð´Ð¾ÐºÑменÑа каÑо пÑоменен. ÐÑоÑÐµÑ Ð½Ð° подпиÑване, пÑи койÑо никога не ÑÑе виждали оÑÑ Ð²ÑÑлÑне на подпÑавен Ñайл, вÑÑÑноÑÑ Ð½Ðµ е бил изÑÑло ÑеÑÑван за пÑовеÑка.
Ð ÑÑиÑе нива на подпиÑване Ñе доÑÑавÑÑ Ñ ÐºÐ¾Ð¼Ð¿Ð¾Ð½ÐµÐ½Ñа HotPDF за Delphi и C++Builder; пÑодÑкÑоваÑа ÑÑÑаниÑа ÑÑдÑÑжа вÑÑзка кÑм пÑÐ»Ð½Ð¸Ñ ÑпÑавоÑник за API на подпиÑиÑе.