РабоÑнаÑа ÑÑеда за пÑиемане и пÑеглед на PDF е малка пÑогÑама Ñ ÐµÐ´Ð½Ð° задаÑа: да пÑовеÑи вÑеки Ñайл, пÑеди каквиÑо и да било ÑледваÑие пÑоÑеÑи да полÑÑÐ°Ñ Ð´Ð¾ÑÑÑп до него. Ðа да напÑави Ñова, ÑÑ ÑÑÑбва да обедини нÑколко вÑзможноÑÑи в един Ð¾Ð±Ñ Ð¾Ð´. Ð¢Ñ Ð¾ÑваÑÑ Ñайла (без да Ð¼Ñ Ñе довеÑÑва ÑлÑпо), ÑеÑе Ñова, коеÑо ÑайлÑÑ ÑвÑÑди за Ñебе Ñи, ÑÑÑÑи ÑÑдÑÑжание, коеÑо би подвело пÑоÑÑ Ð°Ð»Ð³Ð¾ÑиÑÑм за извлиÑане на ÑекÑÑ Ð¸Ð»Ð¸ би пÑенеÑло аÑака, опÑÐµÐ´ÐµÐ»Ñ Ð´Ð°Ð»Ð¸ изобÑо има ÑекÑÑ Ð·Ð° извлиÑане и Ñлед Ñова наÑоÑва докÑменÑа кÑм ÑÑоÑвеÑнаÑа опаÑка вÑз оÑнова на намеÑеноÑо. Ðко пÑопÑÑнеÑе Ñази пÑовеÑка, гÑеÑкиÑе Ñе оÑÑÐ°Ð½Ð°Ñ Ð½ÐµÐ·Ð°Ð±ÐµÐ»Ñзани: PDF Ñайл, заÑиÑен Ñ Ð¿Ð°Ñола на ÑобÑÑвеника (owner password) и ÑÑдÑÑÐ¶Ð°Ñ XFA ÑоÑмÑлÑÑ, пÑеминава пÑез пÑоÑеÑа на извлиÑане на ÑекÑÑ ÐºÐ°Ñо пÑазни низове, индекÑиÑа Ñе каÑо пÑазен докÑÐ¼ÐµÐ½Ñ Ð¸ никой не забелÑзва, докаÑо поÑÑебиÑел по-наÑаÑÑк не поÑÑÑÑи ÑÑдÑÑжание, коеÑо вÑÑÑноÑÑ Ð½Ð¸ÐºÐ¾Ð³Ð° не е било пÑоÑеÑено. PDFium Component е библиоÑека за пÑеглед и инÑпекÑÐ¸Ñ Ñ Ð¸Ð·Ñ Ð¾Ð´ÐµÐ½ код за VCL/LCL за Delphi, C++Builder и Lazarus, и ÑÑ Ð¿ÑедоÑÑÐ°Ð²Ñ Ð¸Ð·Ð²Ð¸ÐºÐ²Ð°Ð½Ð¸ÑÑа за инÑÑоÑпекÑиÑ, Ð¾Ñ ÐºÐ¾Ð¸Ñо Ñе нÑждае Ñази ÑабоÑна ÑÑеда. РазделиÑе по-Ð´Ð¾Ð»Ñ Ð¾Ð¿Ð¸ÑÐ²Ð°Ñ ÐºÐ¾Ðµ извикване на кой вÑпÑÐ¾Ñ Ð¾ÑговаÑÑ, какÑо и двеÑе меÑÑа, кÑдеÑо оÑевидноÑо извикване ви дава напÑлно погÑеÑен оÑговоÑ.
ÐÐµÑ Ð²ÑпÑоÑа, на коиÑо да оÑговоÑиÑе, пÑеди ÑайлÑÑ Ð´Ð° бÑде наÑоÑен
Ðко пÑÐµÐ¼Ð°Ñ Ð½ÐµÑе мÑежаÑа Ñ Ð¸Ð·Ð¾Ð±ÑÐ°Ð¶ÐµÐ½Ð¸Ñ Ð¸ ленÑаÑа Ñ Ð¼Ð¸Ð½Ð¸Ð°ÑÑÑи, ÑоÑÑиÑанеÑо пÑи пÑиемане Ñе Ñвежда до Ð¿ÐµÑ Ð²ÑпÑоÑа:
- Ðоже ли изобÑо да Ñе оÑвоÑи ÑайлÑÑ Ð¸ Ñ ÐºÐ¾Ñ Ð¿Ð°Ñола?
- Ðа какÑв Ñе пÑедÑÑÐ°Ð²Ñ ÑайлÑÑ: заглавие, авÑоÑ, даÑа на ÑÑздаване?
- СÑдÑÑжа ли акÑивно или ÑиÑково ÑÑдÑÑжание каÑо JavaScript, XFA ÑоÑмÑлÑÑ Ð¸Ð»Ð¸ вгÑадени Ñайлове?
- Ðма ли ÑекÑÑ Ð·Ð° извлиÑане, или е ÑканиÑано изобÑажение, пÑедназнаÑено за OCR?
- ÐаÑо Ñе има пÑедвид вÑиÑко Ñова, ÐºÐ¾Ñ Ð¾Ð¿Ð°Ñка го поема: диÑекÑна обÑабоÑка, ÑÑÑен пÑеглед или каÑанÑина?
ÐÑеки вÑпÑÐ¾Ñ ÑÑоÑвеÑÑÑва на едно или две Ð¸Ð·Ð²Ð¸ÐºÐ²Ð°Ð½Ð¸Ñ Ð² PDFium Component. Ðве Ð¾Ñ Ñези ÑÑоÑвеÑÑÑÐ²Ð¸Ñ Ð¸Ð¼Ð°Ñ ÑвоиÑе оÑобеноÑÑи, коиÑо Ñа пÑиÑина за повеÑеÑо непÑавилно наÑоÑени Ñайлове, коиÑо е ÑÑÑбвало да дебÑгвам в Ñеални ÑÑловиÑ. ÐеÑаданниÑе на докÑменÑа живеÑÑ Ð½Ð° две ÑазлиÑни меÑÑа, коиÑо Ð¼Ð¾Ð³Ð°Ñ Ð´Ð° Ñе ÑазминаваÑ, а кÑипÑиÑанеÑо не винаги пÑеÑи на докÑменÑа да Ñе оÑвоÑи.
ÐкономиÑно оÑваÑÑне: изклÑÑено попÑлване на ÑоÑмÑлÑÑи и без ÑендиÑане на ÑÑÑаниÑи
СоÑÑиÑанеÑо ÑÑÑбва да оÑваÑÑ Ñайла по вÑзможно най-икономиÑÐ½Ð¸Ñ Ð½Ð°Ñин. ÐадаванеÑо на FormFill := False пÑеди Active := True Ñказва на компоненÑа да пÑеÑкоÑи изÑÑло ÑÑедаÑа за попÑлване на ÑоÑмÑлÑÑи. Това ÑÑкÑаÑава вÑемеÑо за заÑеждане и (коеÑо е ÑÑÑо Ñолкова важно за Ñайлове Ñ Ð½ÐµÐ¸Ð·Ð²ÐµÑÑен пÑоизÑ
од) пÑедоÑвÑаÑÑва иниÑиализиÑанеÑо на какÑвÑо и да е JavaScript на ниво докÑменÑ. Ðикое Ð¾Ñ ÑвойÑÑваÑа за инÑпекÑиÑ, използвани по-долÑ, не изиÑква ÑендиÑане на ÑÑÑаниÑа, Ñака Ñе пÑоÑеÑÑÑ Ð½Ð° ÑоÑÑиÑане никога не пÑоизвежда ÑаÑÑеÑни изобÑажениÑ.
procedure InspectIncoming(const IncomingPath: string; var Rec: TIntakeRecord);
var
Pdf: TPdf;
begin
Pdf := TPdf.Create(nil);
try
Pdf.FileName := IncomingPath;
Pdf.FormFill := False; // no form environment, no JavaScript init
Pdf.Active := True; // failure is silent: Active simply stays False
if not Pdf.Active then
begin
Rec.OpenFailed := True; // damaged file or user-password lock
Exit; // the finally block still runs
end;
Rec.PageCount := Pdf.PageCount;
CollectIdentity(Pdf, IncomingPath, Rec);
CollectRiskSignals(Pdf, Rec);
finally
Pdf.Active := False;
Pdf.Free; // never leak the instance on a malformed file
end;
end;
ÐÑовеÑкаÑа Ñлед пÑиÑвоÑванеÑо не е опÑионална и ÑÑ Ðµ пÑовеÑка, а не обÑабоÑÑик на изклÑÑÐµÐ½Ð¸Ñ Ð¿Ð¾ конкÑеÑна пÑиÑина. ÐогаÑо енджинÑÑ Ð½Ðµ може да заÑеди Ñайла, компоненÑÑÑ Ð¿Ð¾ÑиÑка вÑÑÑеÑнаÑа гÑеÑка EPdfError и оÑÑÐ°Ð²Ñ Active на False, вмеÑÑо да Ñ ÑазпÑоÑÑÑанÑва нагоÑе. Ðод, койÑо Ñака изклÑÑение, Ñ ÑдоволÑÑвие Ñе пÑоÑеÑе PageCount Ð¾Ñ Ð´Ð¾ÐºÑменÑ, койÑо никога не Ñе е оÑвоÑил. Ðко ÑабоÑниÑÑ Ð¿ÑоÑÐµÑ Ð¿Ð¾ оÑÑ
вÑÑлÑне Ñе нÑждае Ð¾Ñ Ð´ÐµÐ¹ÑÑвиÑÐµÐ»Ð½Ð¸Ñ ÑекÑÑ Ð½Ð° гÑеÑкаÑа Ð¾Ñ ÐµÐ½Ð´Ð¶Ð¸Ð½Ð°, пÑоÑеÑеÑе Ñайла в байÑов маÑив и извикайÑе пÑеÑоваÑÐµÐ½Ð¸Ñ Ð¼ÐµÑод LoadDocument, койÑо пÑиема TBytes â?Ñози пÑÑ Ð½Ð°Ð¸ÑÑина пÑедизвиква EPdfError ÑÑÑ ÑÑоÑвеÑноÑо ÑÑобÑение (вклÑÑиÑелно пÑи гÑеÑка Ñ Ð¿Ð°Ñола). ÐлокÑÑ try..finally ÑÑÑо има важно мÑÑÑо ÑÑк. УÑлÑгиÑе за пÑиемане на Ñайлове ÑабоÑÑÑ Ð±ÐµÐ· Ð½Ð°Ð´Ð·Ð¾Ñ Ñ ÑедмиÑи и никое изклÑÑение не ÑÑÑбва да води до изÑиÑане на инÑÑанÑиÑÑа на TPdf или да дÑÑжи заклÑÑен Ñайл, в койÑо ÑледваÑиÑÑ Ð¾Ð¿Ð¸Ñ Ñе Ñе ÑпÑне.
ÐÑопÑÑкаÑелнаÑа ÑпоÑобноÑÑ ÑÑдко Ñе пÑевÑÑÑа в пÑеÑка. ÐÑи изклÑÑено попÑлване на ÑоÑмÑлÑÑи и без ÑендиÑане, оÑваÑÑнеÑо пÑи ÑоÑÑиÑане Ñе огÑаниÑава оÑновно Ð¾Ñ Ð²Ñ Ð¾Ð´Ð½Ð¾-Ð¸Ð·Ñ Ð¾Ð´Ð½Ð¸Ñе опеÑаÑии (I/O) и един-единÑÑвен ÑабоÑен пÑоÑÐµÑ Ð»ÐµÑно пÑовеÑÑва по нÑколко Ñайла на ÑекÑнда Ð¾Ñ Ð»Ð¾ÐºÐ°Ð»Ð½Ð¸Ñ Ð´Ð¸Ñк. Ðко обемÑÑ Ð½Ð° Ð²Ñ Ð¾Ð´ÑÑиÑе докÑменÑи Ð½Ð°Ð´Ñ Ð²ÑÑли вÑзможноÑÑиÑе на един пÑоÑеÑ, ÑазделеÑе ÑабоÑаÑа по Ñайлове, а не по видове пÑовеÑки. ÐеÑÑе вÑпÑоÑа ÑподелÑÑ ÐµÐ´Ð½Ð¾ оÑваÑÑне и ÑазделÑнеÑо им в ÑазлиÑни пÑоÑеÑи би Ñмножило най-ÑкÑпаÑа ÑÑÑпка, вмеÑÑо да ÑазпÑедели ÑÐ°Ð·Ñ Ð¾Ð´Ð¸Ñе за неÑ.
ÐеÑаданниÑе живеÑÑ Ð½Ð° две меÑÑа и Ñе Ñе ÑазминаваÑ
СÑандаÑÑÑÑ ISO 32000-1 деÑиниÑа две меÑÑа за ÑÑÑ
Ñанение на меÑаданниÑе на докÑменÑа: ÑеÑника Ñ Ð¸Ð½ÑоÑмаÑÐ¸Ñ Ð·Ð° докÑменÑа (document information dictionary â?клаÑза 14.3.3) и XMP пакеÑ, пÑикаÑен кÑм каÑалога (каÑалог â?клаÑза 14.3.2). СвойÑÑваÑа Title, Author, Subject и CreationDate ÑеÑÐ°Ñ ÑеÑника Info, каÑо за вÑеки дÑÑг клÑÑ Ñе използва MetaText[], а DecodeDate Ñе гÑижи за анализиÑанеÑо на низа Ñ Ð´Ð°Ñа вÑв ÑоÑÐ¼Ð°Ñ D:YYYYMMDD.... УловкаÑа е, Ñе ÑÑвÑеменниÑе ÑоÑÑÑеÑни инÑÑÑÑменÑи вÑе по-ÑеÑÑо запиÑÐ²Ð°Ñ Ð¼ÐµÑаданни Ñамо в XMP пакеÑа â?поÑока, коÑÑо ISO 32000-2 пÑави оÑиÑиална, каÑо пÑемаÑ
ва повеÑеÑо клÑÑове Ð¾Ñ ÑеÑника Info в PDF 2.0. СимпÑомÑÑ Ð² инÑÑÑÑменÑа за пÑиемане е ÑÑвÑем ÑÑен: ÑабоÑнаÑа ви ÑÑеда показва пÑазно заглавие, докаÑо Adobe Acrobat показва Ñакова, ÑÑй каÑо Acrobat Ñе е вÑÑнал кÑм dc:title вÑÑÑе в XMP пакеÑа, койÑо ÑвойÑÑваÑа на ÑеÑника Info изобÑо не докоÑваÑ.
procedure CollectIdentity(Pdf: TPdf; const FilePath: string;
var Rec: TIntakeRecord);
begin
Rec.Title := Pdf.Title; // Info dictionary value
Rec.Author := Pdf.Author;
Rec.CreatedAt := Pdf.CreationDate; // raw PDF date string ("D:2026...")
// An empty Info title does not mean the document is untitled. The
// component does not expose the XMP packet, so probe the raw file
// bytes for the dc:title element before trusting the blank.
if (Rec.Title = '') and FileContainsText(FilePath, 'dc:title') then
Include(Rec.Flags, ifTitleInXmpOnly);
end;
ÐоÑи гÑÑбоÑо ÑÑÑÑене на подниз по-гоÑе Ñи ÑÑÑÑва ÑÑилиÑÑа: âналиÑнÐ?меÑаданни, но не Ñам, кÑдеÑо ÑÑÑÑÑÑ Ð¿Ð¾-ÑÑаÑиÑе инÑÑÑÑменÑиâ?е ÑакÑ, важен за наÑоÑванеÑо в ÑамкиÑе на вÑеки аÑÑ Ð¸Ð², койÑо индекÑиÑа докÑменÑи по заглавие или авÑоÑ. Ðко ваÑиÑÑ Ð¸Ð½Ð´ÐµÐºÑ Ñлед Ñова ÑеÑе Ñамо ÑеÑника Info, ÑайловеÑе, маÑкиÑани по Ñози наÑин, ÑÐ¸Ñ Ð¾Ð¼Ñлком Ñе ÑÑÐ°Ð½Ð°Ñ Ð½ÐµÐ¾ÑкÑиваеми пÑи ÑÑÑÑене.
ÐÑипÑиÑани Ñайлове, коиÑо Ñе оÑваÑÑÑ Ð²ÑпÑеки Ñова
ÐÑипÑиÑаниÑÑ Ð´Ð¾ÐºÑÐ¼ÐµÐ½Ñ Ð½Ðµ винаги Ñе пÑÐ¾Ð²Ð°Ð»Ñ Ð¿Ñи оÑваÑÑне. СÑандаÑÑниÑÑ Ð¼ÐµÑ Ð°Ð½Ð¸Ð·Ñм за ÑигÑÑноÑÑ (ISO 32000-1, клаÑза 7.6.3) ÑазгÑаниÑава поÑÑебиÑелÑкаÑа паÑола (user password), Ð½ÐµÐ¾Ð±Ñ Ð¾Ð´Ð¸Ð¼Ð° за оÑваÑÑне на докÑменÑа, Ð¾Ñ Ð¿Ð°ÑолаÑа на ÑобÑÑвеника (owner password), коÑÑо Ñамо огÑаниÑава пÑава каÑо пеÑÐ°Ñ Ð¸ копиÑане. ÐолÑма ÑаÑÑ Ð¾Ñ âзаÑиÑениÑеâ?Ð±Ð¸Ð·Ð½ÐµÑ Ð´Ð¾ÐºÑменÑи Ñа кÑипÑиÑани Ñ Ð¿Ð°Ñола на ÑобÑÑвеника и пÑазна поÑÑебиÑелÑка паÑола. Те Ñе оÑваÑÑÑ Ð±ÐµÐ· подкана, декÑипÑиÑÐ°Ñ Ñе напÑлно и ÑазÑиÑÐ°Ñ Ð½Ð° Ñова, Ñе визÑализаÑоÑиÑе Ñе избеÑÐ°Ñ Ð´Ð° заÑеÑÐ°Ñ ÑлаговеÑе за пÑава. Това е полиÑика, а не Ñеална заÑиÑа, и ÑÑÑÑоÑниÑÑа на пÑоÑеÑа ви на пÑиемане ÑÑÑбва да оÑÑазÑÐ²Ð°Ñ Ñази Ñазлика.
ÐÑкÑиванеÑо на кÑипÑиÑане Ñлед ÑÑпеÑно оÑваÑÑне изиÑква едно извикване кÑм енджина плÑÑ ÑезеÑвен ваÑианÑ. FPDF_GetSecurityHandlerRevision(Pdf.Document) вÑÑÑа -1 за незаÑиÑени Ñайлове и ÑÑоÑвеÑнаÑа веÑÑÐ¸Ñ Ð½Ð° меÑ
анизма в пÑоÑивен ÑлÑÑай, а вÑÑÑанеÑо на маÑка, ÑазлиÑна Ð¾Ñ Ð¿ÑлнаÑа $FFFFFFFF Ð¾Ñ Pdf.Permissions, е поÑвÑÑждаваÑиÑÑ Ñигнал. Ðа наиÑÑина заклÑÑени Ñ Ð¿Ð¾ÑÑебиÑелÑка паÑола Ñайлове, пÑиÑвоеÑе Password пÑеди да зададеÑе Active := True â?ако оÑваÑÑнеÑо вÑе оÑе Ñе пÑовалÑ, наÑоÑеÑе Ñайла кÑм ÑÑÑÑоÑние на блокиÑан, коеÑо изиÑква данни за доÑÑÑп Ð¾Ñ Ð¿Ð¾Ð´Ð°ÑÐµÐ»Ñ Ð¿Ñез заÑиÑен канал, вмеÑÑо да опиÑваÑе ÑлÑпо оÑново. РизбÑгвайÑе изкÑÑениеÑо да ÑÑеÑиÑаÑе вÑÑко âкÑипÑиÑанеâ?каÑо повод за незабавна каÑанÑина. РповеÑеÑо ÑÑеÑи, ÑабоÑеÑи Ñ Ð³Ð¾Ð»Ñм обем докÑменÑи, кÑипÑиÑаниÑе, но леÑни за оÑваÑÑне Ñайлове Ñа обиÑаен ÑлÑÑай, а не подозÑиÑелен.
ÐкÑивно ÑÑдÑÑжание: JavaScript, XFA и вгÑадени Ñайлове
ТÑи конÑÑаÑаÑии винаги ÑÑÑбва да влиÑÑÑ Ð½Ð° ÑеÑениеÑо за наÑоÑване. ÐÑÑво, JavaScript: ÑÑбиÑиеÑо OnUnsupportedFeature ÑÑобÑава за ÑÑÑÑкÑÑÑни Ñ
аÑакÑеÑиÑÑики каÑо XFA или 3D ÑÑдÑÑжание, когаÑо енджинÑÑ Ð³Ð¸ ÑÑеÑне, но не заÑиÑа JavaScript. ÐмеÑÑо Ñова пÑовеÑеÑе JavaScriptActionCount и ÑÑеÑиÑайÑе ненÑлев ÑезÑлÑÐ°Ñ ÐºÐ°Ñо акÑивно ÑÑдÑÑжание. ÐÑоÑо, XFA: когаÑо FormType вÑÑне ftXfaFull, видимиÑе ÑÑÑаниÑи ÑеÑÑо Ñа пÑоÑÑо изобÑазÑване на XFA Ñаблона и конвенÑионалноÑо извлиÑане на ÑекÑÑ Ñе пÑоÑеÑе обÑи Ñаблони (boilerplate) вмеÑÑо попÑлнениÑе ÑÑойноÑÑи. ТÑеÑо, пÑикаÑени Ñайлове (attachments): PDF е конÑейнеÑен ÑоÑÐ¼Ð°Ñ Ð¸ AttachmentCount ви показва дали Ñози Ñайл ноÑи дÑÑги ÑÑÑ Ñебе Ñи.
procedure CollectRiskSignals(Pdf: TPdf; var Rec: TIntakeRecord);
var
i, PageNo: Integer;
Ext: string;
begin
Rec.IsEncrypted := Assigned(FPDF_GetSecurityHandlerRevision) and
(FPDF_GetSecurityHandlerRevision(Pdf.Document) <> -1);
Rec.HasForms := Pdf.FormType <> ftNone;
Rec.IsXfa := Pdf.FormType = ftXfaFull;
Rec.HasJavaScript := Pdf.JavaScriptActionCount > 0;
// AnnotationCount is a per-page property; walk the pages to total
// it. Loading a page object renders nothing, so this stays cheap.
Rec.Annotations := 0;
for PageNo := 1 to Pdf.PageCount do
begin
Pdf.PageNumber := PageNo;
Inc(Rec.Annotations, Pdf.AnnotationCount);
end;
Rec.Attachments := Pdf.AttachmentCount;
for i := 0 to Rec.Attachments - 1 do
begin
Ext := LowerCase(ExtractFileExt(string(Pdf.AttachmentName[i])));
if (Ext = '.exe') or (Ext = '.js') or (Ext = '.vbs') or (Ext = '.dll') then
Include(Rec.Flags, ifDangerousAttachment);
end;
end;
Ðва деÑайла в Ñози ÑикÑл заÑлÑÐ¶Ð°Ð²Ð°Ñ Ð²Ð½Ð¸Ð¼Ð°Ð½Ð¸Ðµ. ÐмеÑо на пÑÐ¸Ð»Ð¾Ð¶ÐµÐ½Ð¸Ñ Ñайл идва Ð¾Ñ Ð²ÑÑÑеÑноÑÑÑа на докÑменÑа, Ñака Ñе никога не го използвайÑе каÑо изÑ
оден пÑÑ Ð±ÐµÐ· пÑедваÑиÑелно ÑаниÑане â?вгÑадено име каÑо ..\..\start.exe е ÑÑзвимоÑÑ Ð·Ð° пÑеминаване по пÑÑÑ (path traversal), ÑакаÑа невнимаÑелно запиÑване на Ñайл. ÐÑвен Ñова ÑпиÑÑкÑÑ Ñ Ð·Ð°Ð±Ñанени ÑазÑиÑÐµÐ½Ð¸Ñ Ðµ Ñамо пÑедÑпÑедиÑелен Ñигнал, а не гаÑанÑиÑ. ÐеговаÑа задаÑа е да наложи вземанеÑо на ÑовеÑко ÑеÑение, а не да ÑеÑÑиÑиÑиÑа Ñайла каÑо безопаÑен.
ÐÑевÑÑÑане на ÑигналиÑе в ÑÑÑÑоÑÐ½Ð¸Ñ Ð½Ð° наÑоÑване
Ðдин ÑабоÑÐµÑ Ð¼Ð¾Ð´ÐµÐ» на ÑÑÑÑоÑниÑÑа Ñе нÑждае Ð¾Ñ Ð¿Ð¾-малко ÑÑÑпки, оÑколкоÑо повеÑеÑо екипи оÑакваÑ: ready (гоÑов â?без пÑеÑки, налиÑен ÑекÑÑ), review (за пÑеглед â?оÑваÑÑнеÑо е ÑÑпеÑно, но неÑо изиÑква внимание, напÑÐ¸Ð¼ÐµÑ XFA ÑоÑмÑлÑÑ, JavaScript, пÑазен ÑекÑÑов Ñлой или заглавие Ñамо в XMP), blocked (блокиÑан â?Ð½ÐµÐ¾Ð±Ñ Ð¾Ð´Ð¸Ð¼Ð° е поÑÑебиÑелÑка паÑола) и damaged (повÑеден â?оÑваÑÑнеÑо е неÑÑпеÑно). ÐапиÑвайÑе доказаÑелÑÑваÑа заедно ÑÑÑ ÑÑÑÑоÑниеÑо. ХеÑÑÑ Ð½Ð° Ñайла, бÑоÑÑ Ð½Ð° ÑÑÑаниÑиÑе, ÑоÑниÑе Ñлагове и ÑÑобÑениеÑо за гÑеÑка Ð¾Ñ ÐµÐ½Ð´Ð¶Ð¸Ð½Ð° за повÑедени Ñайлове â?вÑиÑко Ñова е Ð¾Ñ Ð·Ð½Ð°Ñение, ÑÑй каÑо ÑовекÑÑ, койÑо оÑпоÑва ÑеÑениеÑо за наÑоÑване, Ñе го напÑави ÑедмиÑи по-кÑÑно, ÑÑеÑÑ Ñайл, койÑо междÑвÑеменно може да е бил заменен или пÑоменен.
ÐогаÑо Ñе налага опеÑаÑÐ¾Ñ Ð´Ð° Ñазгледа каÑанÑиниÑан Ñайл, не го пÑедавайÑе на ÑÑандаÑÑÐ½Ð¸Ñ Ð²Ð¸Ð·ÑализаÑÐ¾Ñ Ð½Ð° ÑиÑÑемаÑа. РендиÑайÑе го в заÑиÑен панел Ñ Ð¸Ð·ÐºÐ»ÑÑени ÑкÑипÑове и ÑпÑавление на вÑÑзкиÑе â?Ð¿Ð¾Ð´Ñ Ð¾Ð´, опиÑан в ÑÑаÑиÑÑа за изгÑаждане на заÑиÑена повÑÑÑ Ð½Ð¾ÑÑ Ð·Ð° пÑедваÑиÑелен пÑеглед на PDF в Delphi. Рако ваÑиÑÑ Ð¿ÑоÑÐµÑ Ð·Ð°Ñ Ñанва аÑÑ Ð¸Ð² Ñ Ð¸Ð·Ð¸ÑÐºÐ²Ð°Ð½Ð¸Ñ Ð·Ð° ÑÑоÑвеÑÑÑвие, пÑовеÑкаÑа пÑи пÑиемане е еÑÑеÑÑвеноÑо мÑÑÑо за наÑÑоÑване на по-подÑобен анализ; ÑÑаÑиÑÑа за пакеÑна пÑеÑÐ»Ð°Ð¹Ñ (preflight) валидаÑÐ¸Ñ ÑпÑÑмо PDF/A и PDF/UA пÑоÑили пÑодÑлжава ÑоÑно оÑÑам, кÑдеÑо Ñази инÑпекÑÐ¸Ñ ÑпиÑа.
ÐÑодÑкÑоваÑа ÑÑÑаниÑа на компоненÑа Ð¾Ð±Ñ Ð²Ð°Ñа лиÑензиÑанеÑо, пÑÐ»Ð½Ð¸Ñ Ð¿Ñиложен пÑогÑамен инÑеÑÑÐµÐ¹Ñ (API) за инÑпекÑÐ¸Ñ Ð¸ вклÑÑениÑе демонÑÑÑаÑионни пÑоекÑи, вклÑÑиÑелно инÑпекÑÐ¾Ñ Ð½Ð° докÑменÑи за пÑиемане: PDFium Component.