THotPDF metode za preflight izveštaj

Sintaksa

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 izveštaj sa lakim strukturnim proverama Overload-i sa lozinkom koriste postojeći put učitavanja sa podrškom za lozinku za podržane šifrovane PDF-ove SavePreflightReport upisuje isti izveštaj u ciljnu tekstualnu datoteku

ValidatePDFVT pokreće fokusirani PDF/VT validation prolaz i vraća True samo kada su prisutni potrebni markeri i strukture Vraćeni tekstualni izveštaj proverava pdfvtid:GTS_PDFVTVersion XMP tvrdnju, PDF/VT namespace metapodataka, poklapanje datuma izmene PDF/VT i xmp:ModifyDate, osnovni PDF/X marker, odsustvo enkripcije, PDF/X output intent, catalog DPartRoot, DPartRootNode, NodeNameList, prisustvo document part-a, broj stranica koje se mogu učitati i DPart pokrivenost na nivou stranice PDF/VT i XMP svojstva datuma mogu biti upisana kao tekst elementa ili kao RDF atributi na rdf:Description elementu

Izveštaj proverava PDF zaglavlje, EOF marker, da li je završni %%EOF marker blizu kraja datoteke, poslednji startxref odmak, da li taj odmak cilja xref tabelu ili xref strim, brojanje %%EOF i startxref markera, balans revizijskih markera i redosled završnih markera, trailer ili XRef strim marker, broj čitljivih stranica, stanje enkripcije, catalog, stablo stranica, marker objekta stranice, MediaBox, referencu informacionog rečnika, root referencu, broj indirektnih objekata, broj definisanih indirektnih objekata, najveći broj objekta, broj dupliranih brojeva objekata, jedinstvenost brojeva objekata, broj catalog objekata, broj elemenata stabla stranica, broj objekata stranica, usklađenost deklarisanog i čitljivog broja stranica, usklađenost stabla i objekte stranica, balans strim i endstrim sekvenci, pokrivenost stavki /Length u strimovima, broj xref tabela, broj xref pododeljaka, broj unosa xref tabela, broj slobodnih i zauzetih xref unosa, broj neispravnih xref redova, ispravnost xref redova, pokrivenost xref-a u odnosu na broj objekata, broj xref strimova, broj objektnih strimova, broj trailer-a, /Size u traileru, da li trailer /Size pokriva najveći broj objekata, trailer /Root i /Info indirektne reference, da li su referencirani objekti definisani, da li trailer /Root cilja catalog objekat, broj elemenata i raspored niza /ID u traileru, prisustvo trailer /Root, /Info, /ID i /Encrypt, procenjeni broj inkrementalnih ažuriranja, status linearizacije, učitane kutije stranica, broj form polja, broj rečnika resursa, broj font resursa, broj ugrađenih font programa (/FontFile, /FontFile2, /FontFile3), broj image XObject-a, broj form XObject-a, broj ColorSpace resursa, broj anotacija i podskupova widget/link anotacija, broj korišćenja lanaca filtera za FlateDecode, DCTDecode, CCITTFaxDecode, JBIG2Decode, LZWDecode, ASCIIHexDecode, ASCII85Decode, RunLengthDecode i JPXDecode, pokrivenost ugrađenih fontova, usklađenost broja anotacija, PDF/A / PDF/X / PDF/UA / Tagged PDF smernice za transparentnost, izabrane zastavice mogućnosti, upozorenja JavaScript-a ili akcija (pokriva ceo skup PDF 1.7 sec 12.6.4 akcija: GoTo*, Thread, URI, Sound, Movie, Hide, Named, SubmitForm, ResetForm, ImportData, SetOCGState, Rendition, Trans i GoTo3DView, kao i starije JavaScript provere / Launch / OpenAction / AdditionalActions / EmbeddedFile / RichMedia i upozorenja PDF/A međusobnog isključivanja), ukupan broj upozorenja i rezime uspešno/nespešno. Ovi pomoćnici namenjeni su za brzu in-proces proveru pre prosleđivanja datoteka spoljnim validacionim alatima i nisu zamena za puni PDF/A, PDF/X, PDF/UA ili ISO 32000 preflight motor

The Format overload accepts pfText (default plain-text path, byte-stable with the legacy overloads), pfJSON (CI-friendly JSON document), pfHTML (dashboard-ready, self-contained HTML report with inline CSS and severity-colored rows), or pfCSV (spreadsheet-friendly rows for metadata, checks, hints, warnings, and summary values). The JSON output groups entries into input, size, pdfVersion, and xrefStyle top-level fields plus checks, info, hints, and warnings arrays and a summary object carrying failed, warnings, and result values. The CSV output uses the stable header category,name,status,value,spec, with ISO reference text in spec when the diagnostic has a mapped standard clause. The built-in JSON encoder escapes ", \, and control bytes; UTF-8 byte sequences pass through unchanged.

Svaki unos checks, hints i warnings nosi opciono polje spec koje navodi ISO klauzulu koju dijagnostika cilja (na primer ISO 32000-1 sec 7.5.5 za provere vezane za trailer, ISO 19005-1 sec 6.6.2 za upozorenje o međusobnom isključivanju PDF/A i JavaScript-a) Mapiranje pokriva svaku proveru, svaki hint i svako upozorenje koje izveštaj emituje do v2.122.0 Formalna JSON Schema specifikacija (draft 2020-12) koja opisuje strukturu pfJSON izlaza objavljena je na Docs/preflight-schema.json tako da nizvodni potrošači mogu da validiraju izlaz pre parsiranja

EmbedPreflightReportInPDF upisuje kopiju izvornog PDF-a u TargetFile sa nasleđenim preflight izveštajem u tekstualnom obliku iza poslednjeg %%EOF kao PDF-style comment linije gde svaki red počinje sa % . PDF čitači ignorišu prikačene bajtove jer su izvan grafa objekata, ali arhivski tokovi rada, tekstualni editori i grep-style alati i dalje mogu da prikažu ugrađeni izveštaj radi naknadne provere. Originalni object graph, tabela unakrsnih referenci i trailer ostaju nepromenjeni

LoadAndValidatePreflightReport izdvaja izveštaj koji je EmbedPreflightReportInPDF ranije prikačio, ponovo pokreće trenutni preflight algoritam nad izvornim bajtovima koji prethode ugrađenom comment bloku i poredi InputFingerprint vrednosti Funkcija vraća True kada se oba otiska poklapaju, što znači da ugrađeni izveštaj i dalje opisuje fajl onako kako postoji na disku Kada validacija padne, pozivaoci mogu da pregledaju OriginalReport i CurrentReport da bi uporedili šta se promenilo

ComparePreflightReports emits a unified-diff-like body for two reports. Shared lines appear with a two-space prefix, lines unique to ReportA are prefixed with , and lines unique to ReportB are prefixed with . The algorithm is tuned for the well-formed key/value output produced by CreatePreflightReport where line order is deterministic; it is not a general-purpose LCS implementation but produces compact, readable diffs for the typical case of mostly-unchanged reports.

RepairPDFFromPreflightReport primenjuje konzervativni podskup bajt-nivo popravki na oštećeni PDF: odbacuje završne bajtove koji slede iza poslednjeg %%EOF markera i dodaje nedostajući %%EOF kada ga nigde nema Funkcija vraća True kada je primenjena makar jedna popravka; RepairsApplied navodi popravke kao jednu liniju po promeni Popravke grafa objekata (obnova xref tabela, krpljenje dužina tokova, popravljanje trailer rečnika) namerno su van opsega zato što takve popravke mogu da učine delimično oporavljiv fajl manje oporavljivim; za dublja oštećenja koristite namenski PDF recovery alat

AggregatePreflightReports uzima niz izveštaja po fajlu i proizvodi jedan zbirni pregled Svaki unos u nizu se parsira za polja Input, Size i Summary; agregat emituje jednu liniju po fajlu plus ukupne vrednosti za broj uspešnih, neuspešnih i upozoravajućih izveštaja, ukupan broj skeniranih bajtova i ukupne brojke rezultata Korisno za CI cevovode i shell petlje koje obrađuju direktorijum PDF-ova i žele jedan sažet rezime na kraju

LoadPreflightProfile i ApplyPreflightProfile omogućavaju pozivaocima da prilagode izlaz izveštaja bez ponovnog pokretanja analize Profil fajl koristi INI-stil format sa tri opciona odeljka: [disable-checks] navodi imena provera koje treba potisnuti; [disable-warnings] navodi imena upozorenja koje treba potisnuti; a [options] prihvata hints=false da bi se potisnula svaka Hint linija Nakon filtriranja, Summary linija se ponovo računa tako da potisnuti unosi više ne doprinose ukupnim Failed i Warnings vrednostima; ostatak izveštaja prolazi neizmenjen

ValidatePreflightProfile prolazi kroz DisableChecks i DisableWarnings liste učitanog profila i prijavljuje svako ime koje trenutna preflight implementacija ne prepoznaje Korisno za otkrivanje profil fajlova izrađenih prema novijoj ili starijoj HotPDF verziji koji bi inače tiho ne bi onemogućili ništa jer imena ne odgovaraju nijednoj emitovanoj proveri ili upozorenju

GetBuiltInPreflightProfile vraća profile spremne za upotrebu za uobičajene tokove rada Prepoznata imena (case-insensitive): default / '' vraća prazan profil; compact isključuje svaku Hint liniju radi kraćih izveštaja; silent-actions isključuje svako PDF 1.7 sec 12.6.4 action upozorenje plus EmbeddedFile i RichMedia, namenjeno tokovima rada koji namerno ugrađuju multimediju ili interaktivne akcije i ne žele da ih preflight izveštaj označi Nepoznata imena takođe vraćaju prazan profil

SavePreflightProfile upisuje THPDFPreflightProfile zapis nazad u INI fajl u istom formatu koji LoadPreflightProfile čita Ove dve funkcije su tačni inverzi za dobro oblikovane profile, tako da pozivaoci mogu da izgrade tok rada 'učitaj preset, dotegni, sačuvaj': P := GetBuiltInPreflightProfile('compact'), izmenite P.DisableChecks, zatim SavePreflightProfile(P, 'tuned.ini') za kasniju ponovnu upotrebu

CreatePreflightReportWithProfile je praktični omotač na jednom mestu koji sastavlja postojeće CreatePreflightReport, LoadPreflightProfile, ApplyPreflightProfile i format konvertere tako da pozivalac koji već ima izvorni PDF, opcionu lozinku, profil fajl i ciljni format može da pozove jednu funkciju umesto da lančano zove četiri Prosleđivanje praznog ProfileFile preskače korak profila

MergePreflightProfiles vraća deduplikovani unija dva profila: DisableChecks i DisableWarnings skupljaju imena iz oba ulaza, DisableHints je logički OR Korisno za slaganje preseta preko projektnim podešavanja

DiffPreflightProfiles prijavljuje strukturnu razliku između dva profila Vraća True kada su ekvivalentni; inače False sa OnlyInA i OnlyInB popunjenim newline-separated linijama oblika check:<name>, warn:<name> ili option:hints=false koje opisuju koji su unosi ekskluzivni za svaku stranu

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 izveštaj u JSON dokument koji prati široki okvir veraPDF validacionog izlaza, sa top-level profile poljem, jobs nizom koji sadrži itemDetails / taskResult / validationResult i ruleViolations nizom unutar validationResult.details HotPDF-styled, a ne wire-compatible sa veraPDF; cilj je da se alatima nizvodno koji već konzumiraju veraPDF JSON omogući prilagođavanje HotPDF izlazu uz minimalno preslikavanje imena polja umesto učenja potpuno drugačijeg rasporeda podataka

Primer

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;

Vidi i