Propiedad THotPDF.DecodeBudgetBytes

Establece el número máximo agregado de bytes aceptados de todas las etapas de decodificación en una cadena de filtros de flujo PDF

Declaraciones

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

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

Predeterminado

268435456 bytes, es decir, 256 MiB

Contabilidad agregada

Cada filtro genérico escribe a través de un flujo acotado antes de que los datos lleguen a su flujo de memoria subyacente

Diagnósticos

GetLastDecodeBudgetInfo devuelve el límite más reciente de la cadena, los bytes decodificados aceptados, la etapa mayor, el número de filtros, el estado del límite y el filtro que superó el límite

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

El método devuelve False hasta que la instancia del documento haya decodificado al menos un filtro

Comportamiento ante fallos

La decodificación de bajo nivel lanza EHPDFDecodeBudgetError cuando una etapa supera el presupuesto agregado; los métodos de lectura de alto nivel que ya notifican el fallo mediante False o nil conservan ese contrato mientras GetLastDecodeBudgetInfo expone el motivo

Establezca DecodeBudgetBytes a cero únicamente para entradas de confianza que requieran expansión ilimitada por cadena; los valores negativos lanzan ERangeError

Ejemplo en 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);

Ejemplo en 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);
}

API relacionadas