THotPDF Preflight Report Methods

Sintaxis

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;

Descripción

CreatePreflightReport lee un PDF de entrada y devuelve un informe de texto con comprobaciones estructurales ligeras. Las sobrecargas con contraseña usan la ruta de carga con contraseña ya existente para los PDF cifrados admitidos SavePreflightReport escribe el mismo informe en un archivo de texto de destino

ValidatePDFVT ejecuta una pasada de validación PDF/VT enfocada y devuelve True solo cuando están presentes los marcadores y estructuras requeridos. El informe de texto devuelto comprueba la declaración XMP pdfvtid:GTS_PDFVTVersion, el espacio de nombres de metadatos PDF/VT, la fecha de modificación PDF/VT y la coincidencia de xmp:ModifyDate, el marcador base PDF/X, la ausencia de cifrado, el OutputIntent PDF/X, DPartRoot del catálogo, DPartRootNode, NodeNameList, la presencia de partes del documento, el recuento de páginas cargables y la cobertura DPart a nivel de página. Las propiedades de fecha PDF/VT y XMP pueden escribirse tanto como texto de elemento como como atributos RDF en un elemento rdf:Descripción

El informe comprueba el encabezado PDF, el marcador EOF, si el marcador final %%EOF está cerca del final del archivo, el último desplazamiento startxref, si ese desplazamiento apunta a una tabla xref o a un flujo xref, los conteos de marcadores %%EOF y startxref, el equilibrio de marcadores de revisión y el orden final de los marcadores, el marcador de trailer o flujo XRef, el recuento de páginas cargables, el estado de cifrado, el catálogo, el árbol de páginas, el marcador de objeto de página, MediaBox, la referencia del diccionario de información, la referencia raíz, el recuento de objetos indirectos, el recuento de definiciones de objetos indirectos, el número de objeto más alto, el recuento de números de objeto duplicados, la unicidad de números de objeto, el recuento de objetos del catálogo, el recuento de objetos del árbol de páginas, el recuento de objetos de página, el recuento declarado de páginas del árbol de páginas, la coherencia entre el recuento del árbol de páginas y las páginas cargables, la coherencia entre el objeto de página y las páginas cargables, el equilibrio de flujos y endstream, la cobertura de entradas /Length de los flujos, el recuento de tablas xref, el recuento de sub-secciones xref, los recuentos de entradas de tabla xref, los recuentos de entradas libres y en uso de xref, el recuento de filas xref malformadas, la validez de las filas xref, la cobertura xref frente a los números de objeto, el recuento de flujos xref, el recuento de flujos de objetos, el recuento de trailers, /Size del trailer, si /Size del trailer cubre el número de objeto más alto, las referencias indirectas /Root y /Info del trailer, si esos objetos referenciados están definidos, si /Root del trailer apunta a un objeto de catálogo, el recuento de entradas y la estructura por pares del arreglo /ID del trailer, la presencia de /Root, /Info, /ID y /Encrypt en el trailer, el recuento estimado de actualizaciones incrementales, el estado de linearización, las cajas de página cargadas, el recuento de campos de formulario, el recuento de diccionarios de recursos, el recuento de recursos de fuente, el recuento de programas de fuente incrustados (/FontFile, /FontFile2, /FontFile3), el recuento de XObjects de imagen, el recuento de XObjects de formulario, el recuento de recursos ColorSpace, el recuento de anotaciones y los subrecuentos de anotaciones widget/enlace, los conteos de uso de la cadena de filtros para FlateDecode, DCTDecode, CCITTFaxDecode, JBIG2Decode, LZWDecode, ASCIIHexDecode, ASCII85Decode, RunLengthDecode y JPXDecode, la cobertura de incrustación de fuentes, la coherencia del recuento de anotaciones, las pistas de conformidad PDF/A / PDF/X / PDF/UA / Tagged PDF / transparencia, las banderas de función seleccionadas, las advertencias de JavaScript o de acciones (que cubren todo el conjunto de acciones PDF 1.7 sec 12.6.4: GoTo*, Thread, URI, Sound, Movie, Hide, Named, SubmitForm, ResetForm, ImportData, SetOCGState, Rendition, Trans y GoTo3DView, además de las comprobaciones heredadas de JavaScript / Launch / OpenAction / AdditionalActions / EmbeddedFile / RichMedia y las advertencias de exclusión mutua PDF/A), los totales de advertencias y un resumen general de aprobado / fallado Estos ayudantes están pensados como comprobaciones rápidas en proceso antes de entregar archivos a validadores de estándares externos; no reemplazan a un motor completo de validación preflight PDF/A, PDF/X, PDF/UA o ISO 32000

La sobrecarga Format acepta pfText (ruta de texto plano predeterminada, idéntica a nivel de bytes a las sobrecargas heredadas), pfJSON (documento JSON apto para CI) o pfHTML (informe HTML autónomo, listo para panel, con CSS en línea y filas coloreadas por severidad). La salida JSON agrupa las entradas en los campos de nivel superior input, size, pdfVersion y xrefStyle, además de los arreglos checks, info, hints y warnings y un objeto summary con los valores failed, warnings y result. El codificador JSON integrado escapa ", \ y bytes de control; las secuencias de bytes UTF-8 pasan sin cambios

Cada entrada de checks, hints y warnings incluye un campo opcional spec que nombra la cláusula ISO que el diagnóstico apunta (por ejemplo ISO 32000-1 sec 7.5.5 para comprobaciones relacionadas con el trailer, ISO 19005-1 sec 6.6.2 para la advertencia de exclusión mutua entre PDF/A y JavaScript). El mapeo cubre cada comprobación, pista y advertencia emitida por el informe hasta v2.122.0. Un esquema JSON formal (draft 2020-12) que describe la estructura de salida pfJSON se publica en Docs/preflight-schema.json para que los consumidores posteriores puedan validar la salida antes de analizarla

EmbedPreflightReportInPDF escribe una copia del PDF de origen en TargetFile con el informe preflight en formato de texto heredado agregado después del último %%EOF como líneas de comentario al estilo PDF (cada línea prefijada con ). Los lectores PDF ignoran los bytes agregados porque quedan fuera del grafo de objetos, pero los flujos de archivo, los editores de texto y las herramientas estilo grep aún pueden mostrar el informe incrustado para auditoría posterior. El grafo de objetos original, la tabla de referencias cruzadas y el trailer no se modifican

LoadAndValidatePreflightReport extrae el informe que EmbedPreflightReportInPDF agregó previamente, vuelve a ejecutar el algoritmo preflight actual sobre los bytes de origen anteriores al bloque de comentarios incrustado y compara los valores InputFingerprint. La función devuelve True cuando ambas huellas coinciden, lo que indica que el informe incrustado sigue describiendo el archivo tal como existe en disco Cuando la validación falla, los llamadores pueden inspeccionar OriginalReport y CurrentReport para comparar qué cambió

ComparePreflightReports emite un cuerpo similar a un diff unificado para dos informes. Las líneas compartidas aparecen con un prefijo de dos espacios, las líneas únicas de ReportA llevan el prefijo , y las líneas únicas de ReportB llevan el prefijo . El algoritmo está ajustado para la salida de pares clave/valor bien formada que produce CreatePreflightReport, donde el orden de las líneas es determinista; no es una implementación LCS de propósito general, pero produce diffs compactos y legibles para el caso típico de informes mayormente sin cambios

RepairPDFFromPreflightReport aplica un subconjunto conservador de reparaciones a nivel de bytes a un PDF dañado: elimina los bytes finales que siguen al marcador %%EOF final y agrega un %%EOF faltante cuando no aparece en ninguna parte. La función devuelve True cuando se aplicó al menos una reparación; RepairsApplied lista las reparaciones como una línea por cambio. Las reparaciones del grafo de objetos (reconstruir tablas xref, corregir longitudes de flujos, arreglar diccionarios de trailer) quedan deliberadamente fuera de alcance porque ese tipo de correcciones puede hacer que un archivo parcialmente recuperable sea menos recuperable; use una herramienta dedicada de recuperación de PDF para daños más profundos

AggregatePreflightReports toma un arreglo de informes por archivo y produce un resumen por lote único. Cada entrada del arreglo se analiza para sus campos Input, Size y Summary; el agregado emite una línea por archivo más totales del número de informes aprobados, fallidos y con advertencias, los bytes totales analizados y los recuentos globales de resultado. Útil para canalizaciones CI y bucles de shell que procesan un directorio de PDF y quieren un resumen conciso al final

LoadPreflightProfile y ApplyPreflightProfile permiten a los llamadores ajustar la salida del informe sin volver a ejecutar el análisis. El archivo de perfil usa un formato estilo INI con tres secciones opcionales: [disable-checks] lista nombres de comprobaciones para suprimir; [disable-warnings] lista nombres de advertencias para suprimir; y [options] acepta hints=false para suprimir todas las líneas Hint. Después del filtrado, la línea Summary se recalcula para que las entradas suprimidas ya no contribuyan a los totales de Failed y Warnings; el resto del informe pasa sin cambios

ValidatePreflightProfile recorre las listas DisableChecks y DisableWarnings de un perfil cargado e informa cualquier nombre no reconocido por la implementación preflight actual. Útil para detectar archivos de perfil escritos contra una versión más nueva o más antigua de HotPDF que, de otro modo, no deshabilitarían nada en silencio porque los nombres no coinciden con ninguna comprobación o advertencia emitida

GetBuiltInPreflightProfile devuelve registros de perfil listos para usar para flujos de trabajo comunes. Nombres reconocidos (sin distinguir mayúsculas): default / '' devuelve un perfil vacío; compact deshabilita todas las líneas Hint para informes más cortos; silent-actions deshabilita todas las advertencias de acciones PDF 1.7 sec 12.6.4 más EmbeddedFile y RichMedia, pensado para flujos de trabajo que incrustan de forma intencional contenido multimedia o acciones interactivas y no quieren que el informe preflight las marque. Los nombres desconocidos también devuelven un perfil vacío

SavePreflightProfile escribe un registro THPDFPreflightProfile de vuelta a un archivo INI en el mismo formato que consume LoadPreflightProfile Las dos funciones son inversas exactas para perfiles bien formados, así que los llamadores pueden construir un flujo de trabajo de "cargar preajuste, ajustar, guardar": P := GetBuiltInPreflightProfile('compact'), edite P.DisableChecks y luego use SavePreflightProfile(P, 'tuned.ini') para reutilizarlo más tarde

CreatePreflightReportWithProfile es una envoltura de conveniencia de una sola llamada que compone las funciones existentes CreatePreflightReport, LoadPreflightProfile, ApplyPreflightProfile y los convertidores de formato para que un llamador que ya tiene un PDF de origen, una contraseña opcional, un archivo de perfil y un formato de destino pueda hacer una sola llamada en vez de encadenar cuatro. Pasar un ProfileFile vacío omite el paso de perfil

MergePreflightProfiles devuelve la unión deduplicada de dos perfiles: DisableChecks y DisableWarnings recogen nombres de ambas entradas, DisableHints es el OR lógico. Útil para superponer un preajuste sobre ajustes específicos del proyecto

DiffPreflightProfiles informa la diferencia estructural entre dos perfiles. Devuelve True cuando son equivalentes; de lo contrario False con OnlyInA y OnlyInB rellenados con líneas separadas por saltos de línea de la forma check:<name>, warn:<name> u option:hints=false que describen qué entradas son exclusivas de cada lado

EmbedPreflightReportAsXMP es una variante amigable con archivos de archivo de EmbedPreflightReportInPDF: escribe una copia del PDF de origen con el informe preflight agregado como un bloque de comentarios al estilo PDF cuyo contenido es XMP / RDF (xmlns:hotpdf="http://www.loslab.com/hotpdf/preflight/") Cada línea del informe se convierte en un elemento hotpdf:<name> con la severidad llevada como atributo en las filas de comprobación Las herramientas compatibles con XMP que escanean un archivo en busca de marcadores xpacket pueden mostrar el informe incrustado; los lectores PDF continúan ignorando los bytes agregados porque quedan fuera del grafo de objetos. Esto no es intencionalmente una integración XMP conforme a la especificación: la carga XMP no se referencia desde la entrada /Metadata del catálogo, así que los lectores XMP que solo siguen la referencia del catálogo no la verán

ConvertPreflightReportToVeraPDFStyle da forma a un informe preflight de HotPDF para convertirlo en un documento JSON que sigue la estructura general de la salida de validación de veraPDF, con un campo profile de nivel superior, un arreglo jobs que contiene itemDetails / taskResult / validationResult, y un arreglo ruleViolations bajo validationResult.details. Está estilado al modo HotPDF y no es compatible a nivel de cable con veraPDF; la meta es permitir que las herramientas posteriores que ya consumen JSON de veraPDF se adapten a la salida de HotPDF con un remapeo mínimo de nombres de campo en lugar de reaprender una disposición de datos completamente distinta

Ejemplo

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;

Véase también