From 89516fc2d6ab47727ae42353d850b089f5b1efc5 Mon Sep 17 00:00:00 2001 From: Ozzieisaacs Date: Wed, 17 Apr 2019 20:45:08 +0200 Subject: [PATCH] Make PIL optional #885 --- cps/book_formats.py | 78 ++++++++++++++++++++++++--------------------- cps/helper.py | 28 +++++++++------- 2 files changed, 58 insertions(+), 48 deletions(-) diff --git a/cps/book_formats.py b/cps/book_formats.py index fb08caa9..a5448e4d 100644 --- a/cps/book_formats.py +++ b/cps/book_formats.py @@ -62,7 +62,11 @@ except ImportError as e: logger.warning('cannot import fb2, extracting fb2 metadata will not work: %s', e) use_fb2_meta = False -from PIL import Image +try: + from PIL import Image + use_PIL = True +except ImportError: + use_PIL = False def process(tmp_file_path, original_file_name, original_file_extension): @@ -133,47 +137,47 @@ def pdf_preview(tmp_file_path, tmp_dir): if use_generic_pdf_cover: return None else: - try: - input1 = PdfFileReader(open(tmp_file_path, 'rb'), strict=False) - page0 = input1.getPage(0) - xObject = page0['/Resources']['/XObject'].getObject() - - for obj in xObject: - if xObject[obj]['/Subtype'] == '/Image': - size = (xObject[obj]['/Width'], xObject[obj]['/Height']) - data = xObject[obj]._data # xObject[obj].getData() - if xObject[obj]['/ColorSpace'] == '/DeviceRGB': - mode = "RGB" - else: - mode = "P" - if '/Filter' in xObject[obj]: - if xObject[obj]['/Filter'] == '/FlateDecode': + if use_PIL: + try: + input1 = PdfFileReader(open(tmp_file_path, 'rb'), strict=False) + page0 = input1.getPage(0) + xObject = page0['/Resources']['/XObject'].getObject() + + for obj in xObject: + if xObject[obj]['/Subtype'] == '/Image': + size = (xObject[obj]['/Width'], xObject[obj]['/Height']) + data = xObject[obj]._data # xObject[obj].getData() + if xObject[obj]['/ColorSpace'] == '/DeviceRGB': + mode = "RGB" + else: + mode = "P" + if '/Filter' in xObject[obj]: + if xObject[obj]['/Filter'] == '/FlateDecode': + img = Image.frombytes(mode, size, data) + cover_file_name = os.path.splitext(tmp_file_path)[0] + ".cover.png" + img.save(filename=os.path.join(tmp_dir, cover_file_name)) + return cover_file_name + # img.save(obj[1:] + ".png") + elif xObject[obj]['/Filter'] == '/DCTDecode': + cover_file_name = os.path.splitext(tmp_file_path)[0] + ".cover.jpg" + img = open(cover_file_name, "wb") + img.write(data) + img.close() + return cover_file_name + elif xObject[obj]['/Filter'] == '/JPXDecode': + cover_file_name = os.path.splitext(tmp_file_path)[0] + ".cover.jp2" + img = open(cover_file_name, "wb") + img.write(data) + img.close() + return cover_file_name + else: img = Image.frombytes(mode, size, data) cover_file_name = os.path.splitext(tmp_file_path)[0] + ".cover.png" img.save(filename=os.path.join(tmp_dir, cover_file_name)) return cover_file_name # img.save(obj[1:] + ".png") - elif xObject[obj]['/Filter'] == '/DCTDecode': - cover_file_name = os.path.splitext(tmp_file_path)[0] + ".cover.jpg" - img = open(cover_file_name, "wb") - img.write(data) - img.close() - return cover_file_name - elif xObject[obj]['/Filter'] == '/JPXDecode': - cover_file_name = os.path.splitext(tmp_file_path)[0] + ".cover.jp2" - img = open(cover_file_name, "wb") - img.write(data) - img.close() - return cover_file_name - else: - img = Image.frombytes(mode, size, data) - cover_file_name = os.path.splitext(tmp_file_path)[0] + ".cover.png" - img.save(filename=os.path.join(tmp_dir, cover_file_name)) - return cover_file_name - # img.save(obj[1:] + ".png") - except Exception as ex: - print(ex) - + except Exception as ex: + print(ex) try: cover_file_name = os.path.splitext(tmp_file_path)[0] + ".cover.jpg" with Image(filename=tmp_file_path + "[0]", resolution=150) as img: diff --git a/cps/helper.py b/cps/helper.py index aa832e42..79cf92af 100644 --- a/cps/helper.py +++ b/cps/helper.py @@ -35,7 +35,6 @@ from flask_babel import gettext as _ from flask_login import current_user from babel.dates import format_datetime from datetime import datetime -from PIL import Image import shutil import requests try: @@ -52,6 +51,12 @@ try: except ImportError: use_unidecode = False +try: + from PIL import Image + use_PIL = True +except ImportError: + use_PIL = False + # Global variables # updater_thread = None global_WorkerThread = worker.WorkerThread() @@ -481,16 +486,17 @@ def save_cover(img, book_path): web.app.logger.error("Only jpg/jpeg/png/webp files are supported as coverfile") return False - # convert to jpg because calibre only supports jpg - if content_type in ('image/png', 'image/webp'): - if hasattr(img,'stream'): - imgc = Image.open(img.stream) - else: - imgc = Image.open(io.BytesIO(img.content)) - im = imgc.convert('RGB') - tmp_bytesio = io.BytesIO() - im.save(tmp_bytesio, format='JPEG') - img._content = tmp_bytesio.getvalue() + if use_PIL: + # convert to jpg because calibre only supports jpg + if content_type in ('image/png', 'image/webp'): + if hasattr(img,'stream'): + imgc = Image.open(img.stream) + else: + imgc = Image.open(io.BytesIO(img.content)) + im = imgc.convert('RGB') + tmp_bytesio = io.BytesIO() + im.save(tmp_bytesio, format='JPEG') + img._content = tmp_bytesio.getvalue() if ub.config.config_use_google_drive: tmpDir = gettempdir()