parse static method

UPdfCff? parse(
  1. Uint8List bytes
)

Implementation

static UPdfCff? parse(Uint8List bytes) {
  try {
    if (bytes.length < 4) return null;
    final int headerSize = bytes[2];
    final UDocCursor cursor = UDocCursor(bytes, start: headerSize);
    UPdfIndex.read(cursor);
    final UDocCursor topCursor = UDocCursor(bytes, start: cursor.position);
    final UPdfIndex topDicts = UPdfIndex.read(topCursor);
    final UDocCursor stringCursor = UDocCursor(bytes, start: topCursor.position);
    final UPdfIndex strings = UPdfIndex.read(stringCursor);
    final UDocCursor globalCursor = UDocCursor(bytes, start: stringCursor.position);
    final UPdfIndex globalSubrs = UPdfIndex.read(globalCursor);
    if (topDicts.count == 0) return null;
    final Map<int, List<num>> top = _readDict(topDicts[0]);
    final int charStringsOffset = (top[17]?.first ?? 0).toInt();
    if (charStringsOffset <= 0 || charStringsOffset >= bytes.length) return null;
    final UPdfIndex charStrings = UPdfIndex.read(UDocCursor(bytes, start: charStringsOffset));
    final bool isCid = top.containsKey(1230);
    final List<double> matrix = top[1207] != null && top[1207]!.length >= 6 ? top[1207]!.map((num value) => value.toDouble()).toList() : <double>[0.001, 0, 0, 0.001, 0, 0];
    UPdfIndex localSubrs = UPdfIndex(const <int>[], Uint8List(0), 0);
    double defaultWidthX = 0;
    double nominalWidthX = 0;
    final List<num>? privateEntry = top[18];
    if (privateEntry != null && privateEntry.length >= 2) {
      final int privateSize = privateEntry[0].toInt();
      final int privateOffset = privateEntry[1].toInt();
      if (privateOffset > 0 && privateOffset + privateSize <= bytes.length) {
        final Map<int, List<num>> private = _readDict(Uint8List.sublistView(bytes, privateOffset, privateOffset + privateSize));
        defaultWidthX = (private[20]?.first ?? 0).toDouble();
        nominalWidthX = (private[21]?.first ?? 0).toDouble();
        final int subrsOffset = (private[19]?.first ?? 0).toInt();
        if (subrsOffset > 0 && privateOffset + subrsOffset < bytes.length) localSubrs = UPdfIndex.read(UDocCursor(bytes, start: privateOffset + subrsOffset));
      }
    }
    final List<int> charsetIds = _readCharset(bytes, (top[15]?.first ?? 0).toInt(), charStrings.count);
    final List<int> fdSelect = <int>[];
    final List<UPdfIndex> fdLocalSubrs = <UPdfIndex>[];
    if (isCid) {
      final int fdArrayOffset = (top[1236]?.first ?? 0).toInt();
      final int fdSelectOffset = (top[1237]?.first ?? 0).toInt();
      if (fdArrayOffset > 0 && fdArrayOffset < bytes.length) {
        final UPdfIndex fdArray = UPdfIndex.read(UDocCursor(bytes, start: fdArrayOffset));
        for (int i = 0; i < fdArray.count; i++) {
          final Map<int, List<num>> fontDict = _readDict(fdArray[i]);
          final List<num>? fdPrivate = fontDict[18];
          UPdfIndex subrs = UPdfIndex(const <int>[], Uint8List(0), 0);
          if (fdPrivate != null && fdPrivate.length >= 2) {
            final int size = fdPrivate[0].toInt();
            final int offset = fdPrivate[1].toInt();
            if (offset > 0 && offset + size <= bytes.length) {
              final Map<int, List<num>> private = _readDict(Uint8List.sublistView(bytes, offset, offset + size));
              final int subrsOffset = (private[19]?.first ?? 0).toInt();
              if (subrsOffset > 0 && offset + subrsOffset < bytes.length) subrs = UPdfIndex.read(UDocCursor(bytes, start: offset + subrsOffset));
            }
          }
          fdLocalSubrs.add(subrs);
        }
      }
      if (fdSelectOffset > 0 && fdSelectOffset < bytes.length) fdSelect.addAll(_readFdSelect(bytes, fdSelectOffset, charStrings.count));
    }
    return UPdfCff._(charStrings, globalSubrs, localSubrs, charsetIds, isCid, fdSelect, fdLocalSubrs, matrix, strings, defaultWidthX, nominalWidthX);
  } on Object {
    return null;
  }
}