Propriedade THotPDF.DecodeBudgetBytes

Define o número máximo agregado de bytes aceitos de todos os estágios de decodificação em uma 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);

Padrão

268435456 bytes, ou 256 MiB

Contabilidade agregada

Cada filtro genérico grava por meio de um fluxo delimitado antes que os dados atinjam seu fluxo de memória de suporte

Diagnósticos

GetLastDecodeBudgetInfo retorna o limite da cadeia mais recente, os bytes decodificados aceitos, o maior estágio, a contagem de filtros, o status 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 retorna False até que pelo menos um filtro tenha sido decodificado pela instância do documento

Comportamento de falha

A decodificação de baixo nível levanta EHPDFDecodeBudgetError quando um estágio excede o orçamento agregado; métodos de leitura de alto nível que já relatam falha por meio de False ou nil preservam esse contrato enquanto GetLastDecodeBudgetInfo expõe o motivo

Defina DecodeBudgetBytes como zero apenas para entradas confiáveis que exigem expansão ilimitada por cadeia; valores negativos levantam ERangeError

Exemplo 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 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