quickInspect method

PdfSecurityInspectionResult quickInspect(
  1. Uint8List pdfBytes
)

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,
  );
}