quickInspect method
Implementation
PdfSecurityInspectionResult quickInspect(Uint8List pdfBytes) {
final quick = PdfQuickInfo.fromBytes(pdfBytes);
final ranges = PdfParserMisc.findAllByteRangesFromBytes(pdfBytes);
var startXref = PdfParserXref.findStartXref(pdfBytes);
final subFilters = _extractSubFilters(pdfBytes);
final supportedSubFilters = subFilters.every(_isSupportedSubFilter);
final hasValidByteRanges = ranges.every((range) {
return _isByteRangeValid(pdfBytes.length, range);
});
final issues = <String>[];
if (!quick.hasPdfHeader) issues.add('Cabecalho %PDF- ausente.');
if (!quick.hasEofMarker) issues.add('Marcador %%EOF ausente.');
if (startXref <= 0) {
final repairedXref = _findFallbackXrefOffset(pdfBytes);
if (repairedXref > 0) {
startXref = repairedXref;
issues.add(
'startxref ausente ou invalido; xref localizado por varredura (modo reparo).',
);
} else {
issues.add('startxref ausente ou invalido.');
}
}
if (startXref >= pdfBytes.length) {
issues.add('startxref fora dos limites do arquivo.');
}
if (!hasValidByteRanges) {
issues.add('ByteRange inconsistente com o tamanho do arquivo.');
}
if (quick.hasSignatures && subFilters.isEmpty) {
issues.add('SubFilter ausente em assinatura PDF.');
}
if (!supportedSubFilters) {
issues.add('SubFilter não suportado detectado.');
}
if (ranges.isNotEmpty) {
final last = ranges.last;
final end = last[2] + last[3];
if (pdfBytes.length > end) {
issues.add(
'Dados extras após ByteRange final (possível alteração).',
);
}
}
final isCorrupted = issues.isNotEmpty;
return PdfSecurityInspectionResult(
isPdf: quick.hasPdfHeader,
isEncrypted: quick.isEncrypted,
isSigned: quick.hasSignatures,
isCorrupted: isCorrupted,
signatureCount: ranges.length,
pdfVersion: quick.pdfVersion,
startXref: startXref,
hasEofMarker: quick.hasEofMarker,
hasValidByteRanges: hasValidByteRanges,
issues: List.unmodifiable(issues),
subFilters: List.unmodifiable(subFilters),
supportedSubFilters: supportedSubFilters,
allSignaturesIntact: null,
sha256Hex: null,
);
}