def get_combined_transformation_list(self, *args, **kwargs): """ Return a list of transformation containing the server side document page transformation as well as tranformations created from the arguments as transient interactive transformation. """ # Convert arguments into transformations transformations = kwargs.get('transformations', []) # Set sensible defaults if the argument is not specified or if the # argument is None width = kwargs.get('width', setting_display_width.value) or setting_display_width.value height = kwargs.get('height', setting_display_height.value) or setting_display_height.value rotation = kwargs.get('rotation', DEFAULT_ROTATION) or DEFAULT_ROTATION zoom_level = kwargs.get('zoom', DEFAULT_ZOOM_LEVEL) or DEFAULT_ZOOM_LEVEL if zoom_level < setting_zoom_min_level.value: zoom_level = setting_zoom_min_level.value if zoom_level > setting_zoom_max_level.value: zoom_level = setting_zoom_max_level.value # Generate transformation hash transformation_list = [] # Stored transformations first for stored_transformation in Transformation.objects.get_for_model(self, as_classes=True): transformation_list.append(stored_transformation) # Interactive transformations second for transformation in transformations: transformation_list.append(transformation) if rotation: transformation_list.append( TransformationRotate(degrees=rotation) ) if width: transformation_list.append( TransformationResize(width=width, height=height) ) if zoom_level: transformation_list.append(TransformationZoom(percent=zoom_level)) return transformation_list
def generate_image(self, *args, **kwargs): # Convert arguments into transformations transformations = kwargs.get('transformations', []) # Set sensible defaults if the argument is not specified or if the # argument is None size = kwargs.get('size', setting_display_size.value) or setting_display_size.value rotation = kwargs.get('rotation', DEFAULT_ROTATION) or DEFAULT_ROTATION zoom_level = kwargs.get('zoom', DEFAULT_ZOOM_LEVEL) or DEFAULT_ZOOM_LEVEL if zoom_level < setting_zoom_min_level.value: zoom_level = setting_zoom_min_level.value if zoom_level > setting_zoom_max_level.value: zoom_level = setting_zoom_max_level.value # Generate transformation hash transformation_list = [] # Stored transformations first for stored_transformation in Transformation.objects.get_for_model(self, as_classes=True): transformation_list.append(stored_transformation) # Interactive transformations second for transformation in transformations: transformation_list.append(transformation) if rotation: transformation_list.append( TransformationRotate(degrees=rotation) ) if size: transformation_list.append( TransformationResize( **dict(zip(('width', 'height'), (size.split('x')))) ) ) if zoom_level: transformation_list.append(TransformationZoom(percent=zoom_level)) cache_filename = '{}-{}'.format( self.cache_filename, BaseTransformation.combine(transformation_list) ) # Check is transformed image is available logger.debug('transformations cache filename: %s', cache_filename) if not setting_disable_transformed_image_cache.value and cache_storage_backend.exists(cache_filename): logger.debug( 'transformations cache file "%s" found', cache_filename ) else: logger.debug( 'transformations cache file "%s" not found', cache_filename ) image = self.get_image(transformations=transformation_list) with cache_storage_backend.open(cache_filename, 'wb+') as file_object: file_object.write(image.getvalue()) self.cached_images.create(filename=cache_filename) return cache_filename
def get_image(self, *args, **kwargs): as_base64 = kwargs.pop('as_base64', False) transformations = kwargs.pop('transformations', []) size = kwargs.pop('size', setting_display_size.value) rotation = int( kwargs.pop('rotation', DEFAULT_ROTATION) or DEFAULT_ROTATION) zoom_level = int( kwargs.pop('zoom', DEFAULT_ZOOM_LEVEL) or DEFAULT_ZOOM_LEVEL) if zoom_level < setting_zoom_min_level.value: zoom_level = setting_zoom_min_level.value if zoom_level > setting_zoom_max_level.value: zoom_level = setting_zoom_max_level.value rotation = rotation % 360 cache_filename = self.cache_filename logger.debug('Page cache filename: %s', cache_filename) if cache_storage_backend.exists(cache_filename): logger.debug('Page cache file "%s" found', cache_filename) converter = converter_class( file_object=cache_storage_backend.open(cache_filename)) converter.seek(0) else: logger.debug('Page cache file "%s" not found', cache_filename) try: converter = converter_class( file_object=self.document_version.get_intermidiate_file()) converter.seek(page_number=self.page_number - 1) page_image = converter.get_page() with cache_storage_backend.open(cache_filename, 'wb+') as file_object: file_object.write(page_image.getvalue()) except Exception as exception: # Cleanup in case of error logger.error('Error creating page cache file "%s"; %s', cache_filename, exception) cache_storage_backend.delete(cache_filename) raise # Stored transformations for stored_transformation in Transformation.objects.get_for_model( self, as_classes=True): converter.transform(transformation=stored_transformation) # Interactive transformations for transformation in transformations: converter.transform(transformation=transformation) if rotation: converter.transform(transformation=TransformationRotate( degrees=rotation)) if size: converter.transform(transformation=TransformationResize( **dict(zip(('width', 'height'), (size.split('x')))))) if zoom_level: converter.transform(transformation=TransformationZoom( percent=zoom_level)) page_image = converter.get_page() if as_base64: # TODO: don't prepend 'data:%s;base64,%s' part return 'data:%s;base64,%s' % ( 'image/png', base64.b64encode(page_image.getvalue())) else: return page_image