Propriedade THotPDF.DecodeBudgetBytes
Define o número máximo agregado de bytes aceitos de todos os estágios de decodificação em uma 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);
Padrão
268435456 bytes, ou 256 MiB
Contabilidade agregada
Cada filtro genérico grava por meio de um fluxo delimitado antes que os dados atinjam seu fluxo de memória de suporte
- Uma cadeia como
[/ASCII85Decode /FlateDecode]consome a saída ASCII85 mais a saída Flate de um orçamento compartilhado - Os filtros genéricos suportados incluem
FlateDecode,LZWDecode,ASCIIHexDecode,ASCII85DecodeeRunLengthDecode, incluindo suas abreviações em PDF - A saída do predictor de imagem compartilha o mesmo orçamento que os filtros de imagem genéricos anteriores
- A entrada codificada original não é cobrada porque o orçamento mede a expansão produzida pela decodificação
- Cada cadeia de fluxo independente começa com um orçamento novo por cadeia, enquanto
DocumentDecodeBudgetBytesfornece o teto separado em nível de documento
Diagnósticos
GetLastDecodeBudgetInfo retorna o limite da cadeia mais recente, os bytes decodificados aceitos, o maior estágio, a contagem de filtros, o status 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 retorna False até que pelo menos um filtro tenha sido decodificado pela instância do documento
Comportamento de falha
A decodificação de baixo nível levanta EHPDFDecodeBudgetError quando um estágio excede o orçamento agregado; métodos de leitura de alto nível que já relatam falha por meio de False ou nil preservam esse contrato enquanto GetLastDecodeBudgetInfo expõe o motivo
Defina DecodeBudgetBytes como zero apenas para entradas confiáveis que exigem expansão ilimitada por cadeia; valores negativos levantam ERangeError
Exemplo 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 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);
}