importPageRange method

List<PdfPage> importPageRange(
  1. PdfDocumentParser source,
  2. int start,
  3. int end, {
  4. String? label,
})

Imports the page range [start, end], inclusive on both ends.

Implementation

List<PdfPage> importPageRange(
  PdfDocumentParser source,
  int start,
  int end, {
  String? label,
}) {
  if (_finished) {
    throw StateError('A mesclagem já foi encerrada por finish().');
  }

  final refs = source.pageRefs;
  if (start < 0 || start >= refs.length) {
    throw ArgumentError.value(start, 'start', 'Fora do intervalo de páginas');
  }
  if (end < start || end >= refs.length) {
    throw ArgumentError.value(end, 'end', 'Fora do intervalo de páginas');
  }

  _sourceCount++;
  context.beginSource(source, label: label ?? 'documento $_sourceCount');

  try {
    if (source.isEncrypted) {
      throw PdfMergeException(
        'O documento "${context.sourceLabel}" está criptografado. '
        'A leitura de PDFs criptografados ainda não é suportada, e mesclar '
        'sem descriptografar produziria conteúdo corrompido.',
      );
    }

    _signatures.inspectSource();

    final imported = <PdfPage>[];

    // First pass: every page of the range. Only once the page map is
    // complete can destinations and `/P` be resolved.
    for (var index = start; index <= end; index++) {
      final ref = refs[index];
      final dict = _pageDict(source, ref);
      if (dict == null) {
        context.warn('página ${index + 1} não pôde ser lida e foi ignorada');
        continue;
      }
      context.importedSourcePages.add(index);
      imported.add(
        context.options.mode == PdfMergeMode.flatten
            ? _flatten.import(ref, dict)
            : _pages.import(ref, dict),
      );
    }

    // Second pass.
    if (context.options.mode != PdfMergeMode.flatten) {
      for (var index = start; index <= end; index++) {
        final ref = refs[index];
        final page = context.pageMap[ref.obj];
        final dict = _pageDict(source, ref);
        if (page == null || dict == null) continue;
        _annotations.importPageAnnotations(page, dict);
      }

      _forms.importSource();
      _outlines.importSource();
      _catalog.mergeSource(isFirstSource: _sourceCount == 1);
    }

    return imported;
  } finally {
    context.endSource();
  }
}