Add support for getting an office document page count.
This commit is contained in:
@@ -30,6 +30,16 @@ Image.init()
|
|||||||
logger = logging.getLogger(__name__)
|
logger = logging.getLogger(__name__)
|
||||||
|
|
||||||
|
|
||||||
|
class IteratorIO(object):
|
||||||
|
def __init__(self, iterator):
|
||||||
|
self.file_buffer = StringIO()
|
||||||
|
|
||||||
|
for chunk in iterator:
|
||||||
|
self.file_buffer.write(chunk)
|
||||||
|
|
||||||
|
self.file_buffer.seek(0)
|
||||||
|
|
||||||
|
|
||||||
class Python(ConverterBase):
|
class Python(ConverterBase):
|
||||||
|
|
||||||
def convert(self, *args, **kwargs):
|
def convert(self, *args, **kwargs):
|
||||||
@@ -53,19 +63,26 @@ class Python(ConverterBase):
|
|||||||
fs_cleanup(input_filepath)
|
fs_cleanup(input_filepath)
|
||||||
|
|
||||||
def get_page_count(self):
|
def get_page_count(self):
|
||||||
|
super(Python, self).get_page_count()
|
||||||
|
|
||||||
page_count = 1
|
page_count = 1
|
||||||
|
|
||||||
if self.mime_type == 'application/pdf':
|
if self.mime_type == 'application/pdf' or self.soffice_file:
|
||||||
# If file is a PDF open it with slate to determine the page count
|
# If file is a PDF open it with slate to determine the page count
|
||||||
|
if self.soffice_file:
|
||||||
|
file_object = IteratorIO(self.soffice_file).file_buffer
|
||||||
|
else:
|
||||||
|
file_object = self.file_object
|
||||||
|
|
||||||
try:
|
try:
|
||||||
pages = slate.PDF(self.file_object)
|
pages = slate.PDF(file_object)
|
||||||
except Exception as exception:
|
except Exception as exception:
|
||||||
logger.error('Slate exception; %s', exception)
|
logger.error('Slate exception; %s', exception)
|
||||||
raise
|
raise
|
||||||
else:
|
else:
|
||||||
return len(pages)
|
return len(pages)
|
||||||
finally:
|
finally:
|
||||||
self.file_object.seek(0)
|
file_object.seek(0)
|
||||||
else:
|
else:
|
||||||
try:
|
try:
|
||||||
image = Image.open(self.file_object)
|
image = Image.open(self.file_object)
|
||||||
|
|||||||
@@ -135,7 +135,7 @@ class ConverterBase(object):
|
|||||||
self.file_object = file_object
|
self.file_object = file_object
|
||||||
self.image = None
|
self.image = None
|
||||||
self.mime_type = mime_type or get_mimetype(file_object=file_object, mimetype_only=False)[0]
|
self.mime_type = mime_type or get_mimetype(file_object=file_object, mimetype_only=False)[0]
|
||||||
self.soffice_file_object = None
|
self.soffice_file = None
|
||||||
|
|
||||||
def to_pdf(self):
|
def to_pdf(self):
|
||||||
if self.mime_type in CONVERTER_OFFICE_FILE_MIMETYPES:
|
if self.mime_type in CONVERTER_OFFICE_FILE_MIMETYPES:
|
||||||
@@ -183,7 +183,10 @@ class ConverterBase(object):
|
|||||||
self.image = transformation.execute_on(self.image)
|
self.image = transformation.execute_on(self.image)
|
||||||
|
|
||||||
def get_page_count(self):
|
def get_page_count(self):
|
||||||
raise NotImplementedError
|
try:
|
||||||
|
self.soffice_file = self.to_pdf()
|
||||||
|
except InvalidOfficeFormat:
|
||||||
|
pass
|
||||||
|
|
||||||
|
|
||||||
class BaseTransformation(object):
|
class BaseTransformation(object):
|
||||||
|
|||||||
Reference in New Issue
Block a user