Pillow/Tests/test_file_pdf.py

173 lines
5.3 KiB
Python
Raw Normal View History

2014-09-05 13:36:24 +04:00
from helper import unittest, PillowTestCase, hopper
2018-01-22 23:35:55 +03:00
from PIL import Image, pdfParser
import os
2014-06-10 13:10:47 +04:00
import os.path
import tempfile
2014-05-11 10:01:09 +04:00
2014-06-10 13:10:47 +04:00
class TestFilePdf(PillowTestCase):
2014-05-11 18:16:13 +04:00
2015-09-29 15:51:52 +03:00
def helper_save_as_pdf(self, mode, save_all=False):
2014-06-10 13:10:47 +04:00
# Arrange
2014-09-05 13:36:24 +04:00
im = hopper(mode)
2014-06-10 13:10:47 +04:00
outfile = self.tempfile("temp_" + mode + ".pdf")
2014-06-10 13:10:47 +04:00
# Act
2015-09-29 15:51:52 +03:00
if save_all:
im.save(outfile, save_all=True)
else:
im.save(outfile)
2014-05-11 18:35:49 +04:00
2014-06-10 13:10:47 +04:00
# Assert
self.assertTrue(os.path.isfile(outfile))
self.assertGreater(os.path.getsize(outfile), 0)
2014-05-11 18:35:49 +04:00
return outfile
2014-06-10 13:10:47 +04:00
def test_monochrome(self):
# Arrange
mode = "1"
2014-05-11 18:16:13 +04:00
2014-06-10 13:10:47 +04:00
# Act / Assert
self.helper_save_as_pdf(mode)
2014-05-11 18:16:13 +04:00
2014-06-10 13:10:47 +04:00
def test_greyscale(self):
# Arrange
mode = "L"
2014-05-11 18:16:13 +04:00
2014-06-10 13:10:47 +04:00
# Act / Assert
self.helper_save_as_pdf(mode)
2014-05-11 18:16:13 +04:00
2014-06-10 13:10:47 +04:00
def test_rgb(self):
# Arrange
mode = "RGB"
2014-05-11 18:16:13 +04:00
2014-06-10 13:10:47 +04:00
# Act / Assert
self.helper_save_as_pdf(mode)
2014-05-11 18:16:13 +04:00
2014-06-10 13:10:47 +04:00
def test_p_mode(self):
# Arrange
mode = "P"
2014-05-12 15:45:54 +04:00
2014-06-10 13:10:47 +04:00
# Act / Assert
self.helper_save_as_pdf(mode)
2014-05-11 18:16:13 +04:00
2014-06-10 13:10:47 +04:00
def test_cmyk_mode(self):
# Arrange
mode = "CMYK"
2014-05-11 18:16:13 +04:00
2014-06-10 13:10:47 +04:00
# Act / Assert
self.helper_save_as_pdf(mode)
2014-05-11 18:16:13 +04:00
2015-07-03 08:03:25 +03:00
def test_unsupported_mode(self):
im = hopper("LA")
outfile = self.tempfile("temp_LA.pdf")
2017-09-01 14:05:40 +03:00
self.assertRaises(ValueError, im.save, outfile)
2015-07-03 08:03:25 +03:00
2015-09-29 15:51:52 +03:00
def test_save_all(self):
# Single frame image
self.helper_save_as_pdf("RGB", save_all=True)
# Multiframe image
im = Image.open("Tests/images/dispose_bgnd.gif")
outfile = self.tempfile('temp.pdf')
im.save(outfile, save_all=True)
self.assertTrue(os.path.isfile(outfile))
self.assertGreater(os.path.getsize(outfile), 0)
2017-05-13 07:26:52 +03:00
# Append images
ims = [hopper()]
im.copy().save(outfile, save_all=True, append_images=ims)
self.assertTrue(os.path.isfile(outfile))
self.assertGreater(os.path.getsize(outfile), 0)
# Test appending using a generator
def imGenerator(ims):
for im in ims:
yield im
im.save(outfile, save_all=True, append_images=imGenerator(ims))
2017-05-13 07:26:52 +03:00
self.assertTrue(os.path.isfile(outfile))
self.assertGreater(os.path.getsize(outfile), 0)
# Append JPEG images
jpeg = Image.open("Tests/images/flower.jpg")
jpeg.save(outfile, save_all=True, append_images=[jpeg.copy()])
self.assertTrue(os.path.isfile(outfile))
self.assertGreater(os.path.getsize(outfile), 0)
def test_pdf_open(self):
# fail on empty buffer
self.assertRaises(pdfParser.PdfFormatError, pdfParser.PdfParser, buf=bytearray())
# fail on a buffer full of null bytes
self.assertRaises(pdfParser.PdfFormatError, pdfParser.PdfParser, buf=bytearray(65536))
# make an empty PDF object
empty_pdf = pdfParser.PdfParser()
self.assertEqual(len(empty_pdf.pages), 0)
# make a PDF file
pdf_filename = self.helper_save_as_pdf("RGB")
# open the PDF file
hopper_pdf = pdfParser.PdfParser(filename=pdf_filename)
self.assertEqual(len(hopper_pdf.pages), 1)
# read a PDF file from a buffer with a non-zero offset
with open(pdf_filename, "rb") as f:
content = b"xyzzy" + f.read()
hopper_pdf = pdfParser.PdfParser(buf=content, start_offset=5)
self.assertEqual(len(hopper_pdf.pages), 1)
# read a PDF file from an already open file
with open(pdf_filename, "rb") as f:
hopper_pdf = pdfParser.PdfParser(f=f)
self.assertEqual(len(hopper_pdf.pages), 1)
def test_pdf_append_fails_on_nonexistent_file(self):
im = hopper("RGB")
temp_dir = tempfile.mkdtemp()
try:
self.assertRaises(IOError, im.save, os.path.join(temp_dir, "nonexistent.pdf"), append=True)
finally:
os.rmdir(temp_dir)
def test_pdf_append(self):
# make a PDF file
pdf_filename = self.helper_save_as_pdf("RGB")
# open it, check pages and info
pdf = pdfParser.PdfParser(pdf_filename)
self.assertEqual(len(pdf.pages), 1)
self.assertEqual(len(pdf.info), 0)
# append some info
pdf.info[b"Title"] = b"abc"
pdf.info[b"Author"] = b"def"
pdf.info[b"Subject"] = pdfParser.encode_text("ghi")
pdf.info[b"Keywords"] = b"jkl"
pdf.info[b"Creator"] = b"hopper()"
pdf.info[b"Producer"] = b"pdfParser"
with open(pdf_filename, "r+b") as f:
f.seek(0, os.SEEK_END)
pdf.write_xref_and_trailer(f)
# open it again, check pages and info again
pdf = pdfParser.PdfParser(pdf_filename)
self.assertEqual(len(pdf.pages), 1)
self.assertEqual(len(pdf.info), 6)
self.assertEqual(pdf.info[b"Title"], b"abc")
# append two images
mode_CMYK = hopper("CMYK")
mode_P = hopper("P")
mode_CMYK.save(pdf_filename, append=True, save_all=True, append_images=[mode_P])
# open the PDF again, check pages and info again
pdf = pdfParser.PdfParser(pdf_filename)
self.assertEqual(len(pdf.pages), 3)
self.assertEqual(len(pdf.info), 6)
self.assertEqual(pdf.info[b"Title"], b"abc")
2018-01-22 23:35:55 +03:00
def test_pdf_parser(self):
pdfParser.selftest()
2014-05-11 18:16:13 +04:00
2014-06-10 13:10:47 +04:00
if __name__ == '__main__':
unittest.main()