More efficient bookmark code

This commit is contained in:
John Whitington 2017-05-28 19:19:17 +01:00
parent 4df6f42474
commit 645be7b342
2 changed files with 24 additions and 15 deletions

21
cpdf.ml
View File

@ -932,15 +932,19 @@ let read_lines input =
(* Verify a list of bookmarks. Positive jumps of > 1 not allowed, no numbers (* Verify a list of bookmarks. Positive jumps of > 1 not allowed, no numbers
smaller than 0. *) smaller than 0. *)
let rec verify_bookmarks pdf lastlevel endpage = function let rec verify_bookmarks pdf lastlevel refnums endpage = function
| [] -> true | [] -> true
| {Pdfmarks.level = level; Pdfmarks.target = target}::more -> | {Pdfmarks.level = level; Pdfmarks.target = target}::more ->
let page = Pdfpage.pagenumber_of_target pdf target in let page = Pdfpage.pagenumber_of_target pdf ~refnums target in
level < lastlevel + 2 && level < lastlevel + 2 &&
level >= 0 && level >= 0 &&
page <= endpage && page <= endpage &&
page >= 0 && page >= 0 &&
verify_bookmarks pdf level endpage more verify_bookmarks pdf level refnums endpage more
let verify_bookmarks pdf lastlevel endpage marks =
let refnums = Pdf.page_reference_numbers pdf in
verify_bookmarks pdf lastlevel refnums endpage marks
(* Parse a line of the bookmarks file. *) (* Parse a line of the bookmarks file. *)
@ -1186,11 +1190,12 @@ let list_bookmarks encoding range pdf output =
| Raw -> s | Raw -> s
in in
let bookmarks = Pdfmarks.read_bookmarks pdf in let bookmarks = Pdfmarks.read_bookmarks pdf in
let refnums = Pdf.page_reference_numbers pdf in
let inrange = let inrange =
keep keep
(function x -> (function x ->
x.Pdfmarks.target = Pdfdest.NullDestination || x.Pdfmarks.target = Pdfdest.NullDestination ||
mem (Pdfpage.pagenumber_of_target pdf x.Pdfmarks.target) range) bookmarks mem (Pdfpage.pagenumber_of_target ~refnums pdf x.Pdfmarks.target) range) bookmarks
in in
iter iter
(function mark -> (function mark ->
@ -1198,7 +1203,7 @@ let list_bookmarks encoding range pdf output =
(Printf.sprintf "%i \"%s\" %i %s\n" (Printf.sprintf "%i \"%s\" %i %s\n"
mark.Pdfmarks.level mark.Pdfmarks.level
(process_string mark.Pdfmarks.text) (process_string mark.Pdfmarks.text)
(Pdfpage.pagenumber_of_target pdf mark.Pdfmarks.target) (Pdfpage.pagenumber_of_target ~refnums pdf mark.Pdfmarks.target)
(if mark.Pdfmarks.isopen then "open" else ""))) (if mark.Pdfmarks.isopen then "open" else "")))
inrange inrange
@ -1223,7 +1228,8 @@ let remove_unsafe_characters s =
| chars -> implode chars | chars -> implode chars
let get_bookmark_name pdf marks splitlevel n _ = let get_bookmark_name pdf marks splitlevel n _ =
match keep (function m -> n = Pdfpage.pagenumber_of_target pdf m.Pdfmarks.target && m.Pdfmarks.level <= splitlevel) marks with let refnums = Pdf.page_reference_numbers pdf in
match keep (function m -> n = Pdfpage.pagenumber_of_target ~refnums pdf m.Pdfmarks.target && m.Pdfmarks.level <= splitlevel) marks with
| {Pdfmarks.text = title}::_ -> remove_unsafe_characters title | {Pdfmarks.text = title}::_ -> remove_unsafe_characters title
| _ -> "" | _ -> ""
@ -1267,9 +1273,10 @@ let stem s =
(* Return list, in order, a *set* of page numbers of bookmarks at a given level *) (* Return list, in order, a *set* of page numbers of bookmarks at a given level *)
let bookmark_pages level pdf = let bookmark_pages level pdf =
let refnums = Pdf.page_reference_numbers pdf in
setify_preserving_order setify_preserving_order
(option_map (option_map
(function l when l.Pdfmarks.level = level -> Some (Pdfpage.pagenumber_of_target pdf l.Pdfmarks.target) | _ -> None) (function l when l.Pdfmarks.level = level -> Some (Pdfpage.pagenumber_of_target ~refnums pdf l.Pdfmarks.target) | _ -> None)
(Pdfmarks.read_bookmarks pdf)) (Pdfmarks.read_bookmarks pdf))
(* Called from cpdflib.ml - different from above *) (* Called from cpdflib.ml - different from above *)

View File

@ -2340,7 +2340,8 @@ let remove_unsafe_characters s =
| chars -> implode chars | chars -> implode chars
let get_bookmark_name pdf marks splitlevel n _ = let get_bookmark_name pdf marks splitlevel n _ =
match keep (function m -> n = Pdfpage.pagenumber_of_target pdf m.Pdfmarks.target && m.Pdfmarks.level <= splitlevel) marks with let refnums = Pdf.page_reference_numbers pdf in
match keep (function m -> n = Pdfpage.pagenumber_of_target ~refnums pdf m.Pdfmarks.target && m.Pdfmarks.level <= splitlevel) marks with
| {Pdfmarks.text = title}::_ -> remove_unsafe_characters title | {Pdfmarks.text = title}::_ -> remove_unsafe_characters title
| _ -> "" | _ -> ""
@ -2406,13 +2407,14 @@ let fast_write_split_pdfs
(* Return list, in order, a *set* of page numbers of bookmarks at a given level *) (* Return list, in order, a *set* of page numbers of bookmarks at a given level *)
let bookmark_pages level pdf = let bookmark_pages level pdf =
setify_preserving_order let refnums = Pdf.page_reference_numbers pdf in
(option_map setify_preserving_order
(function (option_map
l when l.Pdfmarks.level = level -> (function
Some (Pdfpage.pagenumber_of_target pdf l.Pdfmarks.target) l when l.Pdfmarks.level = level ->
| _ -> None) Some (Pdfpage.pagenumber_of_target ~refnums pdf l.Pdfmarks.target)
(Pdfmarks.read_bookmarks pdf)) | _ -> None)
(Pdfmarks.read_bookmarks pdf))
let split_at_bookmarks let split_at_bookmarks
enc original_filename ~squeeze nobble level spec pdf enc original_filename ~squeeze nobble level spec pdf