O pdfid aparentemente está fazendo um péssimo trabalho na contagem dos pares obj / endobj - em seu exemplo particular, o "obj" ímpar é parte de um fluxo FlateDecode:
$ cat pdf.pl
use Compress::Zlib qw(inflateInit Z_STREAM_END);
use strict;
my ($o);
while(<>){
$o -= s/\bendobj\b//g;
$o += s/\b\d+\s+\d+\s+obj\b//g;
if(/\bstream\s*$/){
local $/ = "endstream"; my $s = <>; $s =~ s/\s*endstream$//;
if($s =~ /(\w*obj)/){
my ($d, $err) = inflateInit->inflate($s);
if(length($s) == 0 && $err == Z_STREAM_END){
warn "innocuous '$1' in well formed stream\n";
}else{
warn "WARNING: inflateInit: $err\n";
}
}
}
if(/(\w*obj)\b/){ warn "WARNING: possible stray $1\n" }
}
warn "WARNING: unbalanced obj/endobj: $o\n" if $o;
$ perl pdf.pl using-freedos-24.pdf
innocuous 'obj' in well formed stream
Nota: pouco é para ilustrar o problema em questão; não use para verificar se um pdf é seguro; -)
O formato pdf é bastante desagradável & complexo; você realmente precisa de um analisador completo para entender sua estrutura. E um programa capaz de fazer isso (para identificar corretamente os arquivos maliciosos) está se tornando um vetor de ataque em si - não há razão para acreditar que um analisador ad-hoc é mais seguro que libpoppler ou libmupdf.