Tag and title images
This commit is contained in:
parent
56a68c57cb
commit
e6c34277cf
|
@ -543,7 +543,8 @@ type args =
|
||||||
mutable jbig2_lossy_threshold : float;
|
mutable jbig2_lossy_threshold : float;
|
||||||
mutable extract_stream_decompress : bool;
|
mutable extract_stream_decompress : bool;
|
||||||
mutable verify_single : string option;
|
mutable verify_single : string option;
|
||||||
mutable draw_struct_tree : bool}
|
mutable draw_struct_tree : bool;
|
||||||
|
mutable image_title : string option}
|
||||||
|
|
||||||
let args =
|
let args =
|
||||||
{op = None;
|
{op = None;
|
||||||
|
@ -679,7 +680,8 @@ let args =
|
||||||
jbig2_lossy_threshold = 0.85;
|
jbig2_lossy_threshold = 0.85;
|
||||||
extract_stream_decompress = false;
|
extract_stream_decompress = false;
|
||||||
verify_single = None;
|
verify_single = None;
|
||||||
draw_struct_tree = false}
|
draw_struct_tree = false;
|
||||||
|
image_title = None}
|
||||||
|
|
||||||
(* Do not reset original_filename or cpdflin or was_encrypted or
|
(* Do not reset original_filename or cpdflin or was_encrypted or
|
||||||
was_decrypted_with_owner or recrypt or producer or creator or path_to_* or
|
was_decrypted_with_owner or recrypt or producer or creator or path_to_* or
|
||||||
|
@ -803,7 +805,8 @@ let reset_arguments () =
|
||||||
args.extract_stream_decompress <- false;
|
args.extract_stream_decompress <- false;
|
||||||
clear Cpdfdrawcontrol.fontpack_initialised;
|
clear Cpdfdrawcontrol.fontpack_initialised;
|
||||||
args.verify_single <- None;
|
args.verify_single <- None;
|
||||||
args.draw_struct_tree <- false
|
args.draw_struct_tree <- false;
|
||||||
|
args.image_title <- None
|
||||||
|
|
||||||
(* Prefer a) the one given with -cpdflin b) a local cpdflin, c) otherwise assume
|
(* Prefer a) the one given with -cpdflin b) a local cpdflin, c) otherwise assume
|
||||||
installed at a system place *)
|
installed at a system place *)
|
||||||
|
@ -2825,7 +2828,8 @@ let specs =
|
||||||
("-use", Arg.String Cpdfdrawcontrol.usexobj, " Use a saved sequence of graphics operators");
|
("-use", Arg.String Cpdfdrawcontrol.usexobj, " Use a saved sequence of graphics operators");
|
||||||
("-draw-jpeg", Arg.String Cpdfdrawcontrol.addjpeg, " Load a JPEG from file and name it");
|
("-draw-jpeg", Arg.String Cpdfdrawcontrol.addjpeg, " Load a JPEG from file and name it");
|
||||||
("-draw-png", Arg.String Cpdfdrawcontrol.addpng, " Load a PNG from file and name it");
|
("-draw-png", Arg.String Cpdfdrawcontrol.addpng, " Load a PNG from file and name it");
|
||||||
("-image", Arg.String Cpdfdrawcontrol.addimage, " Draw an image which has already been loaded");
|
("-image", Arg.String (fun s -> Cpdfdrawcontrol.addimage ?title:args.image_title s), " Draw an image which has already been loaded");
|
||||||
|
("-image-title", Arg.String (fun s -> args.image_title <- Some s), " Give title for future images");
|
||||||
("-fill-opacity", Arg.Float Cpdfdrawcontrol.addopacity, " Set opacity");
|
("-fill-opacity", Arg.Float Cpdfdrawcontrol.addopacity, " Set opacity");
|
||||||
("-stroke-opacity", Arg.Float Cpdfdrawcontrol.addsopacity, " Set stroke opacity");
|
("-stroke-opacity", Arg.Float Cpdfdrawcontrol.addsopacity, " Set stroke opacity");
|
||||||
("-bt", Arg.Unit Cpdfdrawcontrol.addbt, " Begin text");
|
("-bt", Arg.Unit Cpdfdrawcontrol.addbt, " Begin text");
|
||||||
|
|
31
cpdfdraw.ml
31
cpdfdraw.ml
|
@ -34,7 +34,7 @@ type drawops =
|
||||||
| FormXObject of float * float * float * float * string * drawops list
|
| FormXObject of float * float * float * float * string * drawops list
|
||||||
| Use of string
|
| Use of string
|
||||||
| ImageXObject of string * Pdf.pdfobject
|
| ImageXObject of string * Pdf.pdfobject
|
||||||
| Image of string
|
| Image of string * string option
|
||||||
| NewPage
|
| NewPage
|
||||||
| Opacity of float
|
| Opacity of float
|
||||||
| SOpacity of float
|
| SOpacity of float
|
||||||
|
@ -202,7 +202,7 @@ let mcpage = ref ~-1
|
||||||
type structdata =
|
type structdata =
|
||||||
| StDataBeginTree of string
|
| StDataBeginTree of string
|
||||||
| StDataEndTree
|
| StDataEndTree
|
||||||
| StDataMCID of string * int
|
| StDataMCID of string * int * string option
|
||||||
| StDataPage of int
|
| StDataPage of int
|
||||||
|
|
||||||
let structdata = ref []
|
let structdata = ref []
|
||||||
|
@ -251,10 +251,12 @@ let rec ops_of_drawop dryrun pdf endpage filename bates batespad num page = func
|
||||||
let pdfname = try fst (Hashtbl.find (res ()).form_xobjects n) with _ -> error ("Form XObject not found: " ^ n) in
|
let pdfname = try fst (Hashtbl.find (res ()).form_xobjects n) with _ -> error ("Form XObject not found: " ^ n) in
|
||||||
(res ()).page_names <- pdfname::(res ()).page_names;
|
(res ()).page_names <- pdfname::(res ()).page_names;
|
||||||
[Pdfops.Op_Do pdfname]
|
[Pdfops.Op_Do pdfname]
|
||||||
| Image s ->
|
| Image (s, t) ->
|
||||||
|
let m = mcid () in
|
||||||
|
if not dryrun then structdata := StDataMCID ("/Figure", m, t)::!structdata;
|
||||||
let pdfname = try fst (Hashtbl.find (res ()).images s) with _ -> error ("Image not found: " ^ s) in
|
let pdfname = try fst (Hashtbl.find (res ()).images s) with _ -> error ("Image not found: " ^ s) in
|
||||||
(res ()).page_names <- pdfname::(res ()).page_names;
|
(res ()).page_names <- pdfname::(res ()).page_names;
|
||||||
[Pdfops.Op_Do pdfname]
|
[Pdfops.Op_BDC ("/Figure", Pdf.Dictionary ["/MCID", Pdf.Integer m]); Pdfops.Op_Do pdfname; Pdfops.Op_EMC]
|
||||||
| ImageXObject (s, obj) ->
|
| ImageXObject (s, obj) ->
|
||||||
Hashtbl.replace (res ()).images s (fresh_name "/I", Pdf.addobj pdf obj);
|
Hashtbl.replace (res ()).images s (fresh_name "/I", Pdf.addobj pdf obj);
|
||||||
[]
|
[]
|
||||||
|
@ -310,7 +312,7 @@ let rec ops_of_drawop dryrun pdf endpage filename bates batespad num page = func
|
||||||
[]
|
[]
|
||||||
| TextSection ops ->
|
| TextSection ops ->
|
||||||
let m = mcid () in
|
let m = mcid () in
|
||||||
if not dryrun then structdata := StDataMCID ("/P", m)::!structdata;
|
if not dryrun then structdata := StDataMCID ("/P", m, None)::!structdata;
|
||||||
[Pdfops.Op_BDC ("/P", Pdf.Dictionary ["/MCID", Pdf.Integer m]);
|
[Pdfops.Op_BDC ("/P", Pdf.Dictionary ["/MCID", Pdf.Integer m]);
|
||||||
Pdfops.Op_BT]
|
Pdfops.Op_BT]
|
||||||
@ ops_of_drawops dryrun pdf endpage filename bates batespad num page ops @
|
@ ops_of_drawops dryrun pdf endpage filename bates batespad num page ops @
|
||||||
|
@ -445,7 +447,7 @@ let dryrun ~filename ~bates ~batespad range pdf chunks =
|
||||||
|
|
||||||
type st =
|
type st =
|
||||||
StMCID of int
|
StMCID of int
|
||||||
| StItem of {kind : string; pageobjnum : int; children : st list}
|
| StItem of {kind : string; pageobjnum : int; alt : string option; children : st list}
|
||||||
|
|
||||||
(* Build a tree from the MCIDs and structure tree instructions gathered *)
|
(* Build a tree from the MCIDs and structure tree instructions gathered *)
|
||||||
let make_structure_tree pdf items =
|
let make_structure_tree pdf items =
|
||||||
|
@ -458,8 +460,8 @@ let make_structure_tree pdf items =
|
||||||
in
|
in
|
||||||
(* Process the items, making the st list tree data structure *)
|
(* Process the items, making the st list tree data structure *)
|
||||||
let process = function
|
let process = function
|
||||||
| StDataMCID (n, mcid) ->
|
| StDataMCID (n, mcid, alt) ->
|
||||||
items_out =| StItem {kind = n; pageobjnum = unopt (lookup !pagenum pageobjnums); children = [StMCID mcid]}
|
items_out =| StItem {kind = n; alt; pageobjnum = unopt (lookup !pagenum pageobjnums); children = [StMCID mcid]}
|
||||||
| StDataPage n ->
|
| StDataPage n ->
|
||||||
pagenum := n
|
pagenum := n
|
||||||
| _ -> ()
|
| _ -> ()
|
||||||
|
@ -481,14 +483,19 @@ let write_structure_tree pdf st =
|
||||||
let struct_tree_root = Pdf.addobj pdf Pdf.Null in
|
let struct_tree_root = Pdf.addobj pdf Pdf.Null in
|
||||||
let items =
|
let items =
|
||||||
map
|
map
|
||||||
(function StItem {kind; pageobjnum; children} ->
|
(function StItem {kind; pageobjnum; alt; children} ->
|
||||||
let this_objnum = Pdf.addobj pdf Pdf.Null in
|
let this_objnum = Pdf.addobj pdf Pdf.Null in
|
||||||
let this_obj =
|
let alt =
|
||||||
Pdf.Dictionary [("/S", Pdf.Name kind);
|
match alt with
|
||||||
|
| Some s -> [("/Alt", Pdf.String s)]
|
||||||
|
| None -> []
|
||||||
|
in
|
||||||
|
let this_obj =
|
||||||
|
Pdf.Dictionary (alt @ [("/S", Pdf.Name kind);
|
||||||
("/Pg", Pdf.Indirect pageobjnum);
|
("/Pg", Pdf.Indirect pageobjnum);
|
||||||
("/P", Pdf.Indirect struct_tree_root);
|
("/P", Pdf.Indirect struct_tree_root);
|
||||||
("/K", Pdf.Array (map (function StMCID x -> add_parentmap pageobjnum this_objnum; Pdf.Integer x
|
("/K", Pdf.Array (map (function StMCID x -> add_parentmap pageobjnum this_objnum; Pdf.Integer x
|
||||||
| _ -> assert false) children))]
|
| _ -> assert false) children))])
|
||||||
in
|
in
|
||||||
Pdf.addobj_given_num pdf (this_objnum, this_obj);
|
Pdf.addobj_given_num pdf (this_objnum, this_obj);
|
||||||
Pdf.Indirect this_objnum
|
Pdf.Indirect this_objnum
|
||||||
|
|
|
@ -33,7 +33,7 @@ type drawops =
|
||||||
| FormXObject of float * float * float * float * string * drawops list
|
| FormXObject of float * float * float * float * string * drawops list
|
||||||
| Use of string
|
| Use of string
|
||||||
| ImageXObject of string * Pdf.pdfobject
|
| ImageXObject of string * Pdf.pdfobject
|
||||||
| Image of string
|
| Image of string * string option
|
||||||
| NewPage
|
| NewPage
|
||||||
| Opacity of float
|
| Opacity of float
|
||||||
| SOpacity of float
|
| SOpacity of float
|
||||||
|
|
|
@ -270,8 +270,8 @@ let addpng ?data n =
|
||||||
let data = Pdfio.bytes_of_string (contents_of_file filename) in
|
let data = Pdfio.bytes_of_string (contents_of_file filename) in
|
||||||
addop (Cpdfdraw.ImageXObject (name, fst (Cpdfimage.obj_of_png_data data)))
|
addop (Cpdfdraw.ImageXObject (name, fst (Cpdfimage.obj_of_png_data data)))
|
||||||
|
|
||||||
let addimage s =
|
let addimage ?title s =
|
||||||
addop (Cpdfdraw.Image s)
|
addop (Cpdfdraw.Image (s, title))
|
||||||
|
|
||||||
let addnewpage s =
|
let addnewpage s =
|
||||||
addop Cpdfdraw.NewPage
|
addop Cpdfdraw.NewPage
|
||||||
|
|
|
@ -50,7 +50,7 @@ val endxobj : unit -> unit
|
||||||
val usexobj : string -> unit
|
val usexobj : string -> unit
|
||||||
val addjpeg : ?data:Pdfio.rawbytes -> string -> unit
|
val addjpeg : ?data:Pdfio.rawbytes -> string -> unit
|
||||||
val addpng : ?data:Pdfio.rawbytes -> string -> unit
|
val addpng : ?data:Pdfio.rawbytes -> string -> unit
|
||||||
val addimage : string -> unit
|
val addimage : ?title:string -> string -> unit
|
||||||
val addopacity : float -> unit
|
val addopacity : float -> unit
|
||||||
val addsopacity : float -> unit
|
val addsopacity : float -> unit
|
||||||
val addbt : unit -> unit
|
val addbt : unit -> unit
|
||||||
|
|
Loading…
Reference in New Issue