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