|
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
|