Rebuild outlines in pdf_output by remapping bookmarks from pdf_input.
(pdf_input, pdf_output, pages)
| 190 | |
| 191 | |
| 192 | def rebuild_outlines(pdf_input, pdf_output, pages): |
| 193 | """Rebuild outlines in pdf_output by remapping bookmarks from pdf_input.""" |
| 194 | remapper = OutlineRemapper(pdf_input, pdf_output, pages) |
| 195 | # preserve first-appearance order of source files, deduplicated |
| 196 | ordered_file_indices = list(dict.fromkeys(row.nfile - 1 for row in pages)) |
| 197 | with pdf_output.open_outline() as new_outline: |
| 198 | for file_idx in ordered_file_indices: |
| 199 | source_pdf = pdf_input[file_idx] |
| 200 | if source_pdf is None or pikepdf.Name.Outlines not in source_pdf.Root: |
| 201 | continue |
| 202 | try: |
| 203 | with source_pdf.open_outline() as source_outline: |
| 204 | copier = OutlineCopier(remapper, file_idx) |
| 205 | for item in source_outline.root: |
| 206 | copier.copy_item(item, new_outline.root) |
| 207 | except pikepdf.PdfError as e: |
| 208 | warnings.warn( |
| 209 | f"Failed to copy bookmarks from document {file_idx + 1}: {e}" |
| 210 | ) |
| 211 | if remapper.new_named_dests: |
| 212 | write_named_dests(pdf_output, remapper.new_named_dests) |