Skip to content

Combined PDF has no outline #611

@remarkked

Description

@remarkked

When creating a combined PDF (actually, creating a document from another document by cutting some pages), the result contains no bookmarks.

Code sample:

import 'dart:async';

import 'package:flutter/material.dart';
import 'package:pdfrx/pdfrx.dart';

void main() async {
  WidgetsFlutterBinding.ensureInitialized();
  runApp(MyApp());
}

class MyApp extends StatelessWidget {
  MyApp({super.key});
  final Future<void> operatorManualLoadFuture = loadPdf();

  @override
  Widget build(context) => MaterialApp(
    debugShowCheckedModeBanner: false,
    home: Center(
      child: FutureBuilder(
        future: operatorManualLoadFuture,
        builder: (context, snapshot) => snapshot.connectionState != ConnectionState.done ? CircularProgressIndicator() : const SizedBox(),
      ),
    ),
  );
}

final PdfDocumentRef pdfDocumentRef = PdfDocumentRefAsset("assets/manual.pdf");

Future<void> loadPdf() async => await pdfDocumentRef.resolveListenable().load().then((pdfDownloadReport) => PdfDocument.openAsset(pdfDocumentRef.sourceName).then((pdfDocument) => pdfCut(pdfDocument)));

void pdfCut(PdfDocument pdfDocument) async {
  final List<int> newPagesIndices = List.generate(pdfDocument.pages.length, (j) => j)..removeWhere((pageIndex) =>
  (pageIndex > 10)
  );

  final cuttedDoc = await PdfDocument.createNew(sourceName: 'combined.pdf');
  cuttedDoc.pages = [
    for (int i in newPagesIndices) pdfDocument.pages[i]
  ];
  // Encode to PDF
  final bytes = await cuttedDoc.encodePdf();
  print("Original pdf bookmarks length: ${getBookmarksList(await pdfDocument.loadOutline(), 0).toList().length}");
  print("Combined pdf bookmarks length: ${getBookmarksList(await cuttedDoc.loadOutline(), 0).toList().length}");
}

Iterable<({PdfOutlineNode node, int level})> getBookmarksList(List<PdfOutlineNode>? outline, int level) sync* {
  if (outline == null) return;
  for (var node in outline)
  {
    yield (node: node, level: level);
    yield* getBookmarksList(node.children, level + 1);
  }
}

Output:
Original pdf bookmarks length: 36
Combined pdf bookmarks length: 0

Am I missing something?

Metadata

Metadata

Assignees

No one assigned

    Labels

    documentationImprovements or additions to documentationexample

    Projects

    No projects

    Milestone

    No milestone

    Relationships

    None yet

    Development

    No branches or pull requests

    Issue actions