Propriedade THotPDF.DecodeBudgetBytes
Define o número máximo agregado de bytes aceite de todas as fases de descodificação numa 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);
Predefinição
268435456 bytes, ou 256 MiB
Contabilística agregada
Cada filtro genérico escreve através de um fluxo limitado antes de os dados chegarem ao seu fluxo de memória de suporte
- Uma cadeia como
[/ASCII85Decode /FlateDecode]consome a saída ASCII85 mais a saída Flate a partir de um orçamento partilhado - Os filtros genéricos suportados incluem
FlateDecode,LZWDecode,ASCIIHexDecode,ASCII85DecodeeRunLengthDecode, incluindo as suas abreviações PDF - A saída do preditor de imagem partilha o mesmo orçamento que os filtros de imagem genéricos precedentes
- A entrada codificada original não é cobrada porque o orçamento mede a expansão produzida pela descodificação
- Cada cadeia de fluxo independente começa com um orçamento novo por cadeia, enquanto
DocumentDecodeBudgetBytesfornece o teto separado ao nível do documento
Diagnósticos
GetLastDecodeBudgetInfo devolve o limite mais recente da cadeia, bytes descodificados aceites, maior fase, contagem de filtros, estado 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 devolve False até que pelo menos um filtro tenha sido descodificado pela instância do documento
Comportamento de falha
A descodificação de baixo nível levanta EHPDFDecodeBudgetError quando uma fase excede o orçamento agregado; os métodos de leitura de alto nível que já reportam falha através de False ou nil preservam esse contrato enquanto GetLastDecodeBudgetInfo expõe o motivo
Defina DecodeBudgetBytes como zero apenas para entradas fidedignas que requerem expansão ilimitada por cadeia; valores negativos levantam ERangeError
Exemplo em 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 em 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);
}