mirror of
				https://github.com/johnwhitington/cpdf-source.git
				synced 2025-06-05 22:09:39 +02:00 
			
		
		
		
	more
This commit is contained in:
		
							
								
								
									
										4
									
								
								Makefile
									
									
									
									
									
								
							
							
						
						
									
										4
									
								
								Makefile
									
									
									
									
									
								
							| @@ -4,9 +4,9 @@ NONDOC = cpdfyojson cpdfxmlm cpdfutil | |||||||
| DOC = cpdfunicodedata cpdferror cpdfdebug cpdfjson cpdfstrftime cpdfcoord \ | DOC = cpdfunicodedata cpdferror cpdfdebug cpdfjson cpdfstrftime cpdfcoord \ | ||||||
|       cpdfattach cpdfpagespec cpdfposition cpdfpresent cpdfmetadata \ |       cpdfattach cpdfpagespec cpdfposition cpdfpresent cpdfmetadata \ | ||||||
|       cpdfbookmarks cpdfpage cpdfaddtext cpdfimage cpdffont cpdftype \ |       cpdfbookmarks cpdfpage cpdfaddtext cpdfimage cpdffont cpdftype \ | ||||||
|       cpdftexttopdf cpdftoc cpdfpad cpdfocg cpdfsqueeze cpdfdraft cpdfspot \ |       cpdfpad cpdfocg cpdfsqueeze cpdfdraft cpdfspot \ | ||||||
|       cpdfpagelabels cpdfcreate cpdfannot cpdfxobject cpdfimpose cpdftweak \ |       cpdfpagelabels cpdfcreate cpdfannot cpdfxobject cpdfimpose cpdftweak \ | ||||||
|       cpdftruetype cpdfembed \ |       cpdftruetype cpdfembed cpdftexttopdf cpdftoc\ | ||||||
|       cpdfcommand |       cpdfcommand | ||||||
|  |  | ||||||
| MODS = $(NONDOC) $(DOC) | MODS = $(NONDOC) $(DOC) | ||||||
|   | |||||||
| @@ -3973,27 +3973,29 @@ let go () = | |||||||
|         Cpdffont.print_font_table pdf fontname args.copyfontpage |         Cpdffont.print_font_table pdf fontname args.copyfontpage | ||||||
|   | Some TableOfContents -> |   | Some TableOfContents -> | ||||||
|       let pdf = get_single_pdf args.op false in |       let pdf = get_single_pdf args.op false in | ||||||
|       let font = |       let font, embedinfo = | ||||||
|         match args.font with |         match args.font with | ||||||
|         | StandardFont f -> Pdftext.StandardFont (f, args.fontencoding) |         | StandardFont f -> (Pdftext.StandardFont (f, args.fontencoding), None) | ||||||
|         | FontToEmbed fontfile -> |         | FontToEmbed fontfile -> | ||||||
|             Cpdfembed.embed_truetype pdf ~fontfile ~fontname:args.fontname ~codepoints:[] ~encoding:args.fontencoding |             Cpdfembed.embed_truetype pdf ~fontfile ~fontname:args.fontname ~codepoints:[] ~encoding:args.fontencoding, | ||||||
|  |             (Some (pdf, fontfile, args.fontname, args.fontencoding)) | ||||||
|         | _ -> error "TOC: not a standard or embedded font" |         | _ -> error "TOC: not a standard or embedded font" | ||||||
|       in |       in | ||||||
|       let pdf = Cpdftoc.typeset_table_of_contents ~font ~fontsize:args.fontsize ~title:args.toc_title ~bookmark:args.toc_bookmark pdf in |       let pdf = Cpdftoc.typeset_table_of_contents ?embedinfo ~font ~fontsize:args.fontsize ~title:args.toc_title ~bookmark:args.toc_bookmark pdf in | ||||||
|         write_pdf false pdf |         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 = Pdf.empty () in |       let pdf = Pdf.empty () in | ||||||
|       let font = |       let font, embedinfo = | ||||||
|         match args.font with |         match args.font with | ||||||
|         | StandardFont f -> Pdftext.StandardFont (f, args.fontencoding) |         | StandardFont f -> (Pdftext.StandardFont (f, args.fontencoding), None) | ||||||
|         | FontToEmbed fontfile -> |         | FontToEmbed fontfile -> | ||||||
|             Cpdfembed.embed_truetype pdf ~fontfile ~fontname:args.fontname ~codepoints:[] ~encoding:args.fontencoding |             Cpdfembed.embed_truetype pdf ~fontfile ~fontname:args.fontname ~codepoints:[] ~encoding:args.fontencoding, | ||||||
|  |             (Some (pdf, fontfile, args.fontname, args.fontencoding)) | ||||||
|         | _ -> error "text to PDF: not a standard or embedded font" |         | _ -> error "text to PDF: not a standard or embedded font" | ||||||
|       in |       in | ||||||
|       let pdf = |       let pdf = | ||||||
|         Cpdftexttopdf.typeset ~pdf:pdf ~papersize:args.createpdf_pagesize ~font ~fontsize:args.fontsize text |         Cpdftexttopdf.typeset ?embedinfo ~papersize:args.createpdf_pagesize ~font ~fontsize:args.fontsize text | ||||||
|       in |       in | ||||||
|         write_pdf false pdf |         write_pdf false pdf | ||||||
|  |  | ||||||
|   | |||||||
| @@ -30,21 +30,26 @@ let rec of_utf8_with_newlines used charcode_extractor t = | |||||||
|  |  | ||||||
| (* The optional pdf argument is for providing a pre-embedded font - this will | (* The optional pdf argument is for providing a pre-embedded font - this will | ||||||
|    be removed when we re-embed subsetted? *) |    be removed when we re-embed subsetted? *) | ||||||
| let typeset ?pdf ~papersize ~font ~fontsize text = | let typeset ?embedinfo ~papersize ~font ~fontsize text = | ||||||
|   let charcode_extractor = Pdftext.charcode_extractor_of_font_real font in |   let charcode_extractor = Pdftext.charcode_extractor_of_font_real font in | ||||||
|   let pdf = match pdf with None -> Pdf.empty () | Some pdf -> pdf in |   let pdf = match embedinfo with None -> Pdf.empty () | Some (pdf, _, _, _) -> pdf in | ||||||
|   let margin = |   let margin = | ||||||
|     Pdfunits.convert |     Pdfunits.convert | ||||||
|       72. (Pdfpaper.unit papersize) (Pdfunits.PdfPoint) (Pdfpaper.width papersize) /. 15. |       72. (Pdfpaper.unit papersize) (Pdfunits.PdfPoint) (Pdfpaper.width papersize) /. 15. | ||||||
|   in |   in | ||||||
|   let used = null_hash () in |   let used = null_hash () in | ||||||
|  |   let instrs = of_utf8_with_newlines used charcode_extractor (Pdfio.string_of_bytes text) in | ||||||
|  |   let codepoints = map fst (list_of_hashtbl used) in | ||||||
|  |   let font = | ||||||
|  |     match embedinfo with | ||||||
|  |     | None -> font | ||||||
|  |     | Some (pdf, fontfile, fontname, encoding) -> | ||||||
|  |         Cpdfembed.embed_truetype pdf ~fontfile ~fontname ~codepoints ~encoding | ||||||
|  |   in | ||||||
|   let pages = |   let pages = | ||||||
|     Cpdftype.typeset |     Cpdftype.typeset | ||||||
|       margin margin margin margin papersize pdf |       margin margin margin margin papersize pdf | ||||||
|       ([Cpdftype.Font (font, fontsize); Cpdftype.BeginDocument] @ |       ([Cpdftype.Font (font, fontsize); Cpdftype.BeginDocument] @ instrs) | ||||||
|        of_utf8_with_newlines used charcode_extractor (Pdfio.string_of_bytes text)) |  | ||||||
|   in |   in | ||||||
|     let codes = map fst (list_of_hashtbl used) in |  | ||||||
|       Printf.printf "%i codes used\n" (length codes); |  | ||||||
|     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 | ||||||
|   | |||||||
| @@ -1,4 +1,4 @@ | |||||||
| (** Text to PDF *) | (** Text to PDF *) | ||||||
|  |  | ||||||
| (** Typeset a text file as a PDF. *) | (** Typeset a text file as a PDF. *) | ||||||
| val typeset : ?pdf:Pdf.t -> papersize:Pdfpaper.t -> font:Pdftext.font -> fontsize:float -> Pdfio.bytes -> Pdf.t | val typeset : ?embedinfo:(Pdf.t * Pdfio.bytes * string * Pdftext.encoding) -> papersize:Pdfpaper.t -> font:Pdftext.font -> fontsize:float -> Pdfio.bytes -> Pdf.t | ||||||
|   | |||||||
							
								
								
									
										15
									
								
								cpdftoc.ml
									
									
									
									
									
								
							
							
						
						
									
										15
									
								
								cpdftoc.ml
									
									
									
									
									
								
							| @@ -39,11 +39,11 @@ let shorten_text widths l t = | |||||||
|    (and CropBox) copied from first page of existing PDF. Margin of 10% inside |    (and CropBox) copied from first page of existing PDF. Margin of 10% inside | ||||||
|    CropBox. Font size of title twice body font size. Null page labels added for |    CropBox. Font size of title twice body font size. Null page labels added for | ||||||
|    TOC, others bumped up and so preserved. *) |    TOC, others bumped up and so preserved. *) | ||||||
| let typeset_table_of_contents ~font ~fontsize ~title ~bookmark pdf = | let typeset_table_of_contents ?embedinfo ~font ~fontsize ~title ~bookmark pdf = | ||||||
|   let marks = Pdfmarks.read_bookmarks pdf in |   let marks = Pdfmarks.read_bookmarks pdf in | ||||||
|   if marks = [] then (Printf.eprintf "No bookmarks, not making table of contents\n%!"; pdf) else |   if marks = [] then (Printf.eprintf "No bookmarks, not making table of contents\n%!"; pdf) else | ||||||
|   let f, fs = (font, fontsize) in |   let f, fs = (font, fontsize) in | ||||||
|   let big = (font, fontsize *. 2.) in |   let _, bfs as big = (font, fontsize *. 2.) in | ||||||
|   let firstpage = hd (Pdfpage.pages_of_pagetree pdf) in |   let firstpage = hd (Pdfpage.pages_of_pagetree pdf) in | ||||||
|   let width, firstpage_papersize, pmaxx, pmaxy, margin = |   let width, firstpage_papersize, pmaxx, pmaxy, margin = | ||||||
|     let width, height, xmax, ymax = |     let width, height, xmax, ymax = | ||||||
| @@ -106,10 +106,17 @@ let typeset_table_of_contents ~font ~fontsize ~title ~bookmark pdf = | |||||||
|       | None -> (margin, margin, margin, margin) |       | None -> (margin, margin, margin, margin) | ||||||
|       | Some (cminx, cminy, cmaxx, cmaxy) -> |       | Some (cminx, cminy, cmaxx, cmaxy) -> | ||||||
|           (cminx +. margin, (pmaxx -. cmaxx) +. margin, cminy +. margin, (pmaxy -. cmaxy) +. margin) |           (cminx +. margin, (pmaxx -. cmaxx) +. margin, cminy +. margin, (pmaxy -. cmaxy) +. margin) | ||||||
|  |     in | ||||||
|  |     let codepoints = [] in | ||||||
|  |     let font = | ||||||
|  |       match embedinfo with | ||||||
|  |       | None -> font | ||||||
|  |       | Some (pdf, fontfile, fontname, encoding) -> | ||||||
|  |         Cpdfembed.embed_truetype pdf ~fontfile ~fontname ~codepoints ~encoding | ||||||
|     in |     in | ||||||
|       Cpdftype.typeset lm rm tm bm firstpage_papersize pdf |       Cpdftype.typeset lm rm tm bm firstpage_papersize pdf | ||||||
|         ([Cpdftype.Font big; Cpdftype.BeginDocument] @ title @ |         ([Cpdftype.Font (font, bfs); Cpdftype.BeginDocument] @ title @ | ||||||
|           [Cpdftype.Font (f, fs)] @ flatten lines) |           [Cpdftype.Font (font, fs)] @ flatten lines) | ||||||
|   in |   in | ||||||
|   let toc_pages = |   let toc_pages = | ||||||
|     match firstpage_cropbox with |     match firstpage_cropbox with | ||||||
|   | |||||||
| @@ -1,4 +1,4 @@ | |||||||
| (** Table of contents *) | (** Table of contents *) | ||||||
|  |  | ||||||
| (** Typeset a table of contents and prepend to the document. *) | (** Typeset a table of contents and prepend to the document. *) | ||||||
| val typeset_table_of_contents : font:Pdftext.font -> fontsize:float -> title:string -> bookmark:bool -> Pdf.t -> Pdf.t | val typeset_table_of_contents : ?embedinfo:(Pdf.t * Pdfio.bytes * string * Pdftext.encoding) -> font:Pdftext.font -> fontsize:float -> title:string -> bookmark:bool -> Pdf.t -> Pdf.t | ||||||
|   | |||||||
		Reference in New Issue
	
	Block a user