more
This commit is contained in:
parent
7441aee484
commit
3cc0b8490d
4
Makefile
4
Makefile
|
@ -6,8 +6,8 @@ DOC = cpdfunicodedata cpdferror cpdfdebug cpdfjson cpdfstrftime cpdfcoord \
|
||||||
cpdfbookmarks cpdfpage cpdftruetype cpdfremovetext cpdfextracttext \
|
cpdfbookmarks cpdfpage cpdftruetype cpdfremovetext cpdfextracttext \
|
||||||
cpdfembed cpdfaddtext cpdfimage cpdffont cpdftype cpdfpad cpdfocg \
|
cpdfembed cpdfaddtext cpdfimage cpdffont cpdftype cpdfpad cpdfocg \
|
||||||
cpdfsqueeze cpdfdraft cpdfspot cpdfpagelabels cpdfcreate cpdfannot \
|
cpdfsqueeze cpdfdraft cpdfspot cpdfpagelabels cpdfcreate cpdfannot \
|
||||||
cpdfxobject cpdfimpose cpdftweak cpdftexttopdf cpdftoc cpdfdraw \
|
cpdfxobject cpdfimpose cpdftweak cpdftexttopdf cpdftoc cpdfjpeg \
|
||||||
cpdfcommand
|
cpdfdraw cpdfcommand
|
||||||
|
|
||||||
MODS = $(NONDOC) $(DOC)
|
MODS = $(NONDOC) $(DOC)
|
||||||
|
|
||||||
|
|
|
@ -1932,7 +1932,7 @@ let addjpeg n =
|
||||||
in
|
in
|
||||||
try
|
try
|
||||||
let data = Pdfio.bytes_of_string (contents_of_file filename) in
|
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 =
|
let d =
|
||||||
["/Length", Pdf.Integer (Pdfio.bytes_size data);
|
["/Length", Pdf.Integer (Pdfio.bytes_size data);
|
||||||
"/Filter", Pdf.Name "/DCTDecode";
|
"/Filter", Pdf.Name "/DCTDecode";
|
||||||
|
|
|
@ -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)
|
|
@ -0,0 +1,2 @@
|
||||||
|
(** Return the dimensions of a JPEG *)
|
||||||
|
val jpeg_dimensions : Pdfio.bytes -> int * int
|
Loading…
Reference in New Issue