mirror of
				https://github.com/johnwhitington/cpdf-source.git
				synced 2025-06-05 22:09:39 +02:00 
			
		
		
		
	q/Q/BT/ET by data structure
This commit is contained in:
		| @@ -1777,7 +1777,7 @@ let whingemalformed () = | ||||
|   exit 1 | ||||
|  | ||||
| (* Drawing operations. *) | ||||
| let drawops = ref [("main", [])] | ||||
| let drawops = ref [("_MAIN", [])] | ||||
|  | ||||
| let startxobj n = | ||||
|   drawops := (n, [])::!drawops | ||||
| @@ -1797,17 +1797,27 @@ let endxobj () = | ||||
|       let a, b, c, d = args.xobj_bbox in | ||||
|         addop (Cpdfdraw.FormXObject (a, b, c, d, n, rev ops)) | ||||
|   | [] -> | ||||
|       error "too many -endxobj" | ||||
|  | ||||
| let tdeep = ref 0 | ||||
|       error "too many -endxobj or -et" | ||||
|  | ||||
| let addbt () = | ||||
|   addop Cpdfdraw.BT; | ||||
|   tdeep +=1 | ||||
|   drawops := ("_TEXT", [])::!drawops | ||||
|  | ||||
| let addet () = | ||||
|   addop Cpdfdraw.ET; | ||||
|   tdeep -=1 | ||||
|   match !drawops with | ||||
|   | ("_TEXT", ops)::t -> | ||||
|       drawops := t; | ||||
|       addop (Cpdfdraw.TextSection (rev ops)) | ||||
|   | _ -> error "not in a text section at -et" | ||||
|  | ||||
| let push () = | ||||
|   drawops := ("_PUSH", [])::!drawops | ||||
|  | ||||
| let pop () = | ||||
|   match !drawops with | ||||
|   | ("_PUSH", ops)::t -> | ||||
|       drawops := t; | ||||
|       addop (Cpdfdraw.Qq (rev ops)) | ||||
|   | _ -> error "not in a Q section at -q" | ||||
|  | ||||
| let readfloats s = map float_of_string (String.split_on_char ' ' s) | ||||
|  | ||||
| @@ -1922,11 +1932,6 @@ let setdash s = | ||||
|   with | ||||
|    _ -> error "Dash pattern elements must one or more numbers" | ||||
|  | ||||
| let push () = | ||||
|   addop Cpdfdraw.Push | ||||
|  | ||||
| let pop () = | ||||
|   addop Cpdfdraw.Pop | ||||
|  | ||||
| let setmatrix s = | ||||
|   match readfloats s with | ||||
| @@ -4460,10 +4465,9 @@ let go () = | ||||
|         let w = (float rawwidth *. args.fontsize) /. 1000. in | ||||
|           Printf.printf "%f\n" w | ||||
|   | Some Draw -> | ||||
|       if !tdeep <> 0 then error "Unmatched -bt / -et" else | ||||
|       let pdf = get_single_pdf args.op false in | ||||
|       let range = parse_pagespec_allow_empty pdf (get_pagespec ()) in | ||||
|       let ops = match !drawops with [("main", ops)] -> rev ops | _ -> error "not enough -endxobj" in | ||||
|       let ops = match !drawops with [("_MAIN", ops)] -> rev ops | _ -> error "not enough -endxobj or -et" in | ||||
|         write_pdf | ||||
|           false | ||||
|           (Cpdfdraw.draw ~filename:args.original_filename ~bates:args.bates ~batespad:args.batespad args.fast range pdf ops) | ||||
|   | ||||
							
								
								
									
										12
									
								
								cpdfdraw.ml
									
									
									
									
									
								
							
							
						
						
									
										12
									
								
								cpdfdraw.ml
									
									
									
									
									
								
							| @@ -20,8 +20,7 @@ type drawops = | ||||
|   | SetMiterLimit of float | ||||
|   | SetDashPattern of float list * float | ||||
|   | Matrix of Pdftransform.transform_matrix | ||||
|   | Push | ||||
|   | Pop | ||||
|   | Qq of drawops list | ||||
|   | Fill | ||||
|   | FillEvenOdd | ||||
|   | Stroke | ||||
| @@ -37,8 +36,7 @@ type drawops = | ||||
|   | Opacity of float | ||||
|   | SOpacity of float | ||||
|   | Font of Pdftext.standard_font * float | ||||
|   | BT | ||||
|   | ET | ||||
|   | TextSection of drawops list | ||||
|   | Text of string | ||||
|   | SpecialText of string | ||||
|   | Newline | ||||
| @@ -146,8 +144,7 @@ let update_resources pdf old_resources = | ||||
|     (Pdf.Dictionary new_fonts) | ||||
|  | ||||
| let rec ops_of_drawop pdf endpage filename bates batespad num page = function | ||||
|   | Push -> [Pdfops.Op_q] | ||||
|   | Pop -> [Pdfops.Op_Q] | ||||
|   | Qq ops -> [Pdfops.Op_q] @ ops_of_drawops pdf endpage filename bates batespad num page ops @ [Pdfops.Op_Q] | ||||
|   | Matrix m -> [Pdfops.Op_cm m]  | ||||
|   | Rect (x, y, w, h) -> [Pdfops.Op_re (x, y, w, h)] | ||||
|   | Bezier (a, b, c, d, e, f) -> [Pdfops.Op_c (a, b, c, d, e, f)] | ||||
| @@ -208,8 +205,7 @@ let rec ops_of_drawop pdf endpage filename bates batespad num page = function | ||||
|         (res ()).current_font <- font; | ||||
|         (res ()).page_names <- n::(res ()).page_names; | ||||
|         [Pdfops.Op_Tf (n, f)] | ||||
|   | BT -> [Pdfops.Op_BT] | ||||
|   | ET -> [Pdfops.Op_ET] | ||||
|   | TextSection ops -> [Pdfops.Op_BT] @ ops_of_drawops pdf endpage filename bates batespad num page ops @ [Pdfops.Op_ET] | ||||
|   | Text s -> [Pdfops.Op_Tj (charcodes_of_utf8 s)] | ||||
|   | SpecialText s -> | ||||
|       let s = process_specials pdf endpage filename bates batespad num page s in | ||||
|   | ||||
| @@ -18,8 +18,7 @@ type drawops = | ||||
|   | SetMiterLimit of float | ||||
|   | SetDashPattern of float list * float | ||||
|   | Matrix of Pdftransform.transform_matrix | ||||
|   | Push | ||||
|   | Pop | ||||
|   | Qq of drawops list | ||||
|   | Fill | ||||
|   | FillEvenOdd | ||||
|   | Stroke | ||||
| @@ -35,8 +34,7 @@ type drawops = | ||||
|   | Opacity of float | ||||
|   | SOpacity of float | ||||
|   | Font of Pdftext.standard_font * float | ||||
|   | BT | ||||
|   | ET | ||||
|   | TextSection of drawops list | ||||
|   | Text of string | ||||
|   | SpecialText of string | ||||
|   | Newline | ||||
|   | ||||
| @@ -140,7 +140,8 @@ let impose_pages fit x y columns rtl btt center margin output_mediabox fast fit_ | ||||
|               [Pdfops.stream_of_ops [Pdfops.Op_q; Pdfops.Op_cm transform]] @ contents @ [Pdfops.stream_of_ops [Pdfops.Op_Q]] | ||||
|             else | ||||
|             (* If slow, use protect from Pdfpage. *) | ||||
|             let ops = Pdfpage.protect pdf resources' contents @ Pdfops.parse_operators pdf resources' contents in | ||||
|             let ours = Pdfops.parse_operators pdf resources' contents in  | ||||
|             let ops = Pdfpage.protect ours @ ours in | ||||
|               [Pdfops.stream_of_ops ([Pdfops.Op_q] @ [Pdfops.Op_cm transform] @ ops @ [Pdfops.Op_Q])] | ||||
|           in | ||||
|             flatten | ||||
|   | ||||
		Reference in New Issue
	
	Block a user