diff --git a/cpdftoc.ml b/cpdftoc.ml index 9534063..c4fc88b 100644 --- a/cpdftoc.ml +++ b/cpdftoc.ml @@ -126,7 +126,6 @@ let remove_parent_tree_next_key pdf = end | _ -> () -(* FIXME Again relies upon there being an existing structure tree. Fix. *) (* FIXME Again, replace_chain would be much better here if it could deal with a final indirect. *) let add_to_parent_tree pdf p = match Pdf.lookup_chain pdf (Pdf.lookup_obj pdf pdf.Pdf.root) ["/StructTreeRoot"; "/ParentTree"] with @@ -146,12 +145,25 @@ let add_to_parent_tree pdf p = n | None -> 0 +(* Make sure that there is an existing structure tree suitable for us to merge + into. Check for /StructTreeRoot. If there, nothing to do. Otherwise, build + <>. ParentTree and K actually + optional, but it's easier if we assume they are there. *) +let ensure_minimal_struct_tree pdf = + match Pdf.lookup_chain pdf (Pdf.lookup_obj pdf pdf.Pdf.root) ["/StructTreeRoot"] with + | Some _ -> () + | None -> + let pt = Pdf.addobj pdf (Pdf.Dictionary [("/Nums", Pdf.Array [])]) in + let str = Pdf.Dictionary [("/Type", Pdf.Name "/StructTreeRoot"); ("/ParentTree", Pdf.Indirect pt); ("/K", Pdf.Array [])] in + Pdf.addobj_given_num pdf (pdf.Pdf.root, (Pdf.add_dict_entry (Pdf.lookup_obj pdf pdf.Pdf.root) "/StructTreeRoot" str)) + (* Typeset a table of contents with given font, font size and title. Mediabox (and CropBox) copied from first page of existing PDF. Margin of 10% inside CropBox. Font size of title twice body font size. Null page labels added for TOC, others bumped up and so preserved. *) let typeset_table_of_contents ~font ~fontsize ~title ~bookmark ~dotleader ~process_struct_tree pdf = let optional l = if process_struct_tree then l else [] in + if process_struct_tree then ensure_minimal_struct_tree pdf; Hashtbl.clear width_table_cache; let marks = Pdfmarks.read_bookmarks pdf in if marks = [] then (Pdfe.log "No bookmarks, not making table of contents\n"; pdf) else diff --git a/cpdftype.ml b/cpdftype.ml index b64c9a9..16b5e99 100644 --- a/cpdftype.ml +++ b/cpdftype.ml @@ -5,6 +5,11 @@ For now, this is just an experiment for -table-of-contents and -typeset. To be continued... *) +(* At the moment, structure tree support is limited. Cpdftoc.ml and + Cpdftexttopdf do it by post-processing. We need to fix this, which might + involve returning more than just a list of pages, but in fact working on the + document. *) + open Pdfutil (* Main type *)