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