Documentos de diagnóstico editables y reparación
SaveLoadedDocumentDiagnostic produce una salida determinista y sin comprimir para inspección y edición de texto controlada, mientras que RepairDiagnosticDocument convierte el archivo editado de vuelta en un PDF estructuralmente válido
Flujo de ida y vuelta
- Cargue un documento y llame a
SaveLoadedDocumentDiagnostic - Edite diccionarios de objetos o bytes de stream sin comprimir, sin intentar mantener manualmente
/Length, las filas del xref nistartxref - Llame a
RepairDiagnosticDocumentcon opciones acotadas - Inspeccione
THPDFDiagnosticRepairReporty use el destino reparado solo cuando el método devuelvaTrue
Contrato de reparación
- El source debe comenzar con un header PDF y llevar el marcador
%QDF-1.0emitido por HotPDF - Los indirect objects validados se copian en orden físico sin re-codificar cadenas, diccionarios ni payloads de stream
- Los valores
/Lengthde stream directos, indirectos, ausentes y desactualizados se reemplazan por la longitud medida del payload - Una tabla xref clásica, un trailer canónico y un offset
startxrefexacto se reconstruyen a partir de las posiciones medidas de la salida - El trailer conserva los valores
/Info,/IDy/Encryptválidos y vincula/Rootal único Catalog validado - El destino se escribe a través de un archivo temporal hermano y reemplaza la ruta solicitada solo después de que todas las comprobaciones tengan éxito
Rechazo estricto
La reparación falla de forma cerrada ante números de objeto duplicados, objetos Catalog múltiples o ausentes, referencias de trailer rotas, bytes que no son comentarios entre objetos, gramática de objeto inválida, límites de objetos o de entrada, offsets de xref clásico de más de diez dígitos y fallos de validación de recarga estricta
Los marcadores dentro de objetos validados se saltan, así que el texto con aspecto de objeto dentro de cadenas y payloads de stream codificados no se convierte en una entrada del xref
Rendimiento acotado
El scanner lee ventanas de 1 MiB con un carry corto, copia rangos de objetos directamente entre file streams, y solo retiene metadatos de objetos validados más sondas de diccionario acotadas
MaxInputBytes, MaxObjectCount y MaxObjectNumber acotan el escaneo, los metadatos retenidos y las filas de xref emitidas antes de publicar la salida
Ejemplo en Pascal
var
Options: THPDFDiagnosticRepairOptions;
Report: THPDFDiagnosticRepairReport;
begin
Options := THPDFDiagnosticRepairOptions.Default;
Options.MaxInputBytes := Int64(16) * 1024 * 1024 * 1024;
if not THotPDF.RepairDiagnosticDocument(
'edited-diagnostic.pdf',
'repaired.pdf',
Options,
Report
) then
raise Exception.Create(string(Report.Diagnostic));
end;