Recuperação Limitada de Referência Cruzada
O HotPDF consegue recuperar um gráfico de objetos e árvore de páginas reais quando um PDF tem uma declaração startxref em falta, inválida ou obsoleta, ou linhas xref inutilizáveis
Sequência de recuperação
- O carregador normal em conformidade com a norma corre primeiro no modo predefinido
xrrmOnFailure - A recuperação analisa a origem em fragmentos de 1 MiB com um transporte curto entre fragmentos e regista objetos indiretos validados e âncoras xref
- Marcadores aninhados dentro de um objeto indireto validado são rejeitados, incluindo cadeias, comentários, dicionários e dados de fluxo binário contendo texto como
99 0 objouxref - Tabelas ou fluxos xref válidos são experimentados do mais recente para o mais antigo através do carregador incremental, híbrido e de fluxo de objetos existente
- No máximo 4096 âncoras de secção xref são retidas, impedindo que a repetição adversarial de marcadores multiplique as tentativas de análise
- Se nenhuma secção xref produzir uma árvore de páginas real, os desvios de objetos diretos são reconstruídos e os números de objeto duplicados utilizam a definição física mais recente
- A recuperação só é bem-sucedida quando um Catalog real, árvore de Pages e pelo menos uma folha de página são resolvidos
Declarações
type
THPDFXRefRecoveryMode = (
xrrmDisabled,
xrrmOnFailure,
xrrmForce
);
THPDFXRefRecoveryStatus = (
xrrsNotNeeded,
xrrsSucceeded,
xrrsDisabled,
xrrsScanLimitExceeded,
xrrsObjectLimitExceeded,
xrrsXRefLimitExceeded,
xrrsFailed
);
THPDFXRefRecoveryMethod = (
xrrmethodNone,
xrrmethodRelocatedSection,
xrrmethodRebuiltObjectOffsets
);
THPDFParserRecoveryConfidence = (
prcNone,
prcLow,
prcMedium,
prcHigh,
prcVerified
);
THPDFParserRecoveryEvent = record
Kind: THPDFParserRecoveryEventKind;
Confidence: THPDFParserRecoveryConfidence;
FirstByte: Int64;
EndByte: Int64;
ObjectNumber: Integer;
GenerationNumber: Integer;
Message: AnsiString;
end;
THPDFXRefMergeInfo = record
HybridRevisionCount: Integer;
HybridOverlapCount: Integer;
OlderRevisionShadowedEntryCount: Integer;
DuplicateEntryCount: Integer;
NewestRevisionPrecedenceApplied: boolean;
HybridStreamPrecedenceApplied: boolean;
end;
property XRefRecoveryMode: THPDFXRefRecoveryMode;
property XRefRecoveryMaxScanBytes: Int64;
property XRefRecoveryMaxObjects: Integer;
property ParserRecoveryEventLimit: Integer;
property LoadedParserRecoveryEventCount: Integer;
property LoadedParserRecoveryEventDroppedCount: Integer;
function GetLoadedXRefRecoveryInfo(
out Info: THPDFXRefRecoveryInfo
): boolean;
function GetLoadedParserRecoveryEvents:
THPDFParserRecoveryEventArray;
function GetLoadedParserRecoveryEvent(
Index: Integer;
out EventInfo: THPDFParserRecoveryEvent
): boolean;
function GetLoadedXRefMergeInfo(
out Info: THPDFXRefMergeInfo
): boolean;
function GetLoadedXRefIntegrityInfo(
out Info: THPDFXRefIntegrityInfo
): boolean;
Configuração
| Membro | Predefinição | Função |
|---|---|---|
XRefRecoveryMode | xrrmOnFailure | Desativa a recuperação, corre-a apenas depois de a análise normal falhar, ou força-a antes da análise normal |
XRefRecoveryMaxScanBytes | 8 GiB | Tamanho máximo de origem aceite pela análise de recuperação fragmentada |
XRefRecoveryMaxObjects | 2.000.000 | Número máximo de candidatos a objetos indiretos validados aceites pela recuperação |
ParserRecoveryEventLimit | 1.024 | Número máximo de eventos estruturados retidos por carregamento, com zero a desativar a retenção de eventos |
Informação de recuperação
GetLoadedXRefRecoveryInfo devolve True quando a recuperação foi tentada e copia o registo THPDFXRefRecoveryInfo mais recente
Statusdistingue sucesso, recuperação desativada, falha de limite de bytes, falha de limite de objetos, falha de limite de âncoras xref e falha estruturalMethodidentifica uma secção xref realocada ou desvios de objetos diretos reconstruídosBytesScanned,CandidateObjectCount,RecoveredObjectCount,DuplicateObjectCount,RejectedCandidateCounteXRefCandidateCountexpõem o trabalho limitado e a qualidade da recuperaçãoSelectedXRefOffsetidentifica a secção realocada quando esse método é bem-sucedidoDiagnosticcontém uma descrição concisa do resultado em inglês
Eventos de recuperação estruturados
GetLoadedParserRecoveryEvents devolve um snapshot propriedade do chamador da stream de eventos retida, enquanto GetLoadedParserRecoveryEvent lê uma entrada sem alocar uma cópia do array
Kinddistingue eventos de tentativa, política, limite, candidato a objeto, candidato a xref, secção selecionada, desvios reconstruídos, sucesso e falhaFirstByteé inclusivo eEndByteé exclusivo, com ambos a-1quando não existe intervalo de origemObjectNumbereGenerationNumberidentificam candidatos a objetos indiretos e usam-1em eventos de nível de documento ou de âncora xrefConfidenceprogride deprcNonepor resultados baixo, médio, alto e verificadoLoadedParserRecoveryEventDroppedCountinforma os eventos omitidos depois do limite de retenção configurado, preservando memória limitada em entradas hostis
Informação de precedência de junção
GetLoadedXRefMergeInfo devolve True quando o carregamento de fluxo xref ou de referência híbrida encontrou estado de junção digno de relato
HybridRevisionCountconta as revisões tradicionais que contribuíram com um fluxo xref lateral através de/XRefStmHybridOverlapCountconta as entradas de tabela já fornecidas pelo fluxo xref da mesma revisão, que tem precedênciaOlderRevisionShadowedEntryCountconta as entradas ignoradas porque uma revisão mais recente já definia esse número de objetoDuplicateEntryCountconta as entradas repetidas dentro da secção não híbrida mais recente- Os dois sinalizadores de precedência indicam se a regra correspondente foi exercida em vez de estar meramente disponível
Informação de integridade
GetLoadedXRefIntegrityInfo reporta a cadeia de lista livre ativa, ligações inválidas, ciclos, entradas livres desligadas, erros de transição de geração, definições ativas duplicadas e entradas mais antigas sombreadas pela revisão mais recente
O detalhe sombreado inclui tipos de entrada ativos e rejeitados, desvios ou campos de armazenamento, gerações e profundidade de revisão, com um teto de detalhe fixo de 256 entradas
Gravar documentos recuperados
Um documento recuperado utiliza sempre o caminho de reescrita completa em SaveLoadedDocument, mesmo quando nenhum objeto foi editado, para que o HotPDF nunca copie bytes de origem danificados como uma saída aparentemente reparada
Exemplo
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;