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
- Una cadena como
[/ASCII85Decode /FlateDecode]consume la salida ASCII85 más la salida Flate de un solo 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 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);
}