-add-text with real font name done
This commit is contained in:
parent
cd68d4852d
commit
7c4fbf589d
3
Changes
3
Changes
|
@ -1,7 +1,8 @@
|
||||||
2.5 (Upcoming 2022)
|
2.5 (Upcoming 2022)
|
||||||
|
|
||||||
o Text added in existing fonts is now encoding-aware (plus new raw mode)
|
|
||||||
o New operation -print-font-encoding
|
o New operation -print-font-encoding
|
||||||
|
o Can now search for a font by real name with -font
|
||||||
|
o Text added in existing fonts is now encoding-aware (plus new raw mode)
|
||||||
o New -print-dict-entry operation prints values for a given key
|
o New -print-dict-entry operation prints values for a given key
|
||||||
o Extend -remove-dict-entry to allow search
|
o Extend -remove-dict-entry to allow search
|
||||||
o New -replace-dict-entry function to search & replace e.g URLs
|
o New -replace-dict-entry function to search & replace e.g URLs
|
||||||
|
|
45
cpdf.ml
45
cpdf.ml
|
@ -1077,26 +1077,22 @@ let print_metadata pdf =
|
||||||
Printf.printf "%c" (char_of_int (bget data x))
|
Printf.printf "%c" (char_of_int (bget data x))
|
||||||
done
|
done
|
||||||
|
|
||||||
|
(* List fonts *)
|
||||||
|
|
||||||
(* \section{Print font data} *)
|
|
||||||
let list_font pdf page (name, dict) =
|
let list_font pdf page (name, dict) =
|
||||||
let subtype =
|
let subtype =
|
||||||
match Pdf.lookup_direct pdf "/Subtype" dict with
|
match Pdf.lookup_direct pdf "/Subtype" dict with
|
||||||
| Some (Pdf.Name n) -> n
|
| Some (Pdf.Name n) -> Pdfwrite.string_of_pdf (Pdf.Name n)
|
||||||
| _ -> ""
|
| _ -> ""
|
||||||
in let basefont =
|
in let basefont =
|
||||||
match Pdf.lookup_direct pdf "/BaseFont" dict with
|
match Pdf.lookup_direct pdf "/BaseFont" dict with
|
||||||
| Some (Pdf.Name n) -> n
|
| Some (Pdf.Name n) -> Pdfwrite.string_of_pdf (Pdf.Name n)
|
||||||
| _ -> ""
|
| _ -> ""
|
||||||
in let encoding =
|
in let encoding =
|
||||||
match Pdf.lookup_direct pdf "/Encoding" dict with
|
match Pdf.lookup_direct pdf "/Encoding" dict with
|
||||||
| Some (Pdf.Name n) -> n
|
| Some (Pdf.Name n) -> Pdfwrite.string_of_pdf (Pdf.Name n)
|
||||||
| _ -> ""
|
| _ -> ""
|
||||||
in
|
in
|
||||||
(*i Printf.printf
|
(page, name, subtype, basefont, encoding)
|
||||||
"%i %s %s %s %s\n" i*)
|
|
||||||
page, name, subtype, basefont, encoding
|
|
||||||
|
|
||||||
let list_fonts pdf =
|
let list_fonts pdf =
|
||||||
let pages = Pdfpage.pages_of_pagetree pdf in
|
let pages = Pdfpage.pages_of_pagetree pdf in
|
||||||
|
@ -1116,7 +1112,6 @@ let print_fonts pdf =
|
||||||
flprint
|
flprint
|
||||||
(fold_left ( ^ ) "" (map string_of_font (list_fonts pdf)))
|
(fold_left ( ^ ) "" (map string_of_font (list_fonts pdf)))
|
||||||
|
|
||||||
|
|
||||||
(* \section{Superimpose text, page numbers etc.} *)
|
(* \section{Superimpose text, page numbers etc.} *)
|
||||||
|
|
||||||
(* Process UTF8 text to /WinAnsiEncoding string (for standard 14) or whatever
|
(* Process UTF8 text to /WinAnsiEncoding string (for standard 14) or whatever
|
||||||
|
@ -1434,9 +1429,18 @@ let addtext
|
||||||
| Some fontdict ->
|
| Some fontdict ->
|
||||||
begin match Pdf.lookup_direct pdf fontname fontdict with
|
begin match Pdf.lookup_direct pdf fontname fontdict with
|
||||||
| Some font -> font
|
| Some font -> font
|
||||||
| _ -> failwith "addtext: font not found A"
|
| None ->
|
||||||
|
(* For each item in the fontdict, follow its value and find the basename. If it matches, return that font *)
|
||||||
|
let font = ref None in
|
||||||
|
iter
|
||||||
|
(fun (k, v) ->
|
||||||
|
match Pdf.lookup_direct pdf "/BaseFont" v with
|
||||||
|
| Some (Pdf.Name n) when n = fontname -> font := Some v
|
||||||
|
| _ -> ())
|
||||||
|
(match fontdict with Pdf.Dictionary d -> d | _ -> []);
|
||||||
|
match !font with Some f -> f | None -> failwith (Printf.sprintf "addtext: font %s not found" fontname)
|
||||||
end
|
end
|
||||||
| _ -> failwith "addtext: font not found B"
|
| _ -> failwith "addtext: font not found for width"
|
||||||
in
|
in
|
||||||
let rawwidth = width_of_text (Pdftext.read_font pdf font) text in
|
let rawwidth = width_of_text (Pdftext.read_font pdf font) text in
|
||||||
(rawwidth *. fontsize) /. 1000.
|
(rawwidth *. fontsize) /. 1000.
|
||||||
|
@ -1545,6 +1549,7 @@ let
|
||||||
Printf.printf "relative-to-cropbox = %b" cropbox;
|
Printf.printf "relative-to-cropbox = %b" cropbox;
|
||||||
flprint "\n";*)
|
flprint "\n";*)
|
||||||
ops_metrics := [];
|
ops_metrics := [];
|
||||||
|
let realfontname = ref fontname in
|
||||||
let fontpdfobj =
|
let fontpdfobj =
|
||||||
match font with
|
match font with
|
||||||
| Some f ->
|
| Some f ->
|
||||||
|
@ -1557,9 +1562,19 @@ let
|
||||||
| Some fontdict ->
|
| Some fontdict ->
|
||||||
begin match Pdf.lookup_direct pdf fontname fontdict with
|
begin match Pdf.lookup_direct pdf fontname fontdict with
|
||||||
| Some font -> font
|
| Some font -> font
|
||||||
| _ -> failwith "addtext: font not found A"
|
| _ ->
|
||||||
|
(* For each item in the fontdict, follow its value and find the basename. If it matches, return that font *)
|
||||||
|
let font = ref None in
|
||||||
|
iter
|
||||||
|
(fun (k, v) ->
|
||||||
|
match Pdf.lookup_direct pdf "/BaseFont" v with
|
||||||
|
| Some (Pdf.Name n) when n = fontname ->
|
||||||
|
font := Some v; realfontname := k
|
||||||
|
| _ -> ())
|
||||||
|
(match fontdict with Pdf.Dictionary d -> d | _ -> []);
|
||||||
|
match !font with Some f -> f | None -> failwith (Printf.sprintf "addtext: font %s not found" fontname)
|
||||||
end
|
end
|
||||||
| _ -> failwith "addtext: font not found B"
|
| _ -> failwith "addtext: font dictionary not present"
|
||||||
in
|
in
|
||||||
let text = if raw then text else charcodes_of_utf8 pdf fontpdfobj text in
|
let text = if raw then text else charcodes_of_utf8 pdf fontpdfobj text in
|
||||||
let lines = map unescape_string (split_at_newline text) in
|
let lines = map unescape_string (split_at_newline text) in
|
||||||
|
@ -1608,7 +1623,7 @@ let
|
||||||
if orientation = Cpdfposition.Vertical then 0., -.(!voffset) else !voffset, 0.
|
if orientation = Cpdfposition.Vertical then 0., -.(!voffset) else !voffset, 0.
|
||||||
in
|
in
|
||||||
pdf :=
|
pdf :=
|
||||||
addtext metrics lines linewidth outline fast colour fontname
|
addtext metrics lines linewidth outline fast colour !realfontname
|
||||||
embed bates batespad fontsize font underneath position hoff voff line
|
embed bates batespad fontsize font underneath position hoff voff line
|
||||||
pages orientation cropbox opacity justification filename
|
pages orientation cropbox opacity justification filename
|
||||||
extract_text_font_size shift
|
extract_text_font_size shift
|
||||||
|
|
|
@ -1032,12 +1032,15 @@ let setattachfile s =
|
||||||
| Some _ -> detect_duplicate_op (AttachFile [s])
|
| Some _ -> detect_duplicate_op (AttachFile [s])
|
||||||
|
|
||||||
let setfont f =
|
let setfont f =
|
||||||
|
let convert f = (* convert from written PDF representation to internal PDF string e.g # sequences *)
|
||||||
|
match Pdfread.lex_name (Pdfio.input_of_string f) with Pdfgenlex.LexName s -> s | _ -> assert false
|
||||||
|
in
|
||||||
args.font <-
|
args.font <-
|
||||||
begin match Pdftext.standard_font_of_name ("/" ^ f) with
|
begin match Pdftext.standard_font_of_name ("/" ^ f) with
|
||||||
| Some x -> StandardFont x
|
| Some x -> StandardFont x
|
||||||
| None -> OtherFont f
|
| None -> OtherFont (convert f)
|
||||||
end;
|
end;
|
||||||
args.fontname <- f
|
args.fontname <- convert f
|
||||||
|
|
||||||
let setextracttextfontsize f =
|
let setextracttextfontsize f =
|
||||||
args.extract_text_font_size <- Some f
|
args.extract_text_font_size <- Some f
|
||||||
|
|
Loading…
Reference in New Issue