Récupération bornée des références croisées

HotPDF peut récupérer un véritable graphe d’objets et une arborescence de pages lorsqu’un PDF présente une déclaration startxref manquante, invalide ou obsolète, ou des lignes xref inutilisables

Séquence de récupération

  1. Le chargeur normal conforme à la spécification s’exécute d’abord dans le mode par défaut xrrmOnFailure
  2. La récupération balaie la source par blocs de 1 Mio avec un court report entre les blocs et enregistre les objets indirects validés ainsi que les ancres xref
  3. Les marqueurs imbriqués dans un objet indirect validé sont rejetés, y compris les chaînes, les commentaires, les dictionnaires et les données binaires de flux contenant du texte tel que 99 0 obj ou xref
  4. Les tables ou flux xref valides sont essayés du plus récent au plus ancien via le chargeur incrémental, hybride et de flux d’objets existant
  5. Au plus 4 096 ancres de sections xref sont conservées, ce qui empêche la répétition adverse de marqueurs de multiplier les tentatives d’analyse
  6. Si aucune section xref ne produit une véritable arborescence de pages, les offsets d’objets directs sont reconstruits et les numéros d’objets en double utilisent la définition physique la plus récente
  7. La récupération ne réussit que lorsqu’un véritable Catalog, une arborescence Pages et au moins une feuille de page sont résolus

Déclarations

type
  THPDFXRefRecoveryMode = (
    xrrmDisabled,
    xrrmOnFailure,
    xrrmForce
  );

  THPDFXRefRecoveryStatus = (
    xrrsNotNeeded,
    xrrsSucceeded,
    xrrsDisabled,
    xrrsScanLimitExceeded,
    xrrsObjectLimitExceeded,
    xrrsXRefLimitExceeded,
    xrrsFailed
  );

  THPDFXRefRecoveryMethod = (
    xrrmethodNone,
    xrrmethodRelocatedSection,
    xrrmethodRebuiltObjectOffsets
  );

  THPDFXRefMergeInfo = record
    HybridRevisionCount: Integer;
    HybridOverlapCount: Integer;
    OlderRevisionShadowedEntryCount: Integer;
    DuplicateEntryCount: Integer;
    NewestRevisionPrecedenceApplied: boolean;
    HybridStreamPrecedenceApplied: boolean;
  end;

property XRefRecoveryMode: THPDFXRefRecoveryMode;
property XRefRecoveryMaxScanBytes: Int64;
property XRefRecoveryMaxObjects: Integer;

function GetLoadedXRefRecoveryInfo(
  out Info: THPDFXRefRecoveryInfo
): boolean;

function GetLoadedXRefMergeInfo(
  out Info: THPDFXRefMergeInfo
): boolean;

Configuration

MembrePar défautRôle
XRefRecoveryModexrrmOnFailureDésactive la récupération, ne l’exécute qu’après l’échec de l’analyse normale, ou la force avant l’analyse normale
XRefRecoveryMaxScanBytes8 GiBMaximum absolu de taille source accepté par le scan de récupération par blocs
XRefRecoveryMaxScanBytes8 GioTaille maximale stricte de source acceptée par le balayage de récupération par blocs
XRefRecoveryMaxObjects2 000 000Nombre maximal strict de candidats d’objets indirects validés acceptés par la récupération

Informations de récupération

GetLoadedXRefRecoveryInfo renvoie True lorsqu’une tentative de récupération a eu lieu et copie l’enregistrement THPDFXRefRecoveryInfo le plus récent

Informations de précédence de fusion

GetLoadedXRefMergeInfo renvoie True lorsque le chargement de flux xref ou de références hybrides a rencontré un état de fusion à signaler

Informations de précédence de fusion

GetLoadedXRefMergeInfo renvoie True lorsque le chargement par flux xref ou références hybrides a rencontré un état de fusion digne d’être rapporté

Informations d’intégrité

GetLoadedXRefIntegrityInfo rapporte la chaîne de liste libre active, les liens invalides, les cycles, les entrées libres non chaînées, les erreurs de transition de génération, les définitions vivantes dupliquées et les entrées plus anciens masquées par la révision la plus récente

Le détail masqué comprend les types d’entrées actives et rejetées, les offsets ou champs de stockage, les générations et la profondeur de révision, avec un plafond de détail fixé à 256 entrées

Enregistrement des documents récupérés

Un document récupéré utilise toujours le chemin de réécriture complète dans SaveLoadedDocument, même lorsqu’aucun objet n’a été modifié, afin qu’HotPDF ne copie jamais des octets source endommagés comme une sortie apparemment réparée

Exemple

var
  Info: THPDFXRefRecoveryInfo;
  PDF: THotPDF;
begin
  PDF := THotPDF.Create(nil);
  try
    PDF.XRefRecoveryMode := xrrmOnFailure;
    PDF.XRefRecoveryMaxScanBytes := Int64(16) * 1024 * 1024 * 1024;
    PDF.XRefRecoveryMaxObjects := 3000000;
    if PDF.LoadFromFile('damaged.pdf') > 0 then
    begin
      if PDF.GetLoadedXRefRecoveryInfo(Info) then
        WriteLn(Info.Diagnostic);
      PDF.SaveLoadedDocument('recovered.pdf');
    end;
  finally
    PDF.Free;
  end;
end;

API associées