ÐакеÑниÑÑ Ð¸Ð½ÑÑÑÑÐ¼ÐµÐ½Ñ Ð·Ð° пÑовеÑка (preflight) е конзолна пÑогÑама без пÑозоÑеÑ, наÑоÑена кÑм папка Ñ PDF Ñайлове, коÑÑо пÑовеÑÑва вÑеки Ð¾Ñ ÑÑÑ ÑпÑÑмо поÑоÑениÑе Ð¾Ñ Ð²Ð°Ñ ÑÑандаÑÑи за ÑÑоÑвеÑÑÑвие и оÑÑÐ°Ð²Ñ Ð¼Ð°ÑинноÑеÑими доказаÑелÑÑва за Ñова, коеÑо е оÑкÑила. Ðикой не ÑÑои да Ñ Ð½Ð°Ð±Ð»Ñдава. Ð¢Ñ Ñе изпÑлнÑва в два ÑаÑа ÑÑÑÑинÑа под cron или планиÑовÑика на задаÑи на Windows (Task Scheduler), или каÑо еÑап в CI ÑÑÑбопÑовод (CI pipeline), а ÑледваÑиÑÑ Ñовек, койÑо Ñе Ñе инÑеÑеÑÑва Ð¾Ñ Ð½ÐµÐ¹Ð½Ð¸Ñ Ð¸Ð·Ñ Ð¾Ð´, е или планиÑовÑик, ÑеÑÑÑ ÐºÐ¾Ð´ за Ð¸Ð·Ñ Ð¾Ð´, или одиÑоÑ, оÑваÑÑÑ Ð¾ÑÑÐµÑ ÑедмиÑи по-кÑÑно. Това пÑÐ¾Ð¼ÐµÐ½Ñ Ð·Ð½Ð°ÑениеÑо на понÑÑиеÑо âпÑавилноâ? ÐвигаÑелÑÑ Ð·Ð° пÑовеÑка на PDFium Component, PDF библиоÑека Ñ Ð¸Ð·Ñ Ð¾Ð´ÐµÐ½ код за Delphi, C++Builder и Lazarus, пÑави ÑамиÑе Ð¿Ð¾Ð²Ð¸ÐºÐ²Ð°Ð½Ð¸Ñ Ð·Ð° валидиÑане поÑÑи ÑÑивиални. РабоÑаÑа, коÑÑо ÑеÑава дали инÑÑÑÑменÑÑÑ Ñи заÑлÑжава ÑÑилиÑÑа, Ñе намиÑа около Ñези повикваниÑ: кой пÑоÑил ÑÑе пÑовеÑили, какво е казал кодÑÑ Ð·Ð° Ð¸Ð·Ñ Ð¾Ð´ на планиÑовÑика и дали оÑÑеÑÑÑ, койÑо би Ñловил гÑеÑка, вÑе оÑе ÑÑÑеÑÑвÑва, когаÑо нÑкой запоÑне да го ÑÑÑÑи.
ÐоговоÑÑÑ: какво вÑÑÑноÑÑ Ð¼Ð¾Ð¶Ðµ да види планиÑовÑикÑÑ
Ðдин CI Ð±ÐµÐ³Ð°Ñ (runner) или планиÑовÑикÑÑ Ð½Ð° задаÑи на Windows вижда ÑоÑно две неÑа Ð¾Ñ Ð²Ð°ÑÐ¸Ñ Ð¸Ð½ÑÑÑÑменÑ: кода за Ð¸Ð·Ñ Ð¾Ð´ и вÑиÑки Ñайлове, коиÑо е оÑÑавил Ñлед Ñебе Ñи. Ðогове, конзолни ÑвеÑове, извеждане на напÑедÑка: вÑиÑко Ñова е за Ñовек, койÑо гледа на живо, а в два ÑаÑа ÑÑÑÑинÑа нÑма никой. Така Ñе коÑигиÑайÑе ÑеÑника на кодовеÑе за Ð¸Ð·Ñ Ð¾Ð´, пÑеди да докоÑнеÑе API, и го напÑавеÑе леÑен и пÑедвидим:
0: вÑеки Ñайл ÑÑоÑвеÑÑÑва на вÑеки заÑвен пÑоÑил1: поне един Ñайл е генеÑиÑал конÑÑаÑаÑии Ð¾Ñ Ð¿ÑовеÑкаÑа2: ÑамиÑÑ Ð¸Ð½ÑÑÑÑÐ¼ÐµÐ½Ñ Ðµ аваÑиÑал пÑи поне един Ñайл (повÑеден Ð²Ñ Ð¾Ð´ÐµÐ½ Ñайл, заклÑÑване, ÑÑив)
РазликаÑа Ð¼ÐµÐ¶Ð´Ñ ÐºÐ¾Ð´Ð¾Ð²Ðµ 1 и 2 е Ñази, коÑÑо екипиÑе пÑопÑÑÐºÐ°Ñ Ð¸ по-кÑÑно ÑÑжалÑваÑ. ÐовÑеден PDF Ñайл, койÑо не Ñе оÑваÑÑ, не е гÑеÑка пÑи валидиÑанеÑо. Ðко го пÑиÑиÑлиÑе кÑм код 1, кÑпÑина повÑедени ÑканиÑÐ°Ð½Ð¸Ñ Ñе Ñе поÑвÑÑ Ð½Ð° ваÑиÑе Ñабла за ÑпÑавление каÑо внезапен ÑÑив на ÑÑоÑвеÑÑÑвиеÑо, изпÑаÑайки нÑкой да пÑеÑледва ÑегÑеÑÐ¸Ñ Ð½Ð° ÑÑандаÑÑиÑе, коÑÑо никога не Ñе е ÑлÑÑвала, докаÑо иÑÑинÑкаÑа иÑÑоÑÐ¸Ñ Ðµ повÑеден ÑÐºÐµÐ½ÐµÑ Ð¿Ð¾ веÑигаÑа.
ÐÑе два елеменÑа пÑÐ¸Ð½Ð°Ð´Ð»ÐµÐ¶Ð°Ñ ÐºÑм договоÑа. ÐÑÑвиÑÑ Ðµ вÑеме на изÑакване (timeout) за вÑеки Ñайл. ÐеобиÑаен PDF Ñайл Ñ Ñ Ð¸Ð»Ñди ÑÑÑаниÑи и дÑлбоко вложени ÑÑÑÑкÑÑÑи Ð¾Ñ Ð¾Ð±ÐµÐºÑи може да задÑÑжи един единÑÑвен пÑоÑÐµÑ Ð½Ð° валидиÑане Ñ Ð¼Ð¸Ð½ÑÑи, а ноÑниÑÑ Ð¿ÑозоÑÐµÑ Ð·Ð° изпÑлнение нÑма ÑÑÑпение за Ñова. ÐÑекÑаÑеÑе задаÑаÑа за Ñози Ñайл пÑи кÑÐ°Ð¹Ð½Ð¸Ñ ÑÑок, оÑÑеÑеÑе го каÑо повÑеда на инÑÑÑÑменÑа и пÑодÑлжеÑе Ñ Ð¿Ð°ÐºÐµÑа. ÐÑоÑиÑÑ Ðµ каÑанÑинна диÑекÑоÑиÑ: пÑемеÑÑеÑе вÑеки изÑекÑл по вÑеме или неоÑваÑÑем Ð²Ñ Ð¾Ð´ÐµÐ½ Ñайл наÑÑÑани, вмеÑÑо да го оÑÑавÑÑе на мÑÑÑо. Ð ÑамкиÑе на нÑколко меÑеÑа Ñази диÑекÑоÑÐ¸Ñ ÑÐ¸Ñ Ð¾ Ñе наÑÑÑпа най-лоÑиÑе докÑменÑи, коиÑо ваÑиÑе Ñеални клиенÑи изпÑаÑаÑ, и Ñози коÑпÑÑ Ð¾Ñ Ñайлове ÑÑÑÑва повеÑе за ÑеÑÑовеÑе пÑеди пÑÑкане в екÑплоаÑаÑÐ¸Ñ Ð¾Ñ Ð²Ñеки ÑинÑеÑиÑен пÑимеÑ, койÑо Ð±Ð¸Ñ Ñе могли да напиÑеÑе на ÑÑка.
ÐÐ·Ð±Ð¾Ñ Ð½Ð° ÑÑандаÑÑи и заÑо нивоÑо на ÑÑоÑвеÑÑÑвие е важно
ÐзбÑоÑванеÑо TPdfPreflightStandard обÑ
ваÑа ÑамилииÑе, коиÑо Ñе ÑÑеÑÐ°Ñ Ð² пÑакÑикаÑа: ppsPdfA за аÑÑ
ивно ÑÑоÑвеÑÑÑвие по ISO 19005, ppsPdfUa за доÑÑÑпноÑÑ Ð¿Ð¾ ISO 14289, ppsPdfX за пÑедпеÑаÑна подгоÑовка, плÑÑ ppsPdfE, ppsPdfR и ppsPdfVT за инженеÑна дейноÑÑ, ÑаÑÑеÑни изобÑÐ°Ð¶ÐµÐ½Ð¸Ñ Ð¸ пÑоменливи данни. Ð ÑамкиÑе на дадена ÑÐ°Ð¼Ð¸Ð»Ð¸Ñ ÑдÑоÑо ÑазÑиÑа нивоÑо на ÑÑоÑвеÑÑÑвие, коеÑо докÑменÑÑÑ Ð´ÐµÐºÐ»Ð°ÑиÑа, и го докладва за вÑеки ÑÑандаÑÑ Ð² ConformanceName на ÑезÑлÑаÑа. ÐменÑванеÑо на ÑамилиÑÑа ÑÑдко е доÑÑаÑÑÑно, ÑÑй каÑо нивоÑо е мÑÑÑоÑо, кÑдеÑо е ÑеалнаÑа Ñазлика. PDF/A-2b обеÑава Ñамо визÑално вÑзпÑоизвеждане и ниÑо повеÑе. PDF/A-3a Ð´Ð¾Ð±Ð°Ð²Ñ Ð¸Ð·Ð¸Ñкване за логиÑеÑко маÑкиÑане на ÑÑÑÑкÑÑÑаÑа (tagging) и позволÑва вгÑадени изÑ
одни Ñайлове, коеÑо е много по-виÑока леÑва за ÑканиÑани маÑеÑиали, коиÑо изобÑо нÑÐ¼Ð°Ñ Ð´ÑÑво на ÑаговеÑе. СгÑеÑеÑе Ñова в коÑÑо и да е поÑока и пакеÑниÑÑ Ð¿ÑоÑÐµÑ Ñе ви излÑже. Ðко ваÑаÑа полиÑика за ÑÑÑ
Ñанение вÑÑÑноÑÑ Ð¸Ð·Ð¸Ñква PDF/A-2b, но оÑÑ
вÑÑлÑÑе Ñайлове поÑади липÑваÑи Ñагове на ÑÑÑÑкÑÑÑаÑа, оÑÑеÑÑÑ Ñе Ñе напÑлни Ñ ÐºÐ¾Ð½ÑÑаÑаÑии, коиÑо никой никога нÑма да коÑигиÑа. ÐÑиемеÑе вÑеки еÑÐ¸ÐºÐµÑ PDF/A, без да пÑовеÑÑваÑе нивоÑо, и Ñе одобÑиÑе докÑменÑи, коиÑо оÑговаÑÑÑ Ð½Ð° по-ниÑки ÑÑандаÑÑи Ð¾Ñ Ð¾Ð±ÐµÑаниÑе. ÐзиÑкваниÑÑа за доÑÑÑпноÑÑ Ð¾Ñ Ð´ÑÑжавни кÑпÑваÑи вÑе по-ÑеÑÑо добавÑÑ PDF/UA кÑм вÑиÑко Ñова, коеÑо не Ð´Ð¾Ð±Ð°Ð²Ñ Ð´Ð¾Ð¿ÑлниÑелни ÑазÑ
оди кÑм изпÑлнениеÑо, ÑÑй каÑо BuildPdfPreflightReport (Ð¾Ñ Ð¼Ð¾Ð´Ñла FPdfPreflightReport) пÑиема Ð½Ð°Ð±Ð¾Ñ Ð¾Ñ ÑÑандаÑÑи:
Report := BuildPdfPreflightReport(Pdf, [ppsPdfA, ppsPdfUa]);
Ðдно извикване оÑенÑва и дваÑа ÑÑандаÑÑа и вÑÑÑа един единÑÑвен конÑолидиÑан Ð·Ð°Ð¿Ð¸Ñ Ñ Ð¾ÑÑеÑ.
ÐаÑо пÑазниÑÑ ÑпиÑÑк Ñ ÐºÐ¾Ð½ÑÑаÑаÑии не ознаÑава ÑÑпеÑна пÑовеÑка
ÐÑÑеÑÑÑ Ð¸Ð·Ð±ÑоÑва конÑÑаÑаÑииÑе за вÑеки ÑÑандаÑÑ, а пÑазниÑÑ ÑпиÑÑк Ñ Ð¿Ñоблеми ознаÑава Ñамо âнÐ?Ñа оÑкÑиÑи пÑоблеми в ÑÑандаÑÑиÑе, коиÑо дейÑÑвиÑелно Ñа били изпÑлнениâ? Това е много по-ÑÑÑно ÑвÑÑдение Ð¾Ñ âÑайлÑÑ?ÑÑоÑвеÑÑÑва на ÑÑандаÑÑа, койÑо ви инÑеÑеÑÑваâ? и ÑазликаÑа Ð¼ÐµÐ¶Ð´Ñ Ð´Ð²ÐµÑе е мÑÑÑоÑо, кÑдеÑо пакеÑнаÑа пÑовеÑка ÑиÑ
омÑлком Ñе компÑомеÑиÑа. ÐÑеÑка в конÑигÑÑаÑиÑÑа, коÑÑо изклÑÑва ppsPdfA Ð¾Ñ Ð½Ð°Ð±Ð¾Ñа, генеÑиÑа ÑоÑно ÑÑÑÐ¸Ñ Ð¿Ñазен ÑпиÑÑк Ñ Ð¿Ñоблеми, какÑо и наиÑÑина изÑÑден Ñайл. ÐаÑова Ñе оÑнаÑÑйÑе кÑм мÑлÑаниеÑо Ñ Ð¿Ð¾Ð´Ð¾Ð·Ñение. ÐбÑ
одеÑе Report.Results и пÑовеÑеÑе две неÑа за вÑеки ÑÑандаÑÑ, койÑо ÑÑе иÑкали да ÑеÑÑваÑе: Ñе Ð·Ð°Ð¿Ð¸Ñ Ð·Ð° ÑезÑлÑÐ°Ñ Ð·Ð° него изобÑо ÑÑÑеÑÑвÑва и Ñе неговиÑÑ Ñлаг IsCompliant, подкÑепен Ð¾Ñ Status = pfsPass, е иÑÑина (true). ÐоÑна задаÑа, коÑÑо пÑиÑавнÑва âбеÐ?намеÑени пÑоблемиâ?Ñ âгоÑоÐ?за аÑÑ
ивиÑанеâ? без никога да поÑвÑÑди кои ÑÑандаÑÑи Ñа били оÑенени, е клаÑиÑеÑкиÑÑ Ð½Ð°Ñин папка Ñ Ð½ÐµÑÑоÑвеÑÑÑваÑи Ñайлове да пÑеминава ÑÑпеÑно Ñ Ð¼ÐµÑеÑи, докаÑо вÑнÑен одиÑÐ¾Ñ Ð½Ðµ оÑвоÑи нÑкой Ð¾Ñ ÑÑÑ
Ñ veraPDF и ÑелиÑÑ Ð°ÑÑ
ив не бÑде поÑÑавен под вÑпÑоÑ.
ÐÑоÑи капан Ñе кÑие в Ñова какво вÑÑÑноÑÑ Ð¿ÑедÑÑавлÑва конÑÑаÑаÑиÑÑа. ÐÑÑко TPdfPreflightIssue ÑÑдÑÑжа Code, Category, Description и Recommendation, и поÑоÑва наÑÑÑеноÑо пÑавило, а не ÑÑÑаниÑа или обекÑ. Това е пÑоекÑно ÑеÑение Ñ Ð¿Ð¾ÑледÑÑÐ²Ð¸Ñ Ð·Ð° ÑикÑла на обÑаÑна вÑÑзка. ÐÑÑеÑÑÑ ÐºÐ°Ð·Ð²Ð° на екипа, ÑÑÐ·Ð´Ð°Ð²Ð°Ñ ÑайловеÑе, какÑв ÐºÐ»Ð°Ñ Ð´ÐµÑÐµÐºÑ ÑÑÑеÑÑвÑва (напÑÐ¸Ð¼ÐµÑ Ð½ÐµÐ²Ð³Ñаден ÑÑиÑÑ Ð¸Ð»Ð¸ липÑÐ²Ð°Ñ XMP иденÑиÑикаÑоÑ), а намиÑанеÑо на конкÑеÑÐ½Ð¸Ñ Ð½Ð°ÑÑÑÐ°Ð²Ð°Ñ Ð¾Ð±ÐµÐºÑ Ðµ ÑабоÑа на ÑледваÑÐ¸Ñ Ð¸Ð½ÑÑÑÑÐ¼ÐµÐ½Ñ Ð·Ð° оÑÑÑÑанÑване, а не на валидаÑоÑа. ÐзгÑаждайÑе ваÑиÑе поÑÑебиÑели на оÑÑеÑи ÑпÑÑмо ÑÑабилниÑе ÑÑойноÑÑи на Code, а не ÑпÑÑмо ÑеÑÐ¸Ð¼Ð¸Ñ Ð·Ð° Ñ
оÑа ÑекÑÑ Ð½Ð° опиÑаниеÑо, койÑо може да бÑде пÑенапиÑан пÑи ÑледваÑи веÑÑии без пÑедÑпÑеждение.
ÐÑÑеÑни Ñайлове за маÑини и за дежÑÑÐ½Ð¸Ñ ÑпеÑиалиÑÑ
ÐапиÑÑÑ Ñ Ð¾ÑÑеÑа запиÑва ÑÑÑиÑе конÑÑаÑаÑии в Ð¿ÐµÑ ÑоÑмаÑа: SaveJsonToFile, SaveCsvToFile, SaveHtmlToFile, SaveTextToFile и SaveMarkdownToFile, вÑеки ÑÑÑ ÑÑоÑвеÑна ÑÑнкÑÐ¸Ñ Ð¾Ñ Ñип ToJson, когаÑо иÑкаÑе низа в памеÑÑа, а не на диÑка. УÑÑоÑвайÑе на изкÑÑениеÑо да избеÑеÑе Ñамо един. ÐиÑеÑе JSON за конвейеÑа (pipeline), Ñака Ñе CI да може да го пÑикаÑи кÑм запиÑа на задаÑаÑа и да анализиÑа кодовеÑе за пÑоблеми и ÑÑаÑÑÑиÑе на оÑделниÑе ÑÑандаÑÑи, без да ÑеÑе неÑÑÑÑкÑÑÑиÑан ÑекÑÑ. ÐиÑеÑе HTML за Ñовека, койÑо полÑÑава извеÑÑие пÑи аваÑиÑ, заÑоÑо Ñой Ñе оÑваÑÑ Ð²Ñв вÑеки бÑаÑзÑÑ Ð±ÐµÐ· никакви допÑлниÑелни инÑÑÑÑменÑи. ÐваÑа ÑоÑмаÑа заедно ÑÑÑÑÐ²Ð°Ñ Ñамо един допÑлниÑелен Ñед код на Ñайл и ÑпеÑÑÑÐ²Ð°Ñ Ð½Ð° дежÑÑÐ½Ð¸Ñ Ð²Ð¸ Ð¸Ð½Ð¶ÐµÐ½ÐµÑ Ð½Ð°Ð¹-непÑиÑÑнаÑа задаÑа пÑи пакеÑна обÑабоÑка, а именно декомпилиÑане на необÑабоÑен JSON блок в два ÑаÑа ÑÑÑÑинÑа, за да ÑазбеÑе кой Ñайл Ñе е повÑедил. Ðдна диÑÑиплина е по-важна Ð¾Ñ Ð¸Ð·Ð±Ð¾Ñа на ÑоÑмаÑ: извеждайÑе имеÑо на вÑеки оÑÑÐµÑ Ð¾Ñ Ð¸Ð¼ÐµÑо на вÑ
Ð¾Ð´Ð½Ð¸Ñ Ñайл, а не Ð¾Ñ Ð²Ñемеви пеÑаÑ, в пÑоÑивен ÑлÑÑай две ÑÑпоÑедни изпÑÐ»Ð½ÐµÐ½Ð¸Ñ Ñе пÑеплеÑÐ°Ñ Ð¾ÑÑеÑи, коиÑо веÑе не можеÑе да ÑвÑÑжеÑе Ñ ÑеÑ
ниÑе вÑ
одÑÑи Ñайлове.
ÐÑаговеÑе на ÑеÑиозноÑÑ Ð¿ÑÐ¸Ð½Ð°Ð´Ð»ÐµÐ¶Ð°Ñ Ð½Ð° конÑигÑÑаÑиÑÑа, а не на кода. ÐноÑаÑÐ¸Ñ Ð±ÐµÐ· алÑеÑнаÑивно опиÑание е кÑиÑиÑна гÑеÑка за поÑÑал за подаване на PDF/UA и пÑенебÑежима бележка за вÑÑÑеÑен аÑÑ Ð¸Ð², вÑпÑеки Ñе Ñова е иденÑиÑна конÑÑаÑаÑÐ¸Ñ Ð¸ в дваÑа ÑлÑÑаÑ. ÐÑигÑÑеÑе ниво за оÑÑ Ð²ÑÑлÑне за вÑеки пÑоÑил, Ñака Ñе полиÑикаÑа да може да Ñе пÑÐ¾Ð¼ÐµÐ½Ñ Ð±ÐµÐ· повÑоÑно компилиÑане, и оÑбележеÑе дейÑÑваÑоÑо ниво в ÑамоÑо ÑезÑме на задаÑаÑа. ÐÑез ÑледваÑоÑо ÑÑимеÑеÑие никой нÑма да помни под какÑв пÑаг е ÑабоÑил пакеÑÑÑ Ð¿Ñез Ð¼Ð¸Ð½Ð°Ð»Ð¸Ñ Ð¾ÐºÑомвÑи, а ÑезÑмеÑо е единÑÑвеноÑо мÑÑÑо, кÑдеÑо Ñази инÑоÑмаÑÐ¸Ñ Ñе пази.
ÐзолиÑане на Ñайлове, Ñака Ñе един Ð»Ð¾Ñ PDF да не пÑовали ÑÐµÐ»Ð¸Ñ Ð¿Ð°ÐºÐµÑ
procedure RunPreflightBatch(const InputDir, ReportDir: string;
out FilesWithFindings, ToolFailures: Integer);
var
SR: TSearchRec;
Pdf: TPdf;
Report: TPdfPreflightReport;
begin
FilesWithFindings := 0;
ToolFailures := 0;
if FindFirst(InputDir + '*.pdf', faAnyFile, SR) = 0 then
try
repeat
Pdf := TPdf.Create(nil); // fresh instance per file: no state bleed
try
try
Pdf.FileName := InputDir + SR.Name;
Pdf.Active := True;
if not Pdf.Active then // load failures are silent, not raised
raise EPdfError.Create('Cannot open ' + SR.Name);
Report := BuildPdfPreflightReport(Pdf, [ppsPdfA, ppsPdfUa]);
Report.SaveJsonToFile(ReportDir + ChangeFileExt(SR.Name, '.json'));
Report.SaveHtmlToFile(ReportDir + ChangeFileExt(SR.Name, '.html'));
if Report.TotalIssueCount > 0 then
Inc(FilesWithFindings);
except
on E: Exception do
begin
Inc(ToolFailures); // exit-code-2 territory, not a validation verdict
WriteLn(ErrOutput, SR.Name + ': ' + E.Message);
end;
end;
finally
Pdf.Free;
end;
until FindNext(SR) <> 0;
finally
FindClose(SR);
end;
end;
ТÑи ÑÑзнаÑелни ÑеÑÐµÐ½Ð¸Ñ Ñа заложени в Ñози ÑикÑл. Ðов TPdf Ð¾Ð±ÐµÐºÑ Ð·Ð° вÑеки Ñайл гаÑанÑиÑа, Ñе един докÑменÑ, койÑо повÑеди ÑÑÑÑоÑниеÑо на ÑдÑоÑо, не може да оÑÑови ÑледваÑиÑе го Ñайлове. ЯвнаÑа пÑовеÑка на Active намиÑа ÑвоеÑо мÑÑÑо, ÑÑй каÑо Active := True поÑиÑка гÑеÑкиÑе пÑи заÑеждане, вмеÑÑо да ги повдига; пÑемаÑ
неÑе Ñази заÑиÑа и непÑлен Ñайл Ñе пÑемине кÑм повикванеÑо за валидиÑане, пÑеди да Ñе ÑÑине нÑкÑде по веÑигаÑа Ñ Ð¿Ð¾Ð´Ð²ÐµÐ¶Ð´Ð°Ñо ÑÑобÑение. ÐÑÑÑеÑниÑÑ Ð±Ð»Ð¾Ðº try..except Ñе намиÑа в обÑ
ваÑа за оÑÐ´ÐµÐ»Ð½Ð¸Ñ Ñайл наÑоÑно, Ñака Ñе едно изклÑÑение да ÑвелиÑи бÑоÑÑа на гÑеÑкиÑе и ÑикÑлÑÑ Ð´Ð° пÑодÑлжи. ÐÑкаÑе ÑиÑÑи оÑÑеÑи за 4999 добÑи Ñайла, доÑи когаÑо Ñайл 5000 е повÑеден. ÐÑвен Ñова и дваÑа ÑоÑмаÑа на оÑÑеÑиÑе Ñе запиÑÐ²Ð°Ñ Ð½Ð° диÑка пÑеди оÑÑиÑанеÑо на кÑÐ°Ð¹Ð½Ð¸Ñ ÑезÑлÑаÑ, коеÑо ознаÑава, Ñе доказаÑелÑÑваÑа оÑелÑваÑ, доÑи ако по-кÑÑно Ñе поÑви гÑеÑка в логикаÑа за ÑÑмиÑане.
След Ñова ÑÑпоÑÑавÑнеÑо на кодовеÑе за Ð¸Ð·Ñ Ð¾Ð´ Ñе Ñвежда до нÑколко Ñеда в пÑоекÑÐ½Ð¸Ñ Ñайл:
begin
RunPreflightBatch(ParamStr(1), ParamStr(2), Findings, Failures);
if Failures > 0 then
Halt(2)
else if Findings > 0 then
Halt(1);
// falling through exits with 0: every file conformed
end.
Ðакво пÑовеÑкаÑа (preflight) нÑма да напÑави вмеÑÑо ваÑ
ЯдÑоÑо оÑкÑива; Ñо не попÑавÑ. ÐонÑÑаÑаÑÐ¸Ñ Ð·Ð° невгÑаден ÑÑиÑÑ Ð¸Ð»Ð¸ завиÑимо Ð¾Ñ ÑÑÑÑойÑÑвоÑо ÑвеÑово пÑоÑÑÑанÑÑво е задание за ÑабоÑа за Ñози, койÑо генеÑиÑа ÑайловеÑе, а валидаÑоÑÑÑ Ð½Ñма как да го паÑне на мÑÑÑо. Така Ñе планиÑайÑе ÑикÑла на обÑаÑна вÑÑзка ÑÑзнаÑелно. ÐÑÑеÑиÑе ÑÑÑбва да Ð¿Ð¾Ð¿Ð°Ð´Ð°Ñ Ñам, кÑдеÑо екипÑÑ Ð¿ÑоизводиÑел дейÑÑвиÑелно ги ÑеÑе, в пÑоÑивен ÑлÑÑай ени и ÑÑÑи пÑоблеми Ñе Ñе поÑвÑÐ²Ð°Ñ Ð²ÑÑка ноÑ, докаÑо нÑкой накÑÐ°Ñ Ð½Ðµ попиÑа заÑо пÑоÑенÑÑÑ Ð½Ð° ÑÑоÑвеÑÑÑвие никога не Ñе подобÑÑва. СÑÑо Ñака Ñи ÑÑÑÑва да Ñе напÑави кÑÑÑÑоÑана пÑовеÑка на извадка Ð¾Ñ ÑезÑлÑаÑи ÑпÑÑмо незавиÑим валидаÑоÑ, veraPDF за PDF/A или инÑÑÑÑменÑа за пÑовеÑка на Acrobat за PDF/X, пÑеди вÑнÑен одиÑÐ¾Ñ Ð´Ð° ги пÑовеÑи вмеÑÑо ваÑ. ÐогаÑо две ÑдÑа Ñе ÑÐ°Ð·Ð¼Ð¸Ð½Ð°Ð²Ð°Ñ Ð¿Ð¾ оÑноÑение на Ñеален клиенÑÑки Ñайл, Ñози докÑÐ¼ÐµÐ½Ñ Ð½Ðµ е доÑадна пÑеÑка; Ñой е ÑоÑно Ñози ÑлÑÑай на ÑегÑеÑиÑ, койÑо е липÑвал в ÑеÑÑовеÑе на ваÑаÑа веÑÑиÑ. ÐапазеÑе го, наименÑвайÑе го и го изпÑлнÑвайÑе пÑи вÑÑко изгÑаждане.
ÐÑе една полезна комбинаÑÐ¸Ñ ÑÑÑбва да Ñе оÑбележи. СÑÑоÑо ÑдÑо за валидиÑане ÑпÑавлÑва инÑеÑакÑивниÑе пÑовеÑки в поÑÑебиÑелÑÐºÐ¸Ñ Ð¸Ð½ÑеÑÑÐµÐ¹Ñ Ð·Ð° пÑеглед, Ñака Ñе Ñози CLI без инÑеÑÑÐµÐ¹Ñ Ð¸ оÑиенÑиÑанаÑа кÑм аналиÑиÑи ÑабоÑна ÑÑеда за пÑеглед на вÑ
одÑÑи PDF Ñайлове Ð¼Ð¾Ð³Ð°Ñ Ð´Ð° ÑподелÑÑ Ð¾Ð±Ñ ÑеÑник за валидиÑане, вмеÑÑо да Ñе ÑаздалеÑÐ°Ð²Ð°Ñ Ñ Ð²ÑемеÑо. Ð ÑÑй каÑо [ppsPdfA, ppsPdfUa] оÑенÑва доÑÑÑпноÑÑÑа в ÑÑÑÐ¸Ñ Ð¿ÑоÑ
од, ÑÑÑанаÑа на PDF/UA Ð¾Ñ Ð¿Ð°ÐºÐµÑа Ñе ÑÑглаÑÑва пеÑÑекÑно Ñ ÑазÑабоÑкаÑа Ð¾Ñ ÑÑÑана на визÑализаÑоÑа, каÑо напÑÐ¸Ð¼ÐµÑ Ð¸Ð·Ð³ÑажданеÑо на доÑÑÑпен PDF ÑеÑÐµÑ Ð² Delphi. ÐÑоÑилиÑе, ÑоÑмаÑиÑе на оÑÑеÑиÑе и пÑлниÑÑ API за пÑовеÑка Ñа докÑменÑиÑани на пÑодÑкÑоваÑа ÑÑÑаниÑа за PDFium Component.