Make PIL optional #885

This commit is contained in:
Ozzieisaacs 2019-04-17 20:45:08 +02:00
parent e1e79a73e8
commit 89516fc2d6
2 changed files with 57 additions and 47 deletions

View File

@ -62,7 +62,11 @@ except ImportError as e:
logger.warning('cannot import fb2, extracting fb2 metadata will not work: %s', e) logger.warning('cannot import fb2, extracting fb2 metadata will not work: %s', e)
use_fb2_meta = False 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): 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: if use_generic_pdf_cover:
return None return None
else: else:
try: if use_PIL:
input1 = PdfFileReader(open(tmp_file_path, 'rb'), strict=False) try:
page0 = input1.getPage(0) input1 = PdfFileReader(open(tmp_file_path, 'rb'), strict=False)
xObject = page0['/Resources']['/XObject'].getObject() page0 = input1.getPage(0)
xObject = page0['/Resources']['/XObject'].getObject()
for obj in xObject: for obj in xObject:
if xObject[obj]['/Subtype'] == '/Image': if xObject[obj]['/Subtype'] == '/Image':
size = (xObject[obj]['/Width'], xObject[obj]['/Height']) size = (xObject[obj]['/Width'], xObject[obj]['/Height'])
data = xObject[obj]._data # xObject[obj].getData() data = xObject[obj]._data # xObject[obj].getData()
if xObject[obj]['/ColorSpace'] == '/DeviceRGB': if xObject[obj]['/ColorSpace'] == '/DeviceRGB':
mode = "RGB" mode = "RGB"
else: else:
mode = "P" mode = "P"
if '/Filter' in xObject[obj]: if '/Filter' in xObject[obj]:
if xObject[obj]['/Filter'] == '/FlateDecode': 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) img = Image.frombytes(mode, size, data)
cover_file_name = os.path.splitext(tmp_file_path)[0] + ".cover.png" cover_file_name = os.path.splitext(tmp_file_path)[0] + ".cover.png"
img.save(filename=os.path.join(tmp_dir, cover_file_name)) img.save(filename=os.path.join(tmp_dir, cover_file_name))
return cover_file_name return cover_file_name
# img.save(obj[1:] + ".png") # img.save(obj[1:] + ".png")
elif xObject[obj]['/Filter'] == '/DCTDecode': except Exception as ex:
cover_file_name = os.path.splitext(tmp_file_path)[0] + ".cover.jpg" print(ex)
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)
try: try:
cover_file_name = os.path.splitext(tmp_file_path)[0] + ".cover.jpg" cover_file_name = os.path.splitext(tmp_file_path)[0] + ".cover.jpg"
with Image(filename=tmp_file_path + "[0]", resolution=150) as img: with Image(filename=tmp_file_path + "[0]", resolution=150) as img:

View File

@ -35,7 +35,6 @@ from flask_babel import gettext as _
from flask_login import current_user from flask_login import current_user
from babel.dates import format_datetime from babel.dates import format_datetime
from datetime import datetime from datetime import datetime
from PIL import Image
import shutil import shutil
import requests import requests
try: try:
@ -52,6 +51,12 @@ try:
except ImportError: except ImportError:
use_unidecode = False use_unidecode = False
try:
from PIL import Image
use_PIL = True
except ImportError:
use_PIL = False
# Global variables # Global variables
# updater_thread = None # updater_thread = None
global_WorkerThread = worker.WorkerThread() 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") web.app.logger.error("Only jpg/jpeg/png/webp files are supported as coverfile")
return False return False
# convert to jpg because calibre only supports jpg if use_PIL:
if content_type in ('image/png', 'image/webp'): # convert to jpg because calibre only supports jpg
if hasattr(img,'stream'): if content_type in ('image/png', 'image/webp'):
imgc = Image.open(img.stream) if hasattr(img,'stream'):
else: imgc = Image.open(img.stream)
imgc = Image.open(io.BytesIO(img.content)) else:
im = imgc.convert('RGB') imgc = Image.open(io.BytesIO(img.content))
tmp_bytesio = io.BytesIO() im = imgc.convert('RGB')
im.save(tmp_bytesio, format='JPEG') tmp_bytesio = io.BytesIO()
img._content = tmp_bytesio.getvalue() im.save(tmp_bytesio, format='JPEG')
img._content = tmp_bytesio.getvalue()
if ub.config.config_use_google_drive: if ub.config.config_use_google_drive:
tmpDir = gettempdir() tmpDir = gettempdir()