این نسخه بومیسازی شده، Building a Compliance and Signing Workbench in Delphi with PDFlibPas را بر اساس مقاله پایه انگلیسی بهروزرسانی شده برای تیمهایی که با Delphi، PDF و نرمافزارهای اسناد کار میکنند، بررسی میکند
این صفحه، نسخه پایه بهروزرسانی شده را به نقاط کنترلی عملی برای طراحی، پیادهسازی و اعتبارسنجی تبدیل میکند
محتوای همگامسازی شده از نسخه پایه
مقاله پایه با زمینههای عملی، تصمیمات فنی و مثالهای ملموس گسترش یافته است، بنابراین این صفحه به جای یک خلاصه کوتاه، به عنوان یک راهنمای کاری عمل میکند
نکات مهم نسخه بهروزرسانی شده:
- ابتدا از فایلهای ورودی کوچک و قابل بازتولید استفاده کنید
- نام محصولات، APIها، فایلها و مقادیر ثابت را دستنخورده نگه دارید
- خروجی اعتبارسنج و نسخهها را همراه با فایل تست تولید شده ذخیره کنید
تصمیمات عملی پیادهسازی
با نوع فایل، نتیجه مورد انتظار، و خطایی که کاربر باید ببیند شروع کنید؛ سپس هر فراخوانی API را به یک نتیجه قابل بررسی پیوند دهید تا اعتبارسنجی، لاگها و پشتیبانی بتوانند وضعیت مشتری را بازتولید کنند
- ابتدا از فایلهای ورودی کوچک و قابل بازتولید استفاده کنید
- نام محصولات، APIها، فایلها و مقادیر ثابت را دستنخورده نگه دارید
- خروجی اعتبارسنج و نسخهها را همراه با فایل تست تولید شده ذخیره کنید
نکات کد و API
مثالهای کد برای مقایسه مستقیم با پروژههای Delphi، C++Builder و Lazarus/FPC بدون تغییر حفظ شدهاند
var
PDF: TPDFlib;
ListID, I: Integer;
begin
PDF := TPDFlib.Create;
try
ListID := PDF.CheckFileCompliance('invoice-fixed.pdf', '', 1, 0); // 1 = PDF/A
if ListID = 0 then
begin
if PDF.LastErrorCode <> 0 then
raise Exception.Create('Preflight could not read the file')
else
Writeln('No PDF/A findings');
end
else
begin
for I := 0 to PDF.GetStringListCount(ListID) - 1 do
Writeln(PDF.GetStringListItem(ListID, I));
PDF.ReleaseStringList(ListID);
end;
finally
PDF.Free;
end;
end;ProcessID := PDF.NewSignProcessFromFile('invoice-fixed.pdf', '');
if ProcessID = 0 then
raise Exception.Create('Cannot open source for signing');
PDF.SetSignProcessField(ProcessID, 'ApprovalSig');
PDF.SetSignProcessPFXFromFile(ProcessID, 'company.pfx', PfxPassword);
PDF.SetSignProcessInfo(ProcessID, 'Invoice approval', 'Berlin', 'billing@example.com');
PDF.SetSignProcessCustomSubFilter(ProcessID, 'ETSI.CAdES.detached'); // PAdES baseline
PDF.SetSignProcessDigestAlgorithm(ProcessID, 2); // SHA-256
PDF.SetSignProcessReserveContentsBytes(ProcessID, 8192); // room for a later timestamp
PDF.EndSignProcessToFile(ProcessID, 'invoice-signed.pdf');
if PDF.GetSignProcessResult(ProcessID) <> 1 then
Writeln('Sign failed, code ', PDF.GetSignProcessResult(ProcessID));
PDF.ReleaseSignProcess(ProcessID);var
Doc: TPDFlibSignDoc;
Names: TStringList;
FS: TFileStream;
I: Integer;
SourceSize, RangeStart, GapStart, TailStart, TailLen: Int64;
begin
// Capture the size before Open: the audit object holds a share lock on the file
FS := TFileStream.Create('invoice-signed.pdf', fmOpenRead or fmShareDenyNone);
SourceSize := FS.Size;
FS.Free;
Doc := TPDFlibSignDoc.Create;
Names := TStringList.Create;
try
if not Doc.Open('invoice-signed.pdf', '', False) then Exit;
Doc.GetSignatureFieldNames(Names);
for I := 0 to Names.Count - 1 do
if Doc.GetSignatureValueObjNum(Names[I]) > 0 then // > 0 means the field is signed
begin
RangeStart := StrToInt64(string(Doc.GetSignatureValueByName(Names[I], 11)));
GapStart := StrToInt64(string(Doc.GetSignatureValueByName(Names[I], 12)));
TailStart := StrToInt64(string(Doc.GetSignatureValueByName(Names[I], 13)));
TailLen := StrToInt64(string(Doc.GetSignatureValueByName(Names[I], 14)));
if (RangeStart = 0) and (TailStart + TailLen = SourceSize) then
Writeln(Names[I], ': signature covers the file to EOF')
else
Writeln(Names[I], ': earlier revision, or unusual ByteRange layout');
end;
Doc.Close;
finally
Names.Free;
Doc.Free;
end;
end;بررسی قبل از انتشار
فایل خروجی را با همان ابزارهایی بررسی کنید که مشتری یا مخزن اسناد استفاده خواهد کرد؛ نسخه کامپوننت، دادههای تست، نسخه اعتبارسنج و نتیجه مشاهده شده را ثبت کنید