importPageRange method
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();
}
}