Propriedade THotPDF.DecodeBudgetBytes

Define o número máximo agregado de bytes aceite de todas as fases de descodificação numa cadeia de filtros de fluxo PDF

Declarações

// Delphi
property DecodeBudgetBytes: Int64;
function GetLastDecodeBudgetInfo(
  out AInfo: THPDFDecodeBudgetInfo): Boolean;

// C++Builder
__property __int64 DecodeBudgetBytes;
bool __fastcall GetLastDecodeBudgetInfo(
  THPDFDecodeBudgetInfo &AInfo);

Predefinição

268435456 bytes, ou 256 MiB

Contabilística agregada

Cada filtro genérico escreve através de um fluxo limitado antes de os dados chegarem ao seu fluxo de memória de suporte

Diagnósticos

GetLastDecodeBudgetInfo devolve o limite mais recente da cadeia, bytes descodificados aceites, maior fase, contagem de filtros, estado do limite e o filtro que excedeu o limite

THPDFDecodeBudgetInfo = record
  LimitBytes: Int64;
  DecodedBytes: Int64;
  PeakStageBytes: Int64;
  FilterCount: Integer;
  Exceeded: Boolean;
  ExceededFilter: AnsiString;
end;

O método devolve False até que pelo menos um filtro tenha sido descodificado pela instância do documento

Comportamento de falha

A descodificação de baixo nível levanta EHPDFDecodeBudgetError quando uma fase excede o orçamento agregado; os métodos de leitura de alto nível que já reportam falha através de False ou nil preservam esse contrato enquanto GetLastDecodeBudgetInfo expõe o motivo

Defina DecodeBudgetBytes como zero apenas para entradas fidedignas que requerem expansão ilimitada por cadeia; valores negativos levantam ERangeError

Exemplo em Delphi

PDF.DecodeBudgetBytes := 64 * 1024 * 1024;
if not PDF.ExtractEmbeddedFileBytes('payload.bin', Bytes) then
  if PDF.GetLastDecodeBudgetInfo(Info) and Info.Exceeded then
    Writeln('Decode limit reached in ', Info.ExceededFilter);

Exemplo em C++Builder

pdf->DecodeBudgetBytes = 64LL * 1024 * 1024;
if (!pdf->ExtractEmbeddedFileBytes("payload.bin", bytes)) {
    THPDFDecodeBudgetInfo info;
    if (pdf->GetLastDecodeBudgetInfo(info) && info.Exceeded)
        ShowMessage("Decode limit reached in " + info.ExceededFilter);
}

APIs relacionadas