forked from josch/img2pdf
Merge pull request #18 from DarwinAwardWinner/master
Avoid leaking file descriptors and convert unrecognized colorspaces to RGB
This commit is contained in:
commit
f881a00c4b
1 changed files with 50 additions and 43 deletions
|
@ -204,51 +204,53 @@ def convert(images, dpi, x, y, title=None, author=None, creator=None, producer=N
|
||||||
pdf = pdfdoc(3, title, author, creator, producer, creationdate,
|
pdf = pdfdoc(3, title, author, creator, producer, creationdate,
|
||||||
moddate, subject, keywords)
|
moddate, subject, keywords)
|
||||||
|
|
||||||
for im in images:
|
for imfilename in images:
|
||||||
rawdata = im.read()
|
debug_out("Reading %s"%imfilename, verbose)
|
||||||
im.seek(0)
|
with open(imfilename, "rb") as im:
|
||||||
try:
|
rawdata = im.read()
|
||||||
imgdata = Image.open(im)
|
im.seek(0)
|
||||||
except IOError as e:
|
try:
|
||||||
# test if it is a jpeg2000 image
|
imgdata = Image.open(im)
|
||||||
if rawdata[:12] != "\x00\x00\x00\x0C\x6A\x50\x20\x20\x0D\x0A\x87\x0A":
|
except IOError as e:
|
||||||
error_out("cannot read input image (not jpeg2000)")
|
# test if it is a jpeg2000 image
|
||||||
error_out("PIL: %s"%e)
|
if rawdata[:12] != "\x00\x00\x00\x0C\x6A\x50\x20\x20\x0D\x0A\x87\x0A":
|
||||||
exit(1)
|
error_out("cannot read input image (not jpeg2000)")
|
||||||
# image is jpeg2000
|
error_out("PIL: %s"%e)
|
||||||
width, height, ics = parsejp2(rawdata)
|
exit(1)
|
||||||
imgformat = "JPEG2000"
|
# image is jpeg2000
|
||||||
|
width, height, ics = parsejp2(rawdata)
|
||||||
|
imgformat = "JPEG2000"
|
||||||
|
|
||||||
if dpi:
|
if dpi:
|
||||||
ndpi = dpi, dpi
|
ndpi = dpi, dpi
|
||||||
debug_out("input dpi (forced) = %d x %d"%ndpi, verbose)
|
debug_out("input dpi (forced) = %d x %d"%ndpi, verbose)
|
||||||
else:
|
else:
|
||||||
ndpi = (96, 96) # TODO: read real dpi
|
ndpi = (96, 96) # TODO: read real dpi
|
||||||
debug_out("input dpi = %d x %d"%ndpi, verbose)
|
debug_out("input dpi = %d x %d"%ndpi, verbose)
|
||||||
|
|
||||||
if colorspace:
|
if colorspace:
|
||||||
color = colorspace
|
color = colorspace
|
||||||
debug_out("input colorspace (forced) = %s"%(ics))
|
debug_out("input colorspace (forced) = %s"%(ics))
|
||||||
|
else:
|
||||||
|
color = ics
|
||||||
|
debug_out("input colorspace = %s"%(ics), verbose)
|
||||||
else:
|
else:
|
||||||
color = ics
|
width, height = imgdata.size
|
||||||
debug_out("input colorspace = %s"%(ics), verbose)
|
imgformat = imgdata.format
|
||||||
else:
|
|
||||||
width, height = imgdata.size
|
|
||||||
imgformat = imgdata.format
|
|
||||||
|
|
||||||
if dpi:
|
if dpi:
|
||||||
ndpi = dpi, dpi
|
ndpi = dpi, dpi
|
||||||
debug_out("input dpi (forced) = %d x %d"%ndpi, verbose)
|
debug_out("input dpi (forced) = %d x %d"%ndpi, verbose)
|
||||||
else:
|
else:
|
||||||
ndpi = imgdata.info.get("dpi", (96, 96))
|
ndpi = imgdata.info.get("dpi", (96, 96))
|
||||||
debug_out("input dpi = %d x %d"%ndpi, verbose)
|
debug_out("input dpi = %d x %d"%ndpi, verbose)
|
||||||
|
|
||||||
if colorspace:
|
if colorspace:
|
||||||
color = colorspace
|
color = colorspace
|
||||||
debug_out("input colorspace (forced) = %s"%(color), verbose)
|
debug_out("input colorspace (forced) = %s"%(color), verbose)
|
||||||
else:
|
else:
|
||||||
color = imgdata.mode
|
color = imgdata.mode
|
||||||
debug_out("input colorspace = %s"%(color), verbose)
|
debug_out("input colorspace = %s"%(color), verbose)
|
||||||
|
|
||||||
debug_out("width x height = %d x %d"%(width,height), verbose)
|
debug_out("width x height = %d x %d"%(width,height), verbose)
|
||||||
debug_out("imgformat = %s"%imgformat, verbose)
|
debug_out("imgformat = %s"%imgformat, verbose)
|
||||||
|
@ -263,8 +265,15 @@ def convert(images, dpi, x, y, title=None, author=None, creator=None, producer=N
|
||||||
else:
|
else:
|
||||||
# because we do not support /CCITTFaxDecode
|
# because we do not support /CCITTFaxDecode
|
||||||
if color == '1':
|
if color == '1':
|
||||||
|
debug_out("Converting colorspace 1 to L", verbose)
|
||||||
imgdata = imgdata.convert('L')
|
imgdata = imgdata.convert('L')
|
||||||
color = 'L'
|
color = 'L'
|
||||||
|
elif color in ("RGB", "L"):
|
||||||
|
debug_out("Colorspace is OK: %s"%color, verbose)
|
||||||
|
else:
|
||||||
|
debug_out("Converting colorspace %s to RGB"%color, verbose)
|
||||||
|
imgdata = imgdata.convert('RGB')
|
||||||
|
color = imgdata.mode
|
||||||
imgdata = zlib.compress(imgdata.tostring())
|
imgdata = zlib.compress(imgdata.tostring())
|
||||||
|
|
||||||
# pdf units = 1/72 inch
|
# pdf units = 1/72 inch
|
||||||
|
@ -277,8 +286,6 @@ def convert(images, dpi, x, y, title=None, author=None, creator=None, producer=N
|
||||||
|
|
||||||
pdf.addimage(color, width, height, imgformat, imgdata, pdf_x, pdf_y)
|
pdf.addimage(color, width, height, imgformat, imgdata, pdf_x, pdf_y)
|
||||||
|
|
||||||
im.close()
|
|
||||||
|
|
||||||
return pdf.tostring()
|
return pdf.tostring()
|
||||||
|
|
||||||
|
|
||||||
|
@ -295,7 +302,7 @@ def valid_date(string):
|
||||||
parser = argparse.ArgumentParser(
|
parser = argparse.ArgumentParser(
|
||||||
description='Lossless conversion/embedding of images (in)to pdf')
|
description='Lossless conversion/embedding of images (in)to pdf')
|
||||||
parser.add_argument(
|
parser.add_argument(
|
||||||
'images', metavar='infile', type=argparse.FileType('rb'),
|
'images', metavar='infile', type=str,
|
||||||
nargs='+', help='input file(s)')
|
nargs='+', help='input file(s)')
|
||||||
parser.add_argument(
|
parser.add_argument(
|
||||||
'-o', '--output', metavar='out', type=argparse.FileType('wb'),
|
'-o', '--output', metavar='out', type=argparse.FileType('wb'),
|
||||||
|
|
Loading…
Reference in a new issue