THotPDF Preflight Report Methods

Söz dizimi

type
  THPDFPreflightFormat = (pfText, pfJSON, pfHTML, pfCSV);

function CreatePreflightReport(
  const SourceFile: TFileName;
  const Password  :AnsiString = ''): AnsiString; overload;
function CreatePreflightReport(
  const SourceFile: TFileName;
  const Password  : AnsiString;
  const Format    : THPDFPreflightFormat): AnsiString; overload;
procedure SavePreflightReport(
  const SourceFile: TFileName;
  const ReportFile: TFileName;
  const Password  :AnsiString = ''); overload;
procedure SavePreflightReport(
  const SourceFile: TFileName;
  const ReportFile: TFileName;
  const Password  : AnsiString;
  const Format    : THPDFPreflightFormat); overload;
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;

Açıklama

CreatePreflightReport giriş PDFini okur ve hafif yapısal kontroller içeren text rapor döndürür. Password overloadları, desteklenen encrypted PDFler için mevcut password-aware load path kullanır. SavePreflightReport aynı raporu hedef text dosyasına yazar.

ValidatePDFVT odaklanmış bir PDF/VT validation pass çalıştırır ve yalnızca gerekli markerlar ve yapılar mevcut olduğunda True döndürür. Döndürülen text rapor pdfvtid:GTS_PDFVTVersion XMP claimini, PDF/VT metadata namespace değerini, PDF/VT modification date ile xmp:ModifyDate eşleşmesini, PDF/X base markerı, encryption yokluğunu, PDF/X output intent değerini, catalog DPartRoot, DPartRootNode, NodeNameList, document part varlığını, loadable page count değerini ve page-level DPart kapsamını denetler. PDF/VT ve XMP date propertyleri element text olarak veya bir rdf:Description elementi üzerinde RDF attribute olarak yazılabilir.

Rapor PDF header, EOF marker, final %%EOF markerının dosya sonuna yakın olup olmadığını, son startxref offsetini, bu offsetin xref table mı yoksa xref stream mi hedeflediğini, %%EOF ve startxref marker count değerlerini, revision marker balance ve final marker ordering değerlerini, trailer veya XRef stream markerını, loadable page count, encryption state, catalog, page tree, page object marker, MediaBox, information dictionary reference, root reference, indirect object count, indirect object definition count, highest object number, duplicate object number count, object number uniqueness, catalog object count, page tree object count, page object count, page tree declared page count, page tree count/loadable page consistency, page object/loadable page consistency, stream ve endstream balance, stream /Length entry coverage, xref table count, xref subsection count, xref table entry counts, xref free ve in-use entry counts, malformed xref row count, xref row validity, object numberlara karşı xref coverage, xref stream count, object stream count, trailer count, trailer /Size, trailer /Size değerinin highest object number değerini kapsayıp kapsamadığını, trailer /Root ve /Info indirect reference değerlerini, bu referenced objectlerin tanımlı olup olmadığını, trailer /Root değerinin catalog object hedefleyip hedeflemediğini, trailer /ID array entry count ve pair structure değerini, trailer /Root, /Info, /ID ve /Encrypt varlığını, estimated incremental update count, linearization status, loaded page boxes, form field count, resource dictionary count, font resource count, embedded font program count (/FontFile, /FontFile2, /FontFile3), image XObject count, form XObject count, ColorSpace resource count, annotation count ve widget/link annotation subcount değerlerini, FlateDecode, DCTDecode, CCITTFaxDecode, JBIG2Decode, LZWDecode, ASCIIHexDecode, ASCII85Decode, RunLengthDecode ve JPXDecode için filter chain usage count değerlerini, font embedding coverage, annotation count consistency, PDF/A / PDF/X / PDF/UA / Tagged PDF / transparency compliance hintlerini, selected feature flagleri, JavaScript veya action warninglerini (tam PDF 1.7 sec 12.6.4 action setini kapsar: GoTo*, Thread, URI, Sound, Movie, Hide, Named, SubmitForm, ResetForm, ImportData, SetOCGState, Rendition, Trans ve GoTo3DView, ayrıca legacy JavaScript / Launch / OpenAction / AdditionalActions / EmbeddedFile / RichMedia kontrolleri ve PDF/A mutual-exclusion warningleri), warning total değerlerini ve genel pass/fail summary değerini denetler. Bu helperlar, dosyaları external standards validator araçlarına vermeden önce hızlı in-process kontroller için tasarlanmıştır; tam PDF/A, PDF/X, PDF/UA veya ISO 32000 preflight validation engine yerine geçmez.

Format overload'ı; pfText (varsayılan düz metin yolu, eski overload'larla bayt açısından kararlı), pfJSON (CI dostu JSON belgesi) veya pfHTML (gösterge paneline hazır, satır içi CSS ve önem renkli satırlar içeren kendi kendine yeten HTML raporu) veya pfCSV (meta veri, kontrol, ipucu, uyarı ve özet değerleri için elektronik tablo dostu satırlar) kabul eder. JSON çıktısı; girdileri input, size, pdfVersion ve xrefStyle üst düzey alanlarıyla birlikte checks, info, hints ve warnings dizilerine ve failed, warnings ve result değerleri taşıyan bir summary nesnesine gruplar. Her kontrol, ipucu ve uyarı ayrıca kararlı, ad alanına ayrılmış bir ruleId ve yapılandırılmış bir location nesnesi taşır. Konum her zaman mantıksal bir scope ve eğik çizgiyle ayrılmış bir path içerir; ilişkili PDF key'ini içerebilir ve rapor tam bir koordinat tanımlayabiliyorsa objectNumber, pageIndex veya byteOffset ekler. CSV çıktısı, tanılamanın eşleşmiş bir standart maddesi olduğunda spec içinde ISO referans metni olacak şekilde kararlı category,name,status,value,spec başlığını kullanır. Yerleşik JSON kodlayıcı ", \ ve kontrol baytlarını kaçışlar; UTF-8 bayt dizileri değişmeden geçer

Her checks, hints ve warnings girdisi, diagnostic hedeflediği ISO clause değerini adlandıran optional spec alanı taşır (örneğin trailer-related kontroller için ISO 32000-1 sec 7.5.5, JavaScript ile PDF/A mutual-exclusion warning için ISO 19005-1 sec 6.6.2). Mapping, v2.122.0 boyunca rapor tarafından emitted edilen her check, hint ve warning değerini kapsar. pfJSON output yapısını açıklayan formal JSON Schema (draft 2020-12), downstream consumerların outputu parse etmeden önce validate edebilmesi için Docs/preflight-schema.json konumunda yayınlanır. Kural kimlikleri, CI politikalarının çevrilmiş metne veya dizi konumuna güvenmeden bir kuralla eşleşmesine imkân tanıyan hotpdf.preflight.<category>.<rule-name> kararlı biçimini kullanır

EmbedPreflightReportInPDF, source PDF kopyasını TargetFile konumuna, legacy text-format preflight raporu son %%EOF sonrasına PDF-style comment line olarak eklenmiş halde yazar (her line %  ile prefixlenir). PDF readerlar eklenen byteleri yok sayar çünkü bunlar object graph dışındadır, ancak archive workflowları, text editorler ve grep-style araçlar embedded raporu sonraki audit için yine de surface edebilir. Original object graph, cross-reference table ve trailer değiştirilmez.

LoadAndValidatePreflightReport , EmbedPreflightReportInPDF'in daha önce eklediği raporu çıkarır, gömülü yorum bloğundan önceki kaynak baytlar üzerinde geçerli preflight algoritmasını yeniden çalıştırır ve InputFingerprint değerlerini karşılaştırır. Her iki parmak izi de eşleştiğinde — yani gömülü rapor hâlâ dosyanın diskteki hâlini tanımlıyor olduğunda — işlev True döndürür. Doğrulama başarısız olduğunda çağıranlar nelerin değiştiğini ayırt etmek için OriginalReport ve CurrentReport'u inceleyebilir.

ComparePreflightReports , iki rapor için unified-diff benzeri bir gövde üretir. Paylaşılan satırlar iki boşluklu önekle görünür, yalnızca ReportA'da olan satırlar - , yalnızca ReportB'de olan satırlar +  önekiyle yazılır. Algoritma, CreatePreflightReport'un ürettiği satır sırası deterministik biçimli anahtar/değer çıktısına göre ayarlanmıştır; genel amaçlı bir LCS uygulaması değildir ama çoğunlukla değişmemiş raporların tipik durumunda kompakt ve okunabilir farklar üretir.

RepairPDFFromPreflightReport hasarlı bir PDF'e ihtiyatlı bir bayt düzeyi onarım alt kümesi uygular: son %%EOF işaretini izleyen sondaki baytları atar ve hiçbir yerde %%EOF yoksa eksik %%EOF ekler. En az bir onarım uygulandığında işlev True döndürür; RepairsApplied onarımları değişiklik başına bir satır olarak listeler. Nesne grafiği onarımları (xref tablolarını yeniden kurmak, stream uzunluklarını yamalamak, trailer sözlüklerini düzeltmek) bilinçli olarak kapsam dışıdır, çünkü bu tür düzeltmeler kısmen kurtarılabilir bir dosyayı daha az kurtarılabilir hale getirebilir; daha derin hasar için özel bir PDF kurtarma aracı kullanın

AggregatePreflightReports file başına raporlardan oluşan array alır ve tek batch summary üretir. Array içindeki her entry Input, Size ve Summary alanları için parse edilir; aggregate file başına bir line, ayrıca passed, failed ve warning report sayıları, scanned total bytes ve overall result count toplamları yayar. PDF dizini işleyen ve sonda tek concise summary isteyen CI pipelineları ve shell loopları için kullanışlıdır.

LoadPreflightProfile ve ApplyPreflightProfile, çağıranların analizi yeniden çalıştırmadan rapor çıktısını özelleştirmesini sağlar. Profil dosyası, üç isteğe bağlı bölümü olan INI tarzı bir biçim kullanır: [disable-checks] bastırılacak kontrol adlarını, [disable-warnings] bastırılacak uyarı adlarını listeler; [options] ise her Hint satırını bastırmak için hints=false kabul eder. Filtreleme sonrasında Özet satırı yeniden hesaplanır; böylece bastırılan girdiler Failed ve Warnings toplamlarına artık katkıda bulunmaz ve raporun geri kalanı değişmeden geçer

ValidatePreflightProfile, loaded profile içindeki DisableChecks ve DisableWarnings listelerini gezer ve current preflight implementation tarafından tanınmayan her adı raporlar. Daha yeni veya eski HotPDF sürümüne göre yazılmış profile fileları tespit etmek için kullanışlıdır; aksi halde adlar emitted check veya warninglerden hiçbiriyle eşleşmediği için hiçbir şeyi sessizce disable etmeyebilir.

GetBuiltInPreflightProfile, yaygın iş akışları için kullanıma hazır profil kayıtları döndürür. Tanınan adlar (büyük/küçük harf duyarsız): default / '' boş bir profil döndürür; compact daha kısa raporlar için her Hint satırını devre dışı bırakır; silent-actions, tüm PDF 1.7 sec 12.6.4 eylem uyarılarını ayrıca EmbeddedFile ve RichMedia ile birlikte devre dışı bırakır ve çoklu ortam ya da etkileşimli eylemleri bilinçli olarak gömen, preflight raporunun onları işaretlemesini istemeyen iş akışları için tasarlanmıştır. Bilinmeyen adlar da boş profil döndürür

SavePreflightProfile, bir THPDFPreflightProfile kaydını LoadPreflightProfile'ın tükettiği biçimle aynı INI biçiminde dosyaya geri yazar. İki işlev de düzgün oluşturulmuş profiller için birbirinin tam tersidir; böylece çağıranlar 'ön ayar yükle, ince ayar yap, kaydet' iş akışı kurabilir: P := GetBuiltInPreflightProfile('compact'), P.DisableChecks'i düzenleyin, sonra sonraki kullanımlar için SavePreflightProfile(P, 'tuned.ini')

CreatePreflightReportWithProfile, mevcut CreatePreflightReport, LoadPreflightProfile, ApplyPreflightProfile ve format converterları birleştiren tek adımlı convenience wrapperdır; böylece source PDF, optional password, profile file ve target format zaten elinde olan caller dört çağrıyı zincirlemek yerine tek çağrı yapabilir. Boş ProfileFile geçirmek profile adımını atlar.

MergePreflightProfiles iki profilin deduplicate edilmiş birleşimini döndürür: DisableChecks ve DisableWarnings iki inputtan adları toplar, DisableHints logical OR olur. Preset üzerine project-specific tweak katmanlamak için kullanışlıdır.

DiffPreflightProfiles , iki profil arasındaki yapısal farkı raporlar. Eşdeğerlerse True döndürür; aksi hâlde OnlyInA ve OnlyInB, her tarafa özgü girdileri açıklayan check:<name>, warn:<name> veya option:hints=false biçiminde satırsonuyla ayrılmış satırlarla dolu olarak False döndürür.

EmbedPreflightReportAsXMP , EmbedPreflightReportInPDF'in arşiv dostu bir varyantıdır: kaynak PDF'in, preflight raporu XMP / RDF yükü taşıyan PDF tarzı bir yorum bloğu (xmlns:hotpdf="http://www.loslab.com/hotpdf/preflight/") olarak eklenmiş bir kopyasını yazar. Her rapor satırı bir hotpdf:<name> öğesine dönüşür ve önem derecesi check satırlarında bir öznitelik olarak taşınır. Bir dosyayı xpacket işaretleri için tarayan XMP duyarlı araçlar gömülü raporu ortaya çıkarabilir; eklenen baytlar nesne grafiğinin dışında kaldığı için PDF okuyucuları bunları yok saymaya devam eder. Bu, bilinçli olarak belirtim uyumlu bir XMP entegrasyonu değildir: XMP yükü katalog /Metadata girdisinden referanslanmaz, dolayısıyla yalnızca katalog referansını izleyen XMP okuyucular onu görmez.

ConvertPreflightReportToVeraPDFStyle, HotPDF preflight raporunu veraPDF validation outputunun genel taslağını izleyen JSON document haline getirir; top-level profile alanı, itemDetails / taskResult / validationResult içeren jobs arrayi ve validationResult.details altında ruleViolations arrayi bulunur. Wire-compatible veraPDF yerine HotPDF-styled yapıdadır; amaç, veraPDF JSON tüketen downstream tooling için HotPDF outputuna tamamen farklı data layout öğrenmeden, minimum field-name remapping ile uyum sağlamaktır. Her ihlal, yerel JSON raporunun kullandığı aynı kararlı ruleId ve yapılandırılmış location'ı taşır

Örnek

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;

Ayrıca bkz.