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
- Una cadena como
[/ASCII85Decode /FlateDecode]consume la salida de ASCII85 más la salida de Flate a partir de un presupuesto compartido - Los filtros genéricos admitidos incluyen
FlateDecode,LZWDecode,ASCIIHexDecode,ASCII85DecodeyRunLengthDecode, incluidas sus abreviaturas PDF - La salida del predictor de imagen comparte el mismo presupuesto que los filtros de imagen genéricos precedentes
- La entrada codificada original no se carga porque el presupuesto mide la expansión producida por la decodificación
- Cada cadena de flujo independiente comienza con un presupuesto nuevo por cadena, mientras que
DocumentDecodeBudgetBytessuministra el techo independiente a nivel de documento
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);
}