src/tests/__init__.py: add support for multiframe gif tests

pull/110/head
parent e20fe4944c
commit 8476e333cd

@ -476,101 +476,127 @@ def test_suite():
x = PdfReader(StringIO(convert_load(output))) x = PdfReader(StringIO(convert_load(output)))
self.assertEqual(sorted(x.keys()), [PdfName.Info, PdfName.Root, self.assertEqual(sorted(x.keys()), [PdfName.Info, PdfName.Root,
PdfName.Size]) PdfName.Size])
self.assertEqual(x.Size, '7') self.assertIn(x.Root.Pages.Count, ('1', '2'))
if len(x.Root.Pages.Kids) == '1':
self.assertEqual(x.Size, '7')
self.assertEqual(len(x.Root.Pages.Kids), 1)
elif len(x.Root.Pages.Kids) == '2':
self.assertEqual(x.Size, '10')
self.assertEqual(len(x.Root.Pages.Kids), 2)
self.assertEqual(x.Info, {}) self.assertEqual(x.Info, {})
self.assertEqual(sorted(x.Root.keys()), [PdfName.Pages, self.assertEqual(sorted(x.Root.keys()), [PdfName.Pages,
PdfName.Type]) PdfName.Type])
self.assertEqual(x.Root.Type, PdfName.Catalog) self.assertEqual(x.Root.Type, PdfName.Catalog)
self.assertEqual(sorted(x.Root.Pages.keys()), self.assertEqual(sorted(x.Root.Pages.keys()),
[PdfName.Count, PdfName.Kids, PdfName.Type]) [PdfName.Count, PdfName.Kids, PdfName.Type])
self.assertEqual(x.Root.Pages.Count, '1')
self.assertEqual(x.Root.Pages.Type, PdfName.Pages) self.assertEqual(x.Root.Pages.Type, PdfName.Pages)
self.assertEqual(len(x.Root.Pages.Kids), 1) orig_img = Image.open(f)
self.assertEqual(sorted(x.Root.Pages.Kids[0].keys()), for pagenum in range(len(x.Root.Pages.Kids)):
[PdfName.Contents, PdfName.MediaBox, # retrieve the original image frame that this page was
PdfName.Parent, PdfName.Resources, PdfName.Type]) # generated from
self.assertEqual(x.Root.Pages.Kids[0].MediaBox, orig_img.seek(pagenum)
['0', '0', '115', '48'])
self.assertEqual(x.Root.Pages.Kids[0].Parent, x.Root.Pages)
self.assertEqual(x.Root.Pages.Kids[0].Type, PdfName.Page)
self.assertEqual(x.Root.Pages.Kids[0].Resources.keys(),
[PdfName.XObject])
self.assertEqual(x.Root.Pages.Kids[0].Resources.XObject.keys(),
[PdfName.Im0])
self.assertEqual(x.Root.Pages.Kids[0].Contents.keys(),
[PdfName.Length])
self.assertEqual(x.Root.Pages.Kids[0].Contents.Length,
str(len(x.Root.Pages.Kids[0].Contents.stream)))
self.assertEqual(x.Root.Pages.Kids[0].Contents.stream,
"q\n115.0000 0 0 48.0000 0.0000 0.0000 cm\n/Im0 "
"Do\nQ")
imgprops = x.Root.Pages.Kids[0].Resources.XObject.Im0 ndpi = orig_img.info.get("dpi", (96.0, 96.0))
# In python3, the returned dpi value for some tiff images will
# not be an integer but a float. To make the behaviour of
# img2pdf the same between python2 and python3, we convert that
# float into an integer by rounding.
# Search online for the 72.009 dpi problem for more info.
ndpi = (int(round(ndpi[0])), int(round(ndpi[1])))
imgwidthpx, imgheightpx = orig_img.size
pagewidth = 72*imgwidthpx/ndpi[0]
pageheight = 72*imgheightpx/ndpi[1]
# test if the filter is valid: def format_float(f):
self.assertIn( if int(f) == f:
imgprops.Filter, [[PdfName.DCTDecode], [PdfName.JPXDecode], return str(int(f))
[PdfName.FlateDecode], else:
[PdfName.CCITTFaxDecode]]) return ("%.4f" % f).rstrip("0")
# test if the colorspace is valid
self.assertIn( self.assertEqual(sorted(x.Root.Pages.Kids[pagenum].keys()),
imgprops.ColorSpace, [PdfName.DeviceGray, PdfName.DeviceRGB, [PdfName.Contents, PdfName.MediaBox,
PdfName.DeviceCMYK]) PdfName.Parent, PdfName.Resources, PdfName.Type])
# test if the image has correct size self.assertEqual(x.Root.Pages.Kids[pagenum].MediaBox,
orig_img = Image.open(f) ['0', '0', format_float(pagewidth), format_float(pageheight)])
self.assertEqual(imgprops.Width, str(orig_img.size[0])) self.assertEqual(x.Root.Pages.Kids[pagenum].Parent, x.Root.Pages)
self.assertEqual(imgprops.Height, str(orig_img.size[1])) self.assertEqual(x.Root.Pages.Kids[pagenum].Type, PdfName.Page)
# if the input file is a jpeg then it should've been copied self.assertEqual(x.Root.Pages.Kids[pagenum].Resources.keys(),
# verbatim into the PDF [PdfName.XObject])
if imgprops.Filter in [[PdfName.DCTDecode], [PdfName.JPXDecode]]: self.assertEqual(x.Root.Pages.Kids[pagenum].Resources.XObject.keys(),
self.assertEqual( [PdfName.Im0])
x.Root.Pages.Kids[0].Resources.XObject.Im0.stream, self.assertEqual(x.Root.Pages.Kids[pagenum].Contents.keys(),
convert_load(orig_imgdata)) [PdfName.Length])
elif imgprops.Filter == [PdfName.CCITTFaxDecode]: self.assertEqual(x.Root.Pages.Kids[pagenum].Contents.Length,
tiff_header = tiff_header_for_ccitt( str(len(x.Root.Pages.Kids[pagenum].Contents.stream)))
int(imgprops.Width), int(imgprops.Height), self.assertEqual(x.Root.Pages.Kids[pagenum].Contents.stream,
int(imgprops.Length), 4) "q\n%.4f 0 0 %.4f 0.0000 0.0000 cm\n"
imgio = BytesIO() "/Im0 Do\nQ" % (pagewidth, pageheight))
imgio.write(tiff_header)
imgio.write(convert_store( imgprops = x.Root.Pages.Kids[pagenum].Resources.XObject.Im0
x.Root.Pages.Kids[0].Resources.XObject.Im0.stream))
imgio.seek(0) # test if the filter is valid:
im = Image.open(imgio) self.assertIn(
self.assertEqual(im.tobytes(), orig_img.tobytes()) imgprops.Filter, [[PdfName.DCTDecode], [PdfName.JPXDecode],
try: [PdfName.FlateDecode],
im.close() [PdfName.CCITTFaxDecode]])
except AttributeError: # test if the colorspace is valid
pass self.assertIn(
imgprops.ColorSpace, [PdfName.DeviceGray, PdfName.DeviceRGB,
PdfName.DeviceCMYK])
# test if the image has correct size
self.assertEqual(imgprops.Width, str(orig_img.size[0]))
self.assertEqual(imgprops.Height, str(orig_img.size[1]))
# if the input file is a jpeg then it should've been copied
# verbatim into the PDF
if imgprops.Filter in [[PdfName.DCTDecode], [PdfName.JPXDecode]]:
self.assertEqual(
x.Root.Pages.Kids[pagenum].Resources.XObject.Im0.stream,
convert_load(orig_imgdata))
elif imgprops.Filter == [PdfName.CCITTFaxDecode]:
tiff_header = tiff_header_for_ccitt(
int(imgprops.Width), int(imgprops.Height),
int(imgprops.Length), 4)
imgio = BytesIO()
imgio.write(tiff_header)
imgio.write(convert_store(
x.Root.Pages.Kids[pagenum].Resources.XObject.Im0.stream))
imgio.seek(0)
im = Image.open(imgio)
self.assertEqual(im.tobytes(), orig_img.tobytes())
try:
im.close()
except AttributeError:
pass
elif imgprops.Filter == [PdfName.FlateDecode]: elif imgprops.Filter == [PdfName.FlateDecode]:
# otherwise, the data is flate encoded and has to be equal to # otherwise, the data is flate encoded and has to be equal to
# the pixel data of the input image # the pixel data of the input image
imgdata = zlib.decompress( imgdata = zlib.decompress(
convert_store( convert_store(
x.Root.Pages.Kids[0].Resources.XObject.Im0.stream)) x.Root.Pages.Kids[pagenum].Resources.XObject.Im0.stream))
colorspace = imgprops.ColorSpace colorspace = imgprops.ColorSpace
if colorspace == PdfName.DeviceGray: if colorspace == PdfName.DeviceGray:
colorspace = 'L' colorspace = 'L'
elif colorspace == PdfName.DeviceRGB: elif colorspace == PdfName.DeviceRGB:
colorspace = 'RGB' colorspace = 'RGB'
elif colorspace == PdfName.DeviceCMYK: elif colorspace == PdfName.DeviceCMYK:
colorspace = 'CMYK' colorspace = 'CMYK'
else: else:
raise Exception("invalid colorspace") raise Exception("invalid colorspace")
im = Image.frombytes(colorspace, (int(imgprops.Width), im = Image.frombytes(colorspace, (int(imgprops.Width),
int(imgprops.Height)), int(imgprops.Height)),
imgdata) imgdata)
if orig_img.mode == '1': if orig_img.mode == '1':
orig_img = orig_img.convert("L") self.assertEqual(im.tobytes(), orig_img.convert("L").tobytes())
elif orig_img.mode not in ("RGB", "L", "CMYK", "CMYK;I"): elif orig_img.mode not in ("RGB", "L", "CMYK", "CMYK;I"):
orig_img = orig_img.convert("RGB") self.assertEqual(im.tobytes(), orig_img.convert("RGB").tobytes())
self.assertEqual(im.tobytes(), orig_img.tobytes()) # the python-pil version 2.3.0-1ubuntu3 in Ubuntu does not have
# the python-pil version 2.3.0-1ubuntu3 in Ubuntu does not have # the close() method
# the close() method try:
try: im.close()
im.close() except AttributeError:
except AttributeError: pass
pass
# now use pdfrw to parse and then write out both pdfs and check the # now use pdfrw to parse and then write out both pdfs and check the
# result for equality # result for equality
y = PdfReader(out) y = PdfReader(out)

Loading…
Cancel
Save