more
This commit is contained in:
parent
e2afc82188
commit
6f0b8e2f66
|
@ -2913,8 +2913,10 @@ let of_utf8 (f, fontsize) t =
|
||||||
let pdf = Pdf.empty () in
|
let pdf = Pdf.empty () in
|
||||||
let fontdict = Pdftext.write_font pdf f in
|
let fontdict = Pdftext.write_font pdf f in
|
||||||
let extractor = Pdftext.charcode_extractor_of_font pdf (Pdf.Indirect fontdict) in
|
let extractor = Pdftext.charcode_extractor_of_font pdf (Pdf.Indirect fontdict) in
|
||||||
let charcodes = Pdftext.codepoints_of_utf8 t in
|
Pdftext.codepoints_of_utf8 t
|
||||||
implode (map char_of_int (option_map extractor charcodes))
|
|> option_map extractor
|
||||||
|
|> map char_of_int
|
||||||
|
|> implode
|
||||||
|
|
||||||
let typeset text =
|
let typeset text =
|
||||||
let pdf = Pdf.empty () in
|
let pdf = Pdf.empty () in
|
||||||
|
@ -2928,6 +2930,38 @@ let typeset text =
|
||||||
let pdf, pageroot = Pdfpage.add_pagetree pages pdf in
|
let pdf, pageroot = Pdfpage.add_pagetree pages pdf in
|
||||||
Pdfpage.add_root pageroot [] pdf
|
Pdfpage.add_root pageroot [] pdf
|
||||||
|
|
||||||
|
let typeset_table_of_contents pdf =
|
||||||
|
let f = (Pdftext.StandardFont (Pdftext.Courier, Pdftext.WinAnsiEncoding), 10.) in
|
||||||
|
let firstpage = hd (Pdfpage.pages_of_pagetree pdf) in
|
||||||
|
let firstpage_papersize =
|
||||||
|
let width, height =
|
||||||
|
match Pdf.parse_rectangle firstpage.Pdfpage.mediabox with
|
||||||
|
xmin, ymin, xmax, ymax -> (xmax -. xmin, ymax -. ymin)
|
||||||
|
in
|
||||||
|
Pdfpaper.make Pdfunits.PdfPoint width height
|
||||||
|
in
|
||||||
|
let lines =
|
||||||
|
map
|
||||||
|
(fun mark ->
|
||||||
|
[Cpdftype.BeginDest mark.Pdfmarks.target;
|
||||||
|
Cpdftype.HGlue {Cpdftype.glen = float mark.Pdfmarks.level *. 20.; Cpdftype.gstretch = 0.};
|
||||||
|
Cpdftype.Text (of_utf8 f mark.Pdfmarks.text);
|
||||||
|
Cpdftype.EndDest;
|
||||||
|
Cpdftype.NewLine])
|
||||||
|
(Pdfmarks.read_bookmarks pdf)
|
||||||
|
in
|
||||||
|
print_string (Cpdftype.to_string (flatten lines));
|
||||||
|
let toc_pages =
|
||||||
|
Cpdftype.typeset 50. 50. 50. 50. firstpage_papersize pdf
|
||||||
|
([Cpdftype.Font f] @ flatten lines)
|
||||||
|
in
|
||||||
|
let original_pages = Pdfpage.pages_of_pagetree pdf in
|
||||||
|
let changes =
|
||||||
|
let toc_pages_len = length toc_pages in
|
||||||
|
map (fun n -> (n, n + toc_pages_len)) (indx original_pages)
|
||||||
|
in
|
||||||
|
Pdfpage.change_pages ~changes true pdf (toc_pages @ original_pages)
|
||||||
|
|
||||||
(* Main function *)
|
(* Main function *)
|
||||||
let go () =
|
let go () =
|
||||||
match args.op with
|
match args.op with
|
||||||
|
@ -3849,7 +3883,9 @@ let go () =
|
||||||
let pdf = get_single_pdf args.op true in
|
let pdf = get_single_pdf args.op true in
|
||||||
Cpdffont.print_font_table pdf fontname args.copyfontpage
|
Cpdffont.print_font_table pdf fontname args.copyfontpage
|
||||||
| Some TableOfContents ->
|
| Some TableOfContents ->
|
||||||
Printf.printf "Making a table of contents...\n"
|
let pdf = get_single_pdf args.op false in
|
||||||
|
let pdf = typeset_table_of_contents pdf in
|
||||||
|
write_pdf false pdf
|
||||||
| Some (Typeset filename) ->
|
| Some (Typeset filename) ->
|
||||||
let text = Pdfio.bytes_of_input_channel (open_in filename) in
|
let text = Pdfio.bytes_of_input_channel (open_in filename) in
|
||||||
let pdf = typeset text in
|
let pdf = typeset text in
|
||||||
|
|
10
cpdftype.ml
10
cpdftype.ml
|
@ -25,9 +25,9 @@ type element =
|
||||||
| BeginDest of Pdfdest.t
|
| BeginDest of Pdfdest.t
|
||||||
| EndDest
|
| EndDest
|
||||||
|
|
||||||
let string_of_element = function
|
let to_string_elt = function
|
||||||
| Text t -> t
|
| Text t -> t
|
||||||
| HGlue _ -> "HGLUE"
|
| HGlue {glen} -> "HGLUE" ^ string_of_float glen
|
||||||
| VGlue _ -> "VGLUE"
|
| VGlue _ -> "VGLUE"
|
||||||
| NewLine -> "NewLine"
|
| NewLine -> "NewLine"
|
||||||
| NewPage -> "NewPage"
|
| NewPage -> "NewPage"
|
||||||
|
@ -35,6 +35,8 @@ let string_of_element = function
|
||||||
| BeginDest _ -> "BeginDest"
|
| BeginDest _ -> "BeginDest"
|
||||||
| EndDest -> "EndDest"
|
| EndDest -> "EndDest"
|
||||||
|
|
||||||
|
let to_string es = fold_left (fun a b -> a ^ "\n" ^ b) "" (map to_string_elt es)
|
||||||
|
|
||||||
let indent x = HGlue {glen = x; gstretch = 0.}
|
let indent x = HGlue {glen = x; gstretch = 0.}
|
||||||
let newpara x = VGlue {glen = x; gstretch = 0.}
|
let newpara x = VGlue {glen = x; gstretch = 0.}
|
||||||
|
|
||||||
|
@ -216,5 +218,5 @@ let example_pdf () =
|
||||||
let pdf, pageroot = Pdfpage.add_pagetree pages pdf in
|
let pdf, pageroot = Pdfpage.add_pagetree pages pdf in
|
||||||
Pdfpage.add_root pageroot [] pdf
|
Pdfpage.add_root pageroot [] pdf
|
||||||
|
|
||||||
let _ =
|
(*let _ =
|
||||||
Pdfwrite.pdf_to_file (example_pdf ()) "out.pdf"
|
Pdfwrite.pdf_to_file (example_pdf ()) "out.pdf"*)
|
||||||
|
|
|
@ -14,4 +14,6 @@ type element =
|
||||||
|
|
||||||
type t = element list
|
type t = element list
|
||||||
|
|
||||||
|
val to_string : t -> string
|
||||||
|
|
||||||
val typeset : float -> float -> float -> float -> Pdfpaper.t -> Pdf.t -> t -> Pdfpage.t list
|
val typeset : float -> float -> float -> float -> Pdfpaper.t -> Pdf.t -> t -> Pdfpage.t list
|
||||||
|
|
Loading…
Reference in New Issue