Documentos de diagnóstico editáveis e reparação
SaveLoadedDocumentDiagnostic produz uma saída determinística e não empacotada, para inspeção e edição de texto controlada, enquanto RepairDiagnosticDocument converte o ficheiro editado de volta num PDF estruturalmente válido
Round-trip workflow
- Carregue um documento e chame
SaveLoadedDocumentDiagnostic - Edite os dicionários de objetos ou os bytes de streams não comprimidos, sem tentar manter à mão
/Length, as linhas do xref nemstartxref - Chame
RepairDiagnosticDocumentwith bounded options - Inspecione
THPDFDiagnosticRepairReporte use o destino reparado apenas quando o método devolverTrue
Repair contract
- A origem tem de começar com um cabeçalho PDF e trazer o marcador
%QDF-1.0emitido pelo HotPDF - Os objetos indiretos validados são copiados pela ordem física, sem recodificar strings, dicionários nem payloads de streams
- Os valores de
/Lengthde stream diretos, indiretos, em falta e desatualizados são substituídos pelo comprimento medido do payload - Uma tabela xref clássica, um trailer canónico e o offset exato de
startxrefsão reconstruídos a partir das posições de saída medidas - O trailer preserva os valores válidos de
/Info,/IDe/Encrypte liga/Rootao único Catalog validado - O destino é escrito através de um ficheiro temporário irmão e só substitui o caminho pedido depois de todas as verificações terem êxito
Strict rejection
A reparação falha em modo fechado perante números de objeto duplicados, vários objetos Catalog ou nenhum, referências de trailer quebradas, bytes que não são comentários entre objetos, gramática de objeto inválida, limites de objetos ou de entrada, offsets xref clássicos com mais de dez dígitos e falhas na validação estrita do recarregamento
Os marcadores dentro de objetos validados são ignorados, pelo que texto com aspeto de objeto dentro de strings e payloads de streams codificados não se transforma numa entrada xref
Bounded performance
O scanner lê janelas de 1 MiB com um pequeno carry, copia os intervalos de objetos diretamente entre streams de ficheiro e retém apenas metadados de objetos validados e sondas de dicionário delimitadas
MaxInputBytes, MaxObjectCount e MaxObjectNumber limitam a análise, os metadados retidos e as linhas xref emitidas antes de a saída ser publicada
Pascal example
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;