THotPDF Preflight Report Methods

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 čita ulazni PDF i vraća tekstualni izvještaj s laganim strukturnim provjerama. Preopterećenja s lozinkom koriste postojeći password-aware load put za podržane šifrirane PDF-ove. SavePreflightReport zapisuje isti izvještaj u ciljnu tekstualnu datoteku

ValidatePDFVT pokreće fokusirani PDF/VT validation pass i vraća True samo kada su prisutni potrebni markeri i strukture. Vraćeni tekstualni izvještaj provjerava pdfvtid:GTS_PDFVTVersion XMP tvrdnju, PDF/VT metadata namespace, podudaranje PDF/VT datuma izmjene i xmp:ModifyDate, PDF/X osnovni marker, odsutnost šifriranja, PDF/X output intent, catalog DPartRoot, DPartRootNode, NodeNameList, prisutnost dijela dokumenta, broj stranica koje se mogu učitati i page-level DPart pokrivenost. PDF/VT i XMP datumska svojstva mogu se zapisati kao element tekst ili kao RDF atributi na rdf:Description elementu

Izvještaj obuhvaća PDF zaglavlje, EOF oznaku, završnu %%EOF oznaku, posljednji pomak startxref, odnosi li se pomak na xref tablicu ili xref tok, broj oznaka %%EOF i startxref, ravnotežu revizijskih oznaka i završni redoslijed oznaka, oznaku trailera ili xref toka

deklariranih stranica u stablu stranica, usklađenost broja stranica u stablu i broja stranica koje se mogu učitati, usklađenost objekata stranica i stranica koje se mogu učitati, ravnotežu streamova i oznaka endstream, pokrivenost unosa /Length za stream, broj xref tablica, broj podsekcija xref tablica, broj unosa xref tablica, broj slobodnih i zauzetih xref unosa, broj neispravnih xref redaka, valjanost xref redaka, pokrivenost xref-a u odnosu na brojeve objekata, broj xref streamova, broj object streamova, broj trailerâ, /Size u traileru, pokriva li trailer /Size najveći broj objekta, indirektne reference /Root i /Info u traileru, jesu li ti referencirani objekti definirani, cilja li trailer /Root catalog objekt, broj unosa i strukturu parova u nizu /ID trailera, prisutnost /Root, /Info, /ID i /Encrypt u traileru, procijenjeni broj inkrementalnih ažuriranja, stanje linearizacije, učitane okvire stranica, broj polja obrasca, broj rječnika resursa, broj font resursa, broj ugrađenih font programa (/FontFile, /FontFile2, /FontFile3), broj image XObjecta, broj form XObjecta, broj ColorSpace resursa, broj anotacija i podbroj widget/link anotacija, brojeve uporabe filternog lanca za FlateDecode, DCTDecode, CCITTFaxDecode, JBIG2Decode, LZWDecode, ASCIIHexDecode, ASCII85Decode, RunLengthDecode i JPXDecode, pokrivenost ugrađivanja fontova, usklađenost broja anotacija, savjete o usklađenosti s PDF/A / PDF/X / PDF/UA / Tagged PDF / transparentnošću, odabrane zastavice značajki, upozorenja za JavaScript ili radnje (pokrivajući cijeli skup radnji PDF 1.7 sec 12.6.4: GoTo*, Thread, URI, Sound, Movie, Hide, Named, SubmitForm, ResetForm, ImportData, SetOCGState, Rendition, Trans i GoTo3DView, uz naslijeđene provjere JavaScript / Launch / OpenAction / AdditionalActions / EmbeddedFile / RichMedia i upozorenja o međusobnoj isključivosti za PDF/A), zbrojeve upozorenja i ukupni sažetak prolaz/neprolaz Ove pomoćne funkcije namijenjene su brzim in-process provjerama prije slanja datoteka vanjskim validatorima standarda; nisu zamjena za potpunu PDF/A, PDF/X, PDF/UA ili ISO 32000 preflight validacijsku jezgru

Preopterećenje Format prihvaća pfText (zadana putanja čistog teksta, byte-stabilna kao i naslijeđena preopterećenja), pfJSON (JSON dokument prikladan za CI), pfHTML (samostalan HTML izvještaj spreman za nadzornu ploču s inline CSS-om i redovima obojenima prema ozbiljnosti) ili pfCSV (redovi prikladni za proračunske tablice za metapodatke, provjere, savjete, upozorenja i sažetke). JSON izlaz grupira zapise u vršne polja input, size, pdfVersion i xrefStyle, plus nizove checks, info, hints i warnings te objekt summary koji nosi vrijednosti failed, warnings i result. CSV izlaz koristi stabilno zaglavlje category,name,status,value,spec, uz ISO referentni tekst u spec kada dijagnostika ima mapirani standardni članak. Ugrađeni JSON enkoder escapira ", \ i kontrolne bajtove; UTF-8 sekvence bajtova prolaze nepromijenjene

Svaki unos checks, hints i warnings nosi neobavezno polje spec koje imenuje ISO članak na koji je dijagnostika usmjerena (na primjer ISO 32000-1 sec 7.5.5 za provjere povezane s trailerom, ISO 19005-1 sec 6.6.2 za upozorenje o međusobnoj isključivosti PDF/A i JavaScripta). Preslikavanje pokriva svaku provjeru, savjet i upozorenje koje izvještaj emitira do v2.122.0. Formalni JSON Schema (draft 2020-12) koji opisuje strukturu izlaza pfJSON objavljen je u Docs/preflight-schema.json kako bi downstream potrošači mogli provjeriti izlaz prije parsiranja

EmbedPreflightReportInPDF zapisuje kopiju izvornog PDF-a u TargetFile s naslijeđenim preflight izvještajem u tekstualnom formatu dodanim nakon zadnjeg %%EOF kao PDF-stil komentarskih redaka (svaki redak počinje s ) PDF čitači ignoriraju dodane bajtove jer su izvan grafa objekata, ali arhivski radni tokovi, uređivači teksta i alati tipa grep i dalje mogu prikazati ugrađeni izvještaj za kasniju provjeru Izvorni graf objekata, cross-reference tablica i trailer nisu mijenjani

LoadAndValidatePreflightReport izdvaja izvještaj koji je EmbedPreflightReportInPDF ranije dodao, ponovno pokreće trenutni preflight algoritam nad izvornim bajtovima prije ugrađenog bloka komentara i uspoređuje vrijednosti InputFingerprint Funkcija vraća True kada se oba otiska podudaraju, što znači da ugrađeni izvještaj i dalje opisuje datoteku onakvu kakva je na disku Kada provjera ne uspije, pozivatelji mogu pregledati OriginalReport i CurrentReport kako bi usporedili što se promijenilo

ComparePreflightReports ispisuje tijelo nalik unified diffu za dva izvještaja Zajednički redci pojavljuju se s prefiksom od dva razmaka, redci jedinstveni za ReportA imaju prefiks , a redci jedinstveni za ReportB imaju prefiks Algoritam je podešen za dobro oblikovan izlaz ključ/vrijednost koji proizvodi CreatePreflightReport gdje je redoslijed redaka deterministički; nije opća LCS implementacija, ali proizvodi sažete i čitljive diffove za tipičan slučaj uglavnom nepromijenjenih izvještaja

RepairPDFFromPreflightReport applies a conservative subset of byte-level repairs to a damaged PDF: it drops trailing bytes that follow the final %%EOF marker, and appends a missing %%EOF when one is not present anywhere. The function returns True when at least one repair was applied; RepairsApplied lists the repairs as one line per change. Object-graph repairs (rebuilding xref tables, patching stream lengths, fixing trailer dictionaries) are intentionally out of scope because such fixes can make a partially-recoverable file less recoverable; use a dedicated PDF recovery tool for deeper damage.

AggregatePreflightReports uzima polje izvještaja po datoteci i proizvodi jedan skupni sažetak. Svaki unos u polju parsira se po Input, Size i Summary poljima; agregat ispisuje jedan red po datoteci plus ukupne brojeve prošlih, neuspjelih i warning izvještaja, ukupno skeniranih bajtova i ukupne brojke rezultata. Korisno za CI pipelineove i shell petlje koje obrađuju direktorij PDF-ova i žele jedan sažet sažetak na kraju

LoadPreflightProfile and ApplyPreflightProfile let callers tailor the report output without re-running the analysis. The profile file uses an INI-style format with three optional sections: [disable-checks] lists check names to suppress; [disable-warnings] lists warning names to suppress; and [options] accepts hints=false to suppress every Hint line. After filtering, the Summary line is recomputed so the suppressed entries no longer contribute to the Failed and Warnings totals; the rest of the report passes through unchanged.

ValidatePreflightProfile prolazi kroz DisableChecks i DisableWarnings liste učitanog profila i prijavljuje svako ime koje trenutna preflight implementacija ne prepoznaje. Korisno za otkrivanje profilnih datoteka izrađenih za noviju ili stariju HotPDF verziju koje bi inače tiho onemogućile ništa jer imena ne odgovaraju nijednoj ispisanoj provjeri ili upozorenju

GetBuiltInPreflightProfile returns ready-to-use profile records for common workflows. Recognized names (case-insensitive): default / '' returns an empty profile; compact disables every Hint line for shorter reports; silent-actions disables every PDF 1.7 sec 12.6.4 action warning plus EmbeddedFile and RichMedia, intended for workflows that intentionally embed multimedia or interactive actions and do not want the preflight report to flag them. Unknown names also return an empty profile.

SavePreflightProfile writes a THPDFPreflightProfile record back to an INI file in the same format that LoadPreflightProfile consumes The two functions are exact inverses for well-formed profiles, so callers can build a 'load preset, tweak, save' workflow: P := GetBuiltInPreflightProfile('compact'), edit P.DisableChecks, then SavePreflightProfile(P, 'tuned.ini') for later reuse.

CreatePreflightReportWithProfile je praktičan jedan-call omotač koji sastavlja postojeće CreatePreflightReport, LoadPreflightProfile, ApplyPreflightProfile i format konvertere tako da pozivatelj koji već ima izvorni PDF, opcionalnu lozinku, profile file i ciljni format može izdati jedan poziv umjesto lančanih četiri. Predavanje praznog ProfileFile preskače korak profila

MergePreflightProfiles vraća dedupliciranu uniju dvaju profila: DisableChecks i DisableWarnings skupljaju imena iz oba ulaza, a DisableHints je logički OR. Korisno za slojevitost predefiniranih postavki preko projektno specifičnih prilagodbi

DiffPreflightProfiles reports the structural difference between two profiles. Returns True when they are equivalent; otherwise False with OnlyInA and OnlyInB filled with newline-separated lines of the form check:<name>, warn:<name>, or option:hints=false describing which entries are exclusive to each side.

EmbedPreflightReportAsXMP is an archival-friendly variant of EmbedPreflightReportInPDF: it writes a copy of the source PDF with the preflight report appended as a PDF-style comment block whose payload is XMP / RDF (xmlns:hotpdf="http://www.loslab.com/hotpdf/preflight/") Each report line becomes a hotpdf:<name> element with severity carried as an attribute on check rows XMP-aware tools that scan a file for xpacket markers can surface the embedded report; PDF readers continue to ignore the appended bytes because they fall outside the object graph. This is intentionally not a spec-compliant XMP integration: the XMP payload is not referenced from the catalog /Metadata entry, so XMP readers that only follow the catalog reference will not see it.

ConvertPreflightReportToVeraPDFStyle oblikuje HotPDF preflight izvještaj u JSON dokument koji slijedi opći obris veraPDF validation izlaza, s profile poljem na vrhu, jobs poljem koje sadrži itemDetails / taskResult / validationResult i ruleViolations poljem pod validationResult.details. HotPDF-styled, a ne wire-kompatibilan s veraPDF-om; cilj je omogućiti downstream alatima koji već čitaju veraPDF JSON da se prilagode HotPDF izlazu uz minimalno preslikavanje naziva polja umjesto učenja potpuno drukčijeg rasporeda podataka

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