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

  1. Carregue um documento e chame SaveLoadedDocumentDiagnostic
  2. Edite os dicionários de objetos ou os bytes de streams não comprimidos, sem tentar manter à mão /Length, as linhas do xref nem startxref
  3. Chame RepairDiagnosticDocument with bounded options
  4. Inspecione THPDFDiagnosticRepairReport e use o destino reparado apenas quando o método devolver True

Repair contract

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;

Related API