Metódy preflight reportu THotPDF

Syntax

type
  THPDFPreflightFormat = (pfText, pfJSON, pfHTML, pfCSV);

function CreatePreflightReport(const SourceFile: TFileName): AnsiString;
function CreatePreflightReport(
  const SourceFile: TFileName;
  const Password  : AnsiString): AnsiString;
function CreatePreflightReport(
  const SourceFile: TFileName;
  const Password  : AnsiString;
  const Format    : THPDFPreflightFormat): AnsiString;
procedure SavePreflightReport(
  const SourceFile: TFileName;
  const ReportFile: TFileName);
procedure SavePreflightReport(
  const SourceFile: TFileName;
  const ReportFile: TFileName;
  const Password  : AnsiString);
procedure SavePreflightReport(
  const SourceFile: TFileName;
  const ReportFile: TFileName;
  const Password  : AnsiString;
  const Format    : THPDFPreflightFormat);
function ValidatePDFVT(
  const SourceFile: TFileName;
  out Report      : AnsiString): Boolean;
function ValidatePDFVT(
  const SourceFile: TFileName;
  const Password  : AnsiString;
  out Report      : AnsiString): Boolean;
procedure EmbedPreflightReportInPDF(
  const SourceFile: TFileName;
  const TargetFile: TFileName);
procedure EmbedPreflightReportInPDF(
  const SourceFile: TFileName;
  const TargetFile: TFileName;
  const Password  : AnsiString);
function LoadAndValidatePreflightReport(
  const EmbeddedFile  : TFileName;
  out OriginalReport: AnsiString;
  out CurrentReport : AnsiString): Boolean;
function LoadAndValidatePreflightReport(
  const EmbeddedFile  : TFileName;
  const Password      : AnsiString;
  out OriginalReport: AnsiString;
  out CurrentReport : AnsiString): Boolean;
function ComparePreflightReports(
  const ReportA: AnsiString;
  const ReportB: AnsiString): AnsiString;
function RepairPDFFromPreflightReport(
  const SourceFile: TFileName;
  const TargetFile: TFileName;
  out RepairsApplied: AnsiString): Boolean;
function RepairPDFFromPreflightReport(
  const SourceFile: TFileName;
  const TargetFile: TFileName;
  const Password  : AnsiString;
  out RepairsApplied: AnsiString): Boolean;
function AggregatePreflightReports(
  const Reports: array of AnsiString): AnsiString;
type
  THPDFPreflightProfile = record
    DisableChecks  : AnsiString;
    DisableWarnings: AnsiString;
    DisableHints   : Boolean;
  end;
function LoadPreflightProfile(
  const ProfileFile: TFileName): THPDFPreflightProfile;
function ApplyPreflightProfile(
  const Report : AnsiString;
  const Profile: THPDFPreflightProfile): AnsiString;
function ValidatePreflightProfile(
  const Profile: THPDFPreflightProfile;
  out UnknownNames: AnsiString): Boolean;
function GetBuiltInPreflightProfile(
  const Name: AnsiString): THPDFPreflightProfile;
procedure SavePreflightProfile(
  const Profile    : THPDFPreflightProfile;
  const ProfileFile: TFileName);
function CreatePreflightReportWithProfile(
  const SourceFile : TFileName;
  const Password   : AnsiString;
  const ProfileFile: TFileName;
  const Format     : THPDFPreflightFormat): AnsiString;
function MergePreflightProfiles(
  const A, B: THPDFPreflightProfile): THPDFPreflightProfile;
function DiffPreflightProfiles(
  const A, B  : THPDFPreflightProfile;
  out OnlyInA: AnsiString;
  out OnlyInB: AnsiString): Boolean;
procedure EmbedPreflightReportAsXMP(
  const SourceFile: TFileName;
  const TargetFile: TFileName);
procedure EmbedPreflightReportAsXMP(
  const SourceFile: TFileName;
  const TargetFile: TFileName;
  const Password  : AnsiString);
function ConvertPreflightReportToVeraPDFStyle(
  const Report: AnsiString): AnsiString;

Opis

CreatePreflightReport načíta vstupný PDF a vráti textový report s ľahkými štrukturálnymi kontrolami. Overloady s heslom používajú existujúcu cestu načítania s podporou hesla pre podporované šifrované PDF. SavePreflightReport zapíše ten istý report do cieľového textového súboru

ValidatePDFVT spúšťa zameranú validačnú kontrolu PDF/VT a vracia True iba vtedy, keď sú prítomné požadované značky a štruktúry. Vrátený textový report kontroluje XMP tvrdenie pdfvtid:GTS_PDFVTVersion, menný priestor metadát PDF/VT, zhodu dátumu úpravy PDF/VT a xmp:ModifyDate, základnú značku PDF/X, neprítomnosť šifrovania, výstupný intent PDF/X, katalog DPartRoot, DPartRootNode, NodeNameList, prítomnosť častí dokumentu, počet načítateľných strán a pokrytie DPart na úrovni strán. Vlastnosti dátumu PDF/VT a XMP sa môžu zapisovať buď ako text prvku, alebo ako RDF atribúty na prvku rdf:Description

Správa kontroluje hlavičku PDF, EOF marker, či je posledný %%EOF marker blízko konca súboru, posledný posun startxref, či tento posun ukazuje na xref tabuľku alebo xref stream, počty markerov %%EOF a startxref, rovnováhu revíznych markerov a výsledné poradie markerov, marker traileru alebo XRef streamu, počet načítateľných strán, stav šifrovania, katalóg, strom strán, marker objektu stránky, MediaBox, odkaz na informačný slovník, odkaz na root, počet nepriamych objektov, počet definícií nepriamych objektov, najvyššie číslo objektu, počet duplicitných čísel objektov, jedinečnosť čísel objektov, počet objektov katalógu, počet objektov stromu strán, počet objektov strán, deklarovaný počet strán stromu strán, zhodu počtu stromu strán a načítateľných strán, zhodu objektov strán a načítateľných strán, rovnováhu prúdov a značiek endstream, pokrytie položky /Length v prúde, počet xref tabuliek, počet xref podsekcií, počty položiek xref tabuliek, počty voľných a použitých položiek xref, počet chybných xref riadkov, platnosť xref riadkov, pokrytie xref voči číslam objektov, počet xref streamov, počet object streamov, počet trailerov, /Size traileru, či /Size v traileri pokrýva najvyššie číslo objektu, nepriamy odkaz traileru na /Root a /Info, či sú tieto referencované objekty definované, či trailerový /Root smeruje na objekt katalógu, počet položiek a párová štruktúra poľa /ID v traileri, prítomnosť /Root, /Info, /ID a /Encrypt v traileri, odhadovaný počet inkrementálnych aktualizácií, stav linearizácie, načítané page boxy, počet formulárových polí, počet zdrojových slovníkov, počet fontových zdrojov, počet vložených fontových programov (/FontFile, /FontFile2, /FontFile3), počet obrazových XObjectov, počet form XObjectov, počet zdrojov ColorSpace, počet anotácií a podpočty widget/link anotácií, počty použitia filtračného reťazca pre FlateDecode, DCTDecode, CCITTFaxDecode, JBIG2Decode, LZWDecode, ASCIIHexDecode, ASCII85Decode, RunLengthDecode a JPXDecode, pokrytie vkladania fontov, konzistenciu počtu anotácií, upozornenia na súlad PDF/A / PDF/X / PDF/UA / Tagged PDF / transparency compliance, zvolené príznaky funkcií, varovania JavaScriptu alebo akcií (pokrývajúce celú sadu akcií PDF 1.7 sec 12.6.4: GoTo*, Thread, URI, Sound, Movie, Hide, Named, SubmitForm, ResetForm, ImportData, SetOCGState, Rendition, Trans a GoTo3DView, plus legacy kontroly JavaScript / Launch / OpenAction / AdditionalActions / EmbeddedFile / RichMedia a varovania o vzájomnom vylúčení PDF/A), súčty varovaní a celkové zhrnutie úspech/neúspech. Tieto pomocníky sú určené ako rýchle in-process kontroly pred odovzdaním súborov externým validatorom noriem; nenahrádzajú plný engine pre preflight validáciu PDF/A, PDF/X, PDF/UA alebo ISO 32000-1

Preťaženosť Format prijíma pfText (predvolená cesta čistého textu, bajtovo stabilná voči legacy preťaženiam), pfJSON (JSON dokument vhodný pre CI), pfHTML (samostatný HTML report pripravený pre dashboard s inline CSS a riadkami farebne podľa závažnosti) alebo pfCSV (riadky vhodné pre tabuľky s metadátami, kontrolami, hints, varovaniami a hodnotami zhrnutia) Výstup JSON zoskupuje položky do vrcholových polí input, size, pdfVersion a xrefStyle plus polia checks, info, hints a warnings a objekt summary s hodnotami failed, warnings a result Výstup CSV používa stabilnú hlavičku category,name,status,value,spec, s textom ISO odkazu v spec, keď má diagnostika namapovanú štandardnú klauzulu Zabudovaný JSON enkóder escapuje ", \ a riadiace bajty; bajtové sekvencie UTF-8 prechádzajú nezmenené

Každá položka checks, hints a warnings nesie voliteľné pole spec, ktoré pomenúva klauzulu ISO, na ktorú sa diagnostika zameriava (napríklad ISO 32000-1 sec 7.5.5 pre kontroly súvisiace s trailerom, ISO 19005-1 sec 6.6.2 pre varovanie o vzájomnom vylúčení PDF/A s JavaScriptom) Toto mapovanie pokrýva každú kontrolu, hint aj varovanie vydané reportom až po v2.122.0 Formálny JSON Schema (draft 2020-12) popisujúci štruktúru výstupu pfJSON je publikovaný na Docs/preflight-schema.json, aby downstream spotrebitelia mohli výstup overiť pred parsovaním

EmbedPreflightReportInPDF zapisuje kópiu zdrojového PDF do TargetFile s pripojeným legacy textovým preflight reportom za posledné %%EOF ako PDF štýlové komentárové riadky (každý riadok začína ) PDF čítačky pripojené bajty ignorujú, pretože ležia mimo grafu objektov, ale archivačné workflow, textové editory a nástroje štýlu grep stále vedia vložený report zobraziť pre neskorší audit Pôvodný graf objektov, cross-reference tabuľka ani trailer sa nemenia

LoadAndValidatePreflightReport extrahuje report, ktorý EmbedPreflightReportInPDF predtým pripojil, znovu spustí aktuálny preflight algoritmus nad zdrojovými bajtmi pred vloženým blokom komentárov a porovná hodnoty InputFingerprint Funkcia vracia True, keď sa oba odtlačky zhodujú, čo znamená, že vložený report stále popisuje súbor tak, ako existuje na disku Keď validácia zlyhá, volajúci môžu skontrolovať OriginalReport a CurrentReport a zistiť rozdiely

ComparePreflightReports vytvára telo podobné unified diff pre dva reporty Zdieľané riadky sa zobrazia s dvojmedzerovým prefixom, riadky jedinečné pre ReportA majú prefix a riadky jedinečné pre ReportB majú prefix Algoritmus je ladený na dobre formátovaný výstup kľúč/hodnota vytvorený cez CreatePreflightReport, kde je poradie riadkov deterministické; nejde o všeobecnú implementáciu LCS, ale pre typický prípad takmer nezmenených reportov vytvára kompaktné a čitateľné diffy

RepairPDFFromPreflightReport aplikuje konzervatívnu podmnožinu bajtových opráv na poškodené PDF: odstráni trailing bajty za posledným markerom %%EOF a doplní chýbajúce %%EOF, keď nikde nie je prítomný Funkcia vracia True, keď sa aplikovala aspoň jedna oprava; RepairsApplied uvádza opravy po jednom riadku na zmenu Opravy grafu objektov (obnova xref tabuliek, oprava dĺžok prúdov, oprava trailer slovníkov) sú zámerne mimo rozsahu, pretože takéto zásahy môžu čiastočne obnoviteľný súbor urobiť menej obnoviteľným; pre hlbšie poškodenie použite samostatný PDF recovery nástroj

AggregatePreflightReports berie pole reportov po jednotlivých súboroch a vytvára jedno dávkové zhrnutie Každá položka v poli sa parsuje podľa polí Input, Size a Summary; agregácia vypíše jeden riadok na súbor plus súčty za počet úspešných, neúspešných a varovných reportov, celkový počet prehľadaných bajtov a celkové počty výsledkov Hodí sa pre CI pipeline a shell slučky, ktoré spracúvajú adresár PDF a chcú na konci jedno stručné zhrnutie

LoadPreflightProfile a ApplyPreflightProfile umožňujú volajúcim prispôsobiť výstup reportu bez opätovného spustenia analýzy Súbor profilu používa formát štýlu INI s tromi voliteľnými sekciami: [disable-checks] uvádza názvy kontrol, ktoré sa majú potlačiť; [disable-warnings] uvádza názvy varovaní, ktoré sa majú potlačiť; a [options] prijíma hints=false, aby sa potlačil každý riadok Hint Po filtrovaní sa riadok Summary prepočíta, takže potlačené položky sa už nezapočítavajú do súčtov Failed a Warnings; zvyšok reportu prejde nezmenený

ValidatePreflightProfile prechádza zoznamy DisableChecks a DisableWarnings načítaného profilu a nahlási každý názov, ktorý aktuálna preflight implementácia nepozná Hodí sa na detekciu súborov profilu vytvorených pre novšiu alebo staršiu verziu HotPDF, ktoré by inak potichu nevypli nič, pretože názvy sa nezhodujú so žiadnou emitovanou kontrolou alebo varovaním

GetBuiltInPreflightProfile vracia pripravené profilové záznamy pre bežné workflow Rozpoznané názvy (bez ohľadu na veľkosť písmen): default / '' vracia prázdny profil; compact vypne každý riadok Hint pre kratšie reporty; silent-actions vypne každé varovanie akcie PDF 1.7 sec 12.6.4 plus EmbeddedFile a RichMedia, čo je určené pre workflow, ktoré zámerne vkladajú multimédiá alebo interaktívne akcie a nechcú, aby ich preflight report označoval Neznáme názvy tiež vracajú prázdny profil

SavePreflightProfile zapisuje záznam THPDFPreflightProfile späť do INI súboru v tom istom formáte, ktorý číta LoadPreflightProfile Obe funkcie sú presné inverzie pre dobre vytvorené profily, takže volajúci môžu postaviť workflow 'načítaj predvoľbu, uprav, ulož': P := GetBuiltInPreflightProfile('compact'), upravte P.DisableChecks, potom SavePreflightProfile(P, 'tuned.ini') pre neskoršie znovupoužitie

CreatePreflightReportWithProfile je pohodlný obal typu one-stop, ktorý skladá existujúce CreatePreflightReport, LoadPreflightProfile, ApplyPreflightProfile a konvertory formátu tak, aby volajúci, ktorý už má zdrojové PDF, voliteľné heslo, súbor profilu a cieľový formát, mohol použiť jedno volanie namiesto reťazenia štyroch Prázdny ProfileFile preskočí krok profilu

MergePreflightProfiles vracia deduplikovanú zjednotenú množinu dvoch profilov: DisableChecks a DisableWarnings zbierajú názvy z oboch vstupov, DisableHints je logické OR Hodí sa na vrstvenie predvoľby cez úpravy špecifické pre projekt

DiffPreflightProfiles hlási štrukturálny rozdiel medzi dvoma profilmi Vráti True, keď sú ekvivalentné; inak False s OnlyInA a OnlyInB vyplnenými riadkami oddelenými novým riadkom v tvare check:<name>, warn:<name> alebo option:hints=false, ktoré opisujú, ktoré položky sú jedinečné pre každú stranu

EmbedPreflightReportAsXMP je archivačne vhodná varianta EmbedPreflightReportInPDF: zapisuje kópiu zdrojového PDF s pripojeným preflight reportom ako PDF štýlový blok komentárov, ktorého payload je XMP / RDF (xmlns:hotpdf="http://www.loslab.com/hotpdf/preflight/") Každý riadok reportu sa stáva elementom hotpdf:<name> so závažnosťou uloženou ako atribút pri riadkoch kontroly Nástroje, ktoré XMP-aware prehľadávajú súbor na značky xpacket, môžu vložený report sprístupniť; PDF čítačky pripojené bajty naďalej ignorujú, pretože ležia mimo grafu objektov Toto zámerne nie je XMP integrácia zodpovedajúca špecifikácii: XMP payload nie je referencovaný z položky katalógu /Metadata, takže ho XMP čítačky sledujúce iba referenciu v katalógu neuvidia

ConvertPreflightReportToVeraPDFStyle pretvára preflight report HotPDF na JSON dokument, ktorý sleduje hrubý obrys validačného výstupu veraPDF, s poľom profile na vrchnej úrovni, poľom jobs obsahujúcim itemDetails / taskResult / validationResult a poľom ruleViolations pod validationResult.details Je to štýl HotPDF, nie wire-compatible s veraPDF; cieľom je umožniť downstream nástrojom, ktoré už spotrebúvajú JSON veraPDF, prispôsobiť sa výstupu HotPDF s minimálnym premapovaním názvov polí namiesto učenia sa úplne iného dátového rozloženia

Example

var
  PDF: THotPDF;
begin
  PDF := THotPDF.Create(nil);
  try
    PDF.SavePreflightReport('Input.pdf', 'PreflightReport.txt');
    PDF.SavePreflightReport('Encrypted.pdf', 'EncryptedReport.txt', 'user-password');
    PDF.SavePreflightReport('Input.pdf', 'PreflightReport.json', '', pfJSON);
    PDF.SavePreflightReport('Input.pdf', 'PreflightReport.html', '', pfHTML);
    PDF.SavePreflightReport('Input.pdf', 'PreflightReport.csv', '', pfCSV);
    PDF.EmbedPreflightReportInPDF('Input.pdf', 'Input-with-report.pdf');
    if not PDF.LoadAndValidatePreflightReport(
      'Input-with-report.pdf', OriginalReport, CurrentReport)
    then
      WriteLn('Embedded preflight report no longer matches the source.');
  finally
    PDF.Free;
  end;
end;

See Also