|
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;
Description
CreatePreflightReport prebere vhodni PDF in vrne besedilno poročilo z lahkimi strukturnimi preverjanji. Preobremenitve z geslom uporabljajo obstoječo pot nalaganja z zavedanjem o geslu za podprte šifrirane PDF-je. SavePreflightReport isto poročilo zapiše v ciljno besedilno datoteko
ValidatePDFVT izvede osredotočen prehod preverjanja PDF/VT in vrne True samo, kadar so prisotni zahtevani označevalniki in strukture. Vrnjeno besedilno poročilo preveri trditev pdfvtid:GTS_PDFVTVersion v XMP, prostor imen metapodatkov PDF/VT, ujemanje datuma modifikacije PDF/VT in xmp:ModifyDate, osnovni označevalnik PDF/X, odsotnost šifriranja, izhodni namen PDF/X, Catalog DPartRoot, DPartRootNode, NodeNameList, prisotnost delov dokumenta, naložljivo število strani in pokritost DPart na ravni strani. Lastnosti PDF/VT in datuma XMP je mogoče zapisati kot besedilo elementa ali kot atribute RDF na elementu rdf:Description
Poročilo preveri glavo PDF, oznako EOF, ali je končna oznaka %%EOF blizu konca datoteke, zadnji odmik startxref, ali ta odmik cilja na tabelo xref ali na xref stream, število oznak %%EOF in startxref, ravnovesje revizijskih oznak in končno zaporedje oznak, označbo trailerja ali XRef streama, naložljivo število strani, stanje šifriranja, katalog, drevo strani, oznako predmeta strani, MediaBox, sklic na slovar informacij, sklic na koren, število neposrednih predmetov, število definicij neposrednih predmetov, najvišjo številko predmeta, število podvojenih števil predmetov, edinstvenost števil predmetov, število predmetov v katalogu, število predmetov v drevesu strani, število predmetov strani, število deklariranih strani v drevesu strani, skladnost drevesa strani in naložljivih strani, skladnost predmeta strani in naložljivih strani, ravnovesje tokov in endstream, pokritost vnosov /Length za tokove, število tabel xref, število pododsekov xref, število vnosov tabel xref, število prostih in uporabljenih vnosov xref, število napačno oblikovanih vrstic xref, veljavnost vrstic xref, pokritost xref glede na številke predmetov, število xref streamov, število tokov predmetov, število trailerjev, /Size trailerja, ali /Size trailerja pokriva najvišjo številko predmeta, posredne sklice /Root in /Info v trailerju, ali sta ta sklicana predmeta definirana, ali trailer /Root cilja na katalogni predmet, število elementov v polju trailer /ID in strukturo para, prisotnost trailer /Root, /Info, /ID in /Encrypt, ocenjeno število inkrementalnih posodobitev, stanje linearizacije, naložena polja strani, število polj obrazca, število virov slovarja, število virov pisav, število vdelanih programov pisav, število slikovnih XObjectov, število form XObjectov, število virov ColorSpace, število pripisov in podštevilke pripisov widget/link, število uporab filtrov za FlateDecode, DCTDecode, CCITTFaxDecode, JBIG2Decode, LZWDecode, ASCIIHexDecode, ASCII85Decode, RunLengthDecode in JPXDecode, pokritost vdelave pisav, skladnost števila pripisov, namige skladnosti PDF/A / PDF/X / PDF/UA / Tagged PDF / preglednosti, izbrane zastavice funkcij, opozorila za JavaScript ali dejanja (ki pokrivajo celoten nabor dejanj PDF 1.7 sec 12.6.4: GoTo*, Thread, URI, Sound, Movie, Hide, Named, SubmitForm, ResetForm, ImportData, SetOCGState, Rendition, Trans in GoTo3DView, poleg starejših preverjanj JavaScript / Launch / OpenAction / AdditionalActions / EmbeddedFile / RichMedia in opozoril PDF/A o medsebojni izključitvi), skupno število opozoril in končni povzetek uspeh/neuspeh. Ti pripomočki so namenjeni hitrim preverjanjem v procesu pred predajo datotek zunanjim preverjevalnikom skladnosti; niso zamenjava za popoln mehanizem za preflight preverjanje PDF/A, PDF/X, PDF/UA ali ISO 32000
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.
Vsak vnos checks, hints in warnings vsebuje neobvezno polje spec, ki poimenuje klavzulo ISO, na katero se diagnostični element nanaša (na primer ISO 32000-1 sec 7.5.5 za preglede, povezane s trailerjem, ISO 19005-1 sec 6.6.2 za opozorilo o medsebojni izključitvi PDF/A in JavaScript). Preslikava pokriva vsak check, hint in warning, ki ga poročilo izpiše do različice v2.122.0. Formalna JSON Schema (draft 2020-12), ki opisuje strukturo izhoda pfJSON, je objavljena na Docs/preflight-schema.json, da lahko odjemalci pred razčlenjevanjem preverijo izhod
EmbedPreflightReportInPDF zapiše kopijo izvornega PDF v TargetFile tako, da za zadnjim %%EOF doda staro besedilno poročilo preflight kot komentarje v slogu PDF (vsaka vrstica se začne z % ). Bralniki PDF priložene bajte ignorirajo, ker ležijo zunaj grafa objektov, vendar jih lahko arhivski poteki, urejevalniki besedila in orodja tipa grep še vedno pokažejo za poznejši pregled. Izvirni graf objektov, tabela navzkrižnih sklicev in trailer se ne spremenijo
LoadAndValidatePreflightReport extracts the report
that EmbedPreflightReportInPDF previously appended,
re-runs the current preflight algorithm against the source bytes
preceding the embedded comment block, and compares the
InputFingerprint values. The function returns
True when both fingerprints match, indicating the
embedded report still describes the file as it exists on disk
When validation fails, callers can inspect
OriginalReport and CurrentReport to
diff what changed.
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 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 sprejme polje poročil po datotekah in izdela enotno povzetno poročilo za paket. Vsak vnos v polju se razčleni za polja Input, Size in Summary; združeni izhod zapiše eno vrstico na datoteko ter vsote za število uspešnih, neuspešnih in opozorilnih poročil, skupno pregledane bajte in skupne rezultate. Uporabno za cevovode CI in lupinske zanke, ki obdelujejo imenik PDF-jev in želijo na koncu eno jedrnato povzetno vrstico
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 preišče seznama DisableChecks in DisableWarnings naloženega profila ter poroča o vsakem imenu, ki ga trenutna implementacija preflight ne prepozna. Uporabno je za zaznavanje datotek profila, avtoriranih za novejšo ali starejšo različico HotPDF, ki bi sicer tiho onemogočile nič, ker se imena ne ujemajo z nobenim izpisanim preverjanjem ali opozorilom
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 priročen ovoj na enem mestu, ki združi obstoječe CreatePreflightReport, LoadPreflightProfile, ApplyPreflightProfile in pretvornike formatov, tako da lahko klicatelj, ki že ima izvorni PDF, neobvezno geslo, datoteko profila in ciljni format, opravi en sam klic namesto verige štirih. Če je ProfileFile prazen, se korak profila preskoči
MergePreflightProfiles vrne deduplicirano unijo dveh profilov: DisableChecks in DisableWarnings združita imena iz obeh vhodov, DisableHints pa je logični OR. Uporabno za plastenje prednastavitve nad projektnimi prilagoditvami
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 poročilo v dokument JSON, ki sledi širšemu obrisa izhoda za validacijo veraPDF, z vrhnjim poljem profile, poljem jobs, ki vsebuje itemDetails / taskResult / validationResult, in poljem ruleViolations pod validationResult.details. Oblika je podobna HotPDF, ne pa žično združljiva z veraPDF; cilj je, da se orodja, ki že porabljajo JSON veraPDF, lahko prilagodijo izhodu HotPDF z minimalnim premapiranjem imen polj namesto učenja povsem drugačne podatkovne postavitve
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;
Glejte tudi
|