Propiedad THotPDF.DecodeBudgetBytes

Establece la cantidad agregada máxima de bytes aceptada 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, o 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 de respaldo

Diagnósticos

GetLastDecodeBudgetInfo devuelve el límite más reciente de la cadena, los bytes decodificados aceptados, la etapa más grande, la cantidad de filtros, el estado del límite y el filtro que excedió 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 al menos un filtro haya sido decodificado por la instancia del documento

Comportamiento ante fallos

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

Establezca DecodeBudgetBytes en cero solo para entradas confiables que requieran expansión ilimitada por cadena; los valores negativos generan 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);
}

APIs relacionadas