Editable Diagnostic Documents and Repair

SaveLoadedDocumentDiagnostic produit une sortie déterministe non compressée pour inspection et édition de texte contrôlée, tandis que RepairDiagnosticDocument retransforme le fichier édité en un PDF structurellement valide

Flux de travail aller-retour

  1. Charger un document et appeler SaveLoadedDocumentDiagnostic
  2. Modifier les dictionnaires d'objets ou les octets de flux non compressés sans tenter de maintenir manuellement /Length, les lignes xref ou startxref
  3. Appeler RepairDiagnosticDocument avec des options bornées
  4. Inspecter THPDFDiagnosticRepairReport et n'utiliser la cible réparée que lorsque la méthode renvoie True

Contrat de réparation

Rejet strict

La réparation échoue en fail-closed pour les numéros d'objets dupliqués, les objets Catalog multiples ou manquants, les références d'en-tête de fichier cassées, les octets non commentés entre les objets, la grammaire d'objet invalide, les limites d'objets ou d'entrée, les décalages xref classiques plus larges que dix chiffres et les échecs de validation de rechargement strict

Les marqueurs à l'intérieur des objets validés sont ignorés, de sorte que le texte semblable à un objet dans les chaînes et les charges utiles encodées ne devient pas une entrée xref

Performance bornée

Le scanneur lit des fenêtres de 1 Mio avec une courte retenue, copie les plages d'objets directement entre les flux de fichiers, et ne conserve que les métadonnées d'objets validées ainsi que les sondes de dictionnaires bornées

MaxInputBytes, MaxObjectCount et MaxObjectNumber plafonnent le balayage, les métadonnées conservées et les lignes xref émises avant la publication de la sortie

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

API connexe