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;

Kuvaus

Metodi CreatePreflightReport lukee syötteenä annetun PDF-tiedoston ja palauttaa tekstiraportin, joka sisältää kevyitä rakennetarkistuksia. Salasanaylikuormitukset käyttävät olemassa olevaa salasanatietoista latauspolkua tuetuille salatuille PDF-tiedostoille. Metodi SavePreflightReport kirjoittaa saman raportin kohdetekstitiedostoon

Metodi ValidatePDFVT suorittaa kohdistetun PDF/VT-validointiajon ja palauttaa arvon True vain silloin, kun vaaditut merkit ja rakenteet ovat läsnä. Palautettu tekstiraportti tarkistaa pdfvtid:GTS_PDFVTVersion XMP-väitteen, PDF/VT-metatietojen nimiavaruuden, PDF/VT-muokkauspäivämäärän ja xmp:ModifyDate-päivämäärän täsmäävyyden, PDF/X-perusmerkin, salauksen puuttumisen, PDF/X-ulostuloaikomuksen, catalogin DPartRoot-, DPartRootNode- ja NodeNameList-merkinnät, asiakirjaosan läsnäolon, ladattavissa olevien sivujen määrän ja sivutason DPart-kattavuuden. PDF/VT- ja XMP-päivämääräominaisuudet voidaan kirjoittaa joko elementin tekstinä tai RDF-attribuutteina rdf:Description-elementissä

Raportti tarkistaa PDF-otsikon, EOF-merkin, sen onko viimeinen %%EOF-merkki lähellä tiedoston loppua, viimeisimmän startxref-siirtymän, kohdistuuko siirtymä ristiviitetaulukkoon vai ristiviitevirtaan, %%EOF- ja startxref-merkkien määrät, korjausmerkkien tasapainon ja lopullisen merkkijärjestyksen, trailer- tai XRef-virtamerkitsimen, ladattavien sivujen määrän, salaustilan, Catalog-objektin, sivupuun, sivuobjektimerkin, MediaBox-laatikon, tietosanakirjan viitteen, juuriviitteen, epäsuorien objektien määrän, epäsuorien objektien määrittelyjen määrän, suurimman objektinumeron, monistettujen objektinumeroiden määrän, objektinumeroiden ainutkertaisuuden, Catalog-objektien määrän, sivupuun objektien määrän, sivuobjektien määrän, sivupuussa ilmoitetun sivumäärän, sivupuun määrän ja ladattavan sivun yhtenäisyyden, sivuobjektin ja ladattavan sivun yhtenäisyyden, virran ja endstream-lopetuksen tasapainon, virran /Length-merkinnän kattavuuden, ristiviitetaulukoiden määrän, ristiviitealilohkojen määrän, ristiviitetaulukon tietueiden määrät, ristiviitteen vapaiden ja käytössä olevien tietueiden määrät, virheellisten ristiviiterivien määrän, ristiviiterivien kelvollisuuden, ristiviitteen kattavuuden objektinumeroihin nähden, ristiviitevirtojen määrän, objektivirtojen määrän, trailer-lohkojen määrän, trailer-lohkon /Size-koon, kattaako trailer-lohkon /Size-koko suurimman objektinumeron, trailer-lohkon /Root- ja /Info-epäsuorat viitteet, ovatko kyseiset viitatut objektit määriteltyjä, kohdistuuko trailer-lohkon /Root Catalog-objektiin, trailer-lohkon /ID-taulukon tietueiden määrän ja parirakenteen, trailer-lohkon /Root-, /Info-, /ID- ja /Encrypt-tietojen läsnäolon, arvioidun inkrementaalisten päivitysten määrän, linearisointitilan, ladatut sivulaatikot, lomakekenttien määrän, resurssisanakirjojen määrän, fonttiresurssien määrän, upotettujen fonttiohjelmien määrän (/FontFile, /FontFile2, /FontFile3), kuva-XObject-objektien määrän, lomake-XObject-objektien määrän, ColorSpace-resurssien määrän, merkintöjen määrän ja Widget- tai linkkimerkintöjen alimäärät, suodatinketjun käyttömäärät suodattimille FlateDecode, DCTDecode, CCITTFaxDecode, JBIG2Decode, LZWDecode, ASCIIHexDecode, ASCII85Decode, RunLengthDecode ja JPXDecode, fonttien upotuksen kattavuuden, merkintöjen määrän johdonmukaisuuden, PDF/A- / PDF/X- / PDF/UA- / Tagged PDF - / läpinäkyvyysvaatimustenmukaisuusvihjeet, valitut ominaisuusliput, JavaScript- tai toimintovaroitukset (kattaen koko PDF 1.7 sec 12.6.4 toimintojoukon: GoTo*, Thread, URI, Sound, Movie, Hide, Named, SubmitForm, ResetForm, ImportData, SetOCGState, Rendition, Trans ja GoTo3DView sekä perinteiset JavaScript- / Launch- / OpenAction- / AdditionalActions- / EmbeddedFile- / RichMedia-tarkistukset ja PDF/A-ristiriitaisuusvaroitukset), varoitusten kokonaismäärät ja yleisen hyväksytty/hylätty-yhteenvedon Nämä apuneuvot on tarkoitettu nopeiksi ajonaikaisiksi tarkistuksiksi ennen tiedostojen toimittamista ulkoisille standardien validointiohjelmille; ne eivät korvaa täyttä PDF/A-, PDF/X-, PDF/UA- tai ISO 32000 -esitarkastusvalidointia

Ylikuormitettu Format-metodi hyväksyy tyypit pfText (oletuksena oleva pelkkää tekstiä käyttävä polku, joka on tavutasolla stabiili aiempien ylikuormitusten kanssa), pfJSON (CI-ystävällinen JSON-dokumentti), pfHTML (valmis, itsenäinen HTML-raportti inline-CSS-tyyleillä ja vakavuuden mukaan väritetyillä riveillä) tai pfCSV (taulukkolaskentaan sopivat rivit metatiedoille, tarkistuksille, vihjeille, varoituksille ja yhteenvetoarvoille). JSON-tuloste ryhmittelee tietueet ylätason kenttiin input, size, pdfVersion ja xrefStyle sekä taulukoihin checks, info, hints ja warnings ja summary-objektiin, joka sisältää arvot failed, warnings ja result. CSV-tuloste käyttää pysyvää otsikkoa category,name,status,value,spec, jossa on ISO-viiteteksti sarakkeessa spec, kun diagnostiikalla on kuvattu standardilauseke. Sisäänrakennettu JSON-kooderi korvaa merkit ", \ ja ohjaustavut suojakoodeilla; UTF-8-tavujaksot välitetään muuttumattomina

Jokainen checks-, hints- ja warnings-tietue sisältää valinnaisen spec-kentän, joka nimeää sen ISO-lausekkeen, johon diagnostiikka kohdistuu (esimerkiksi ISO 32000-1 sec 7.5.5 traileriin liittyville tarkistuksille, ISO 19005-1 sec 6.6.2 PDF/A:lle jossa on JavaScriptin poissulkemisvaroitus). Kartoitus kattaa jokaisen raportin antaman tarkistuksen, vihjeen ja varoituksen versioon v2.122.0 asti. Muodollinen JSON-skeema (luonnos 2020-12), joka kuvailee pfJSON-tulostusrakennetta, on julkaistu osoitteessa Docs/preflight-schema.json, jotta alavirran kuluttajat voivat vahvistaa tulosteen ennen sen jäsentämistä

Metodi EmbedPreflightReportInPDF kirjoittaa kopion lähde-PDF-tiedostosta polkuun TargetFile siten, että perinteinen tekstimuotoinen preflight-raportti liitetään viimeisen %%EOF-merkin jälkeen PDF-tyylisinä kommenttiriveinä (kukin rivi alkaa merkillä % ). PDF-lukijat jättävät liitetyt tavut huomiotta, koska ne jäävät objektigraafin ulkopuolelle, mutta arkistotyönkulut, tekstieditorit ja grep-tyyliset työkalut voivat silti tuoda upotetun raportin esiin myöhempää tarkastusta varten. Alkuperäistä objektigraafia, ristiviitetaulukkoa ja traileria ei muokata

Metodi LoadAndValidatePreflightReport purkaa raportin, jonka metodi EmbedPreflightReportInPDF on aiemmin liittänyt, ajaa nykyisen preflight-algoritmin uudelleen upotettua kommenttilohkoa edeltäville lähdetavuille ja vertaa InputFingerprint-arvoja. Funktio palauttaa arvon True, kun molemmat tiivisteet täsmäävät, mikä osoittaa upotetun raportin kuvaavan edelleen levyllä olevaa tiedostoa. Kun validointi epäonnistuu, kutsujat voivat tarkastella raportteja OriginalReport ja CurrentReport nähdäkseen erot

Metodi ComparePreflightReports tuottaa unified-diff-tyylisen rungon kahdelle raportille. Yhteiset rivit näkyvät kahden välilyönnin etuliitteellä, vain raportissa ReportA olevat rivit alkavat etuliitteellä - ja vain raportissa ReportB olevat rivit alkavat etuliitteellä + . Algoritmi on säädetty metodin CreatePreflightReport tuottamalle selkeälle avain/arvo-tulosteelle, jossa rivijärjestys on deterministinen; se ei ole yleiskäyttöinen LCS-toteutus, mutta tuottaa tiiviitä ja luettavia eroja tyypillisessä tapauksessa, jossa raportit ovat enimmäkseen muuttumattomia

Metodi RepairPDFFromPreflightReport soveltaa varovaista tavutason korjausten osajoukkoa vaurioituneeseen PDF-tiedostoon: se pudottaa viimeistä %%EOF-merkkiä seuraavat ylimääräiset tavut ja lisää puuttuvan %%EOF-merkin, jos sellaista ei ole missään. Funktio palauttaa arvon True, kun vähintään yksi korjaus tehtiin; RepairsApplied listaa tehdyt korjaukset yhtenä rivinä per muutos. Objektigraafin korjaukset (ristiviitetaulukoiden uudelleenrakentaminen, virran pituuksien korjaaminen, trailer-sanakirjojen korjaaminen) jäävät tarkoituksella tämän ulkopuolelle, koska tällaiset korjaukset voivat vaikeuttaa osittain palautettavan tiedoston palauttamista; käytä erillistä PDF-palautustyökalua vakavampiin vaurioihin

Metodi AggregatePreflightReports ottaa taulukon tiedostokohtaisista raporteista ja tuottaa yhden eräyhteenvedon. Kukin taulukon alkio jäsennetään sen Input-, Size- ja Summary-kenttien osalta; yhteenveto tuottaa yhden rivin tiedostoa kohden sekä kokonaismäärät hyväksytyille, hylätyille ja varoitusraporteille, skannatuille kokonaistavuille ja yleisille tulosmäärille. Hyödyllinen CI-putkissa ja komentorivisilmukoissa, jotka käsittelevät PDF-hakemistoa ja haluavat yhden tiiviin yhteenvedon lopussa

Metodit LoadPreflightProfile ja ApplyPreflightProfile antavat kutsujien mukauttaa raportin tulostetta ilman analyysin uudelleenajoa. Profiilitiedosto käyttää INI-tyylistä muotoa, jossa on kolme valinnaista osiota: [disable-checks] listaa estettävät tarkistukset; [disable-warnings] listaa estettävät varoitukset; ja [options] hyväksyy asetuksen hints=false kaikkien Hint-rivien estämiseksi. Suodatuksen jälkeen Summary-rivi lasketaan uudelleen, jotta estetyt merkinnät eivät enää vaikuta hylättyjen (Failed) ja varoitusten (Warnings) kokonaismääriin; muu raportti säilyy muuttumattomana

Metodi ValidatePreflightProfile käy läpi ladatun profiilin DisableChecks- ja DisableWarnings-luettelot ja raportoi kaikki nimet, joita nykyinen preflight-toteutus ei tunnista. Hyödyllinen sellaisten profiilitiedostojen tunnistamiseen, jotka on kirjoitettu uudemmalle tai vanhemmalle HotPDF-versiolle ja jotka muuten estäisivät hiljaisesti eivät mitään, koska nimet eivät täsmää mihinkään tuotettuun tarkistukseen tai varoitukseen

Metodi GetBuiltInPreflightProfile palauttaa käyttövalmiita profiilitietueita yleisille työnkuluille. Tunnistetut nimet (kirjainkoolla ei väliä): default / '' palauttaa tyhjän profiilin; compact ottaa pois käytöstä jokaisen Hint-rivin lyhyempiä raportteja varten; silent-actions ottaa pois käytöstä jokaisen PDF 1.7 sec 12.6.4 -toimintovaroituksen sekä EmbeddedFile- ja RichMedia-varoitukset, ja se on tarkoitettu työnkuluille, jotka tarkoituksella upottavat multimediaa tai vuorovaikutteisia toimintoja eivätkä halua preflight-raportin liputtavan niitä. Tuntemattomat nimet palauttavat myös tyhjän profiilin

Metodi SavePreflightProfile kirjoittaa THPDFPreflightProfile-tietueen takaisin INI-tiedostoon samassa muodossa kuin LoadPreflightProfile lukee sen. Nämä kaksi funktiota ovat toistensa käänteisfunktioita hyvin muodostetuille profiileille, joten kutsujat voivat rakentaa työnkulun 'lataa esiasetus, säädä, tallenna': P := GetBuiltInPreflightProfile('compact'), muokkaa kenttää P.DisableChecks ja kutsu sitten metodia SavePreflightProfile(P, 'tuned.ini') myöhempää käyttöä varten

Metodi CreatePreflightReportWithProfile on kätevä kääre, joka yhdistää olemassa olevat metodit CreatePreflightReport, LoadPreflightProfile, ApplyPreflightProfile ja muotomuuntimet, jotta kutsuja, jolla on jo lähde-PDF, valinnainen salasana, profiilitiedosto ja kohdemuoto, voi tehdä yhden kutsun neljän metodin ketjuttamisen sijaan. Tyhjän arvon välittäminen parametrisä ProfileFile ohittaa profiilivaiheen

Metodi MergePreflightProfiles palauttaa kahden profiilin duplikaateista puhdistetun yhdisteen: DisableChecks ja DisableWarnings keräävät nimet molemmista syötteistä, ja DisableHints on looginen TAI-operaatio. Hyödyllinen esiasetuksen kerrostamiseen projektikohtaisten säätöjen päälle

Metodi DiffPreflightProfiles raportoi kahden profiilin väliset rakenne-erot. Palauttaa arvon True, kun ne ovat samanarvoisia; muussa tapauksessa palauttaa arvon False, jolloin parametrit OnlyInA ja OnlyInB täytetään rivinvaihdolla erotetuilla riveillä, jotka ovat muotoa check:, warn: tai option:hints=false ja kuvaavat mitkä merkinnät ovat vain toisella puolella

Metodi EmbedPreflightReportAsXMP on arkistointiystävällinen muunnelma metodista EmbedPreflightReportInPDF: se kirjoittaa kopion lähde-PDF-tiedostosta siten, että preflight-raportti on liitetty PDF-tyylisenä kommenttilohkona, jonka hyötykuorma on XMP / RDF (xmlns:hotpdf="http://www.loslab.com/hotpdf/preflight/"). Jokaisesta raporttirivistä tulee hotpdf:-elementti, jonka vakavuus välitetään attribuuttina tarkistusriveillä. XMP-tietoiset työkalut, jotka skannaavat tiedostoa xpacket-merkkien varalta, voivat tuoda upotetun raportin esiin; PDF-lukijat jättävät edelleen liitetyt tavut huomiotta, koska ne jäävät objektigraafin ulkopuolelle. Tämä ei ole tarkoituksella standardin mukainen XMP-integraatio: XMP-hyötykuormaan ei viitata catalogin /Metadata-merkinnästä, joten XMP-lukijat, jotka seuraavat vain catalogiviittausta, eivät näe sitä

Metodi ConvertPreflightReportToVeraPDFStyle muotoilee HotPDF:n preflight-raportin JSON-asiakirjaksi, joka noudattaa veraPDF:n validointitulosteen pääpiirteitä: siinä on ylätason profile-kenttä, jobs-taulukko, joka sisältää kentät itemDetails / taskResult / validationResult, ja ruleViolations-taulukko kohdassa validationResult.details. Toteutus on HotPDF-tyylinen eikä suoraan yhteensopiva veraPDF:n kanssa; tavoitteena on antaa veraPDF JSON:ia jo käyttävien jatkotyökalujen sopeutua HotPDF:n tulosteeseen minimaalisella kenttien nimeämisen uudelleenkartoituksella sen sijaan, että pitäisi opetella täysin uusi tietorakenne

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