This commit is contained in:
John Whitington 2022-12-23 13:14:24 +00:00
parent 7441aee484
commit 3cc0b8490d
4 changed files with 44 additions and 3 deletions

View File

@ -6,8 +6,8 @@ DOC = cpdfunicodedata cpdferror cpdfdebug cpdfjson cpdfstrftime cpdfcoord \
cpdfbookmarks cpdfpage cpdftruetype cpdfremovetext cpdfextracttext \
cpdfembed cpdfaddtext cpdfimage cpdffont cpdftype cpdfpad cpdfocg \
cpdfsqueeze cpdfdraft cpdfspot cpdfpagelabels cpdfcreate cpdfannot \
cpdfxobject cpdfimpose cpdftweak cpdftexttopdf cpdftoc cpdfdraw \
cpdfcommand
cpdfxobject cpdfimpose cpdftweak cpdftexttopdf cpdftoc cpdfjpeg \
cpdfdraw cpdfcommand
MODS = $(NONDOC) $(DOC)

View File

@ -1932,7 +1932,7 @@ let addjpeg n =
in
try
let data = Pdfio.bytes_of_string (contents_of_file filename) in
let w, h = Pdfjpeg.jpeg_dimensions data in
let w, h = Cpdfjpeg.jpeg_dimensions data in
let d =
["/Length", Pdf.Integer (Pdfio.bytes_size data);
"/Filter", Pdf.Name "/DCTDecode";

39
cpdfjpeg.ml Normal file
View File

@ -0,0 +1,39 @@
open Pdfutil
open Pdfio
(* Return the width and height of a JPEG image, per Michael Petrov's C version. *)
exception Answer of int * int
let jpeg_dimensions bs =
try
let get = bget bs in
let i = ref 0 in
if get !i = 0xFF && get (!i + 1) = 0xD8 && get (!i + 2) = 0xFF && get (!i + 3) = 0xE0 then
begin
i += 4;
if
get (!i + 2) = int_of_char 'J' && get (!i + 3) = int_of_char 'F'
&& get (!i + 4) = int_of_char 'I' && get (!i + 5) = int_of_char 'F'
&& get (!i + 6) = 0
then
let block_length = ref (get !i * 256 + get (!i + 1)) in
while !i < bytes_size bs do
i := !i + !block_length;
if !i > bytes_size bs then raise (Pdf.PDFError "jpeg_dimensions: too short") else
if get !i <> 0xFF then raise (Pdf.PDFError "jpeg_dimensions: not a valid block") else
if get (!i + 1) = 0xC0 then
raise (Answer (get (!i + 7) * 256 + get (!i + 8), (get (!i + 5) * 256 + get (!i + 6))))
else
begin
i += 2;
block_length := get !i * 256 + get (!i + 1)
end
done
else
raise (Pdf.PDFError "jpeg_dimensions: Not a valid JFIF string")
end
else
raise (Pdf.PDFError "jpeg_dimensions: Not a valid SOI header");
assert false
with
Answer (w, h) -> (w, h)

2
cpdfjpeg.mli Normal file
View File

@ -0,0 +1,2 @@
(** Return the dimensions of a JPEG *)
val jpeg_dimensions : Pdfio.bytes -> int * int