[Erp5-report] r17509 - /erp5/trunk/products/ERP5/Document/Image.py
nobody at svn.erp5.org
nobody at svn.erp5.org
Sat Nov 10 13:18:47 CET 2007
Author: jp
Date: Sat Nov 10 13:18:46 2007
New Revision: 17509
URL: http://svn.erp5.org?rev=17509&view=rev
Log:
Added support for frame access. This is useful for example to render pages in a PDF file and possibly pages in a fax file.
Modified:
erp5/trunk/products/ERP5/Document/Image.py
Modified: erp5/trunk/products/ERP5/Document/Image.py
URL: http://svn.erp5.org/erp5/trunk/products/ERP5/Document/Image.py?rev=17509&r1=17508&r2=17509&view=diff
==============================================================================
--- erp5/trunk/products/ERP5/Document/Image.py (original)
+++ erp5/trunk/products/ERP5/Document/Image.py Sat Nov 10 13:18:46 2007
@@ -185,7 +185,7 @@
security.declareProtected('View', 'tag')
def tag(self, display=None, height=None, width=None, cookie=0,
alt=None, css_class=None, format='', quality=75,
- resolution=None, **kw):
+ resolution=None, frame=None, **kw):
"""Return HTML img tag."""
self._upradeImage()
@@ -194,14 +194,17 @@
display = self.REQUEST.cookies.get('display', None)
# display may be set from a cookie.
- if (display is not None or resolution is not None or quality!=75 or format!='')\
- and defaultdisplays.has_key(display):
+ if (display is not None or resolution is not None or quality!=75 or format != ''\
+ or frame is not None) and defaultdisplays.has_key(display):
if not self.hasConversion(display=display, format=format,
- quality=quality, resolution=resolution):
+ quality=quality, resolution=resolution,
+ frame=frame):
# Generate photo on-the-fly
- self._makeDisplayPhoto(display, format=format, quality=quality, resolution=resolution)
+ self._makeDisplayPhoto(display, format=format, quality=quality,
+ resolution=resolution, frame=frame)
mime, image = self.getConversion(display=display, format=format,
- quality=quality ,resolution=resolution)
+ quality=quality ,resolution=resolution,
+ frame=frame)
width, height = (image.width, image.height)
# Set cookie for chosen size
if cookie:
@@ -291,42 +294,50 @@
# Conversion API
security.declareProtected(Permissions.ModifyPortalContent, 'convert')
- def convert(self, format, display=None, quality=75, resolution=None):
+ def convert(self, format, display=None, quality=75, resolution=None, frame=None):
"""
Implementation of conversion for PDF files
"""
if format in ('text', 'txt', 'html', 'base_html', 'stripped-html'):
return None, None
- if (display is not None or resolution is not None or quality != 75 or format != '')\
- and defaultdisplays.has_key(display):
+ if (display is not None or resolution is not None or quality != 75 or format != ''\
+ or frame is not None) and defaultdisplays.has_key(display):
if not self.hasConversion(display=display, format=format,
- quality=quality,resolution=resolution):
+ quality=quality, resolution=resolution,
+ frame=frame):
# Generate photo on-the-fly
- self._makeDisplayPhoto(display, format=format, quality=quality,resolution=resolution)
+ self._makeDisplayPhoto(display, format=format, quality=quality,
+ resolution=resolution, frame=frame)
# Return resized image
mime, image = self.getConversion(display=display, format=format,
- quality=quality ,resolution=resolution)
+ quality=quality ,resolution=resolution,
+ frame=frame)
return mime, image.data
return self.getContentType(), self.getData()
# Display
security.declareProtected('View', 'index_html')
- def index_html(self, REQUEST, RESPONSE, display=None, format='', quality=75, resolution=None):
+ def index_html(self, REQUEST, RESPONSE, display=None, format='', quality=75,
+ resolution=None, frame=None):
"""Return the image data."""
self._upradeImage()
- _setCacheHeaders(self, dict(display=display, format=format, quality=quality, resolution=resolution))
+ _setCacheHeaders(self, dict(display=display, format=format, quality=quality,
+ resolution=resolution, frame=frame))
# display may be set from a cookie (?)
- if (display is not None or resolution is not None or quality!=75 or format != '')\
- and defaultdisplays.has_key(display):
+ if (display is not None or resolution is not None or quality != 75 or format != ''\
+ or frame is not None) and defaultdisplays.has_key(display):
if not self.hasConversion(display=display, format=format,
- quality=quality,resolution=resolution):
+ quality=quality, resolution=resolution,
+ frame=frame):
# Generate photo on-the-fly
- self._makeDisplayPhoto(display, format=format, quality=quality,resolution=resolution)
+ self._makeDisplayPhoto(display, format=format, quality=quality,
+ resolution=resolution, frame=frame)
# Return resized image
mime, image = self.getConversion(display=display, format=format,
- quality=quality ,resolution=resolution)
+ quality=quality ,resolution=resolution,
+ frame=frame)
RESPONSE.setHeader('Content-Type', mime)
return image.index_html(REQUEST, RESPONSE)
@@ -338,37 +349,61 @@
# Photo processing
#
- def _resize(self, display, width, height, quality=75, format='', resolution=None):
+ def _resize(self, display, width, height, quality=75, format='',
+ resolution=None, frame=None):
"""Resize and resample photo."""
newimg = StringIO()
+ # Prepare the format prefix
+ if format:
+ format = '%s:' % format
+ else:
+ format = ''
+
+ # Prepare the frame suffix
+ if frame is not None:
+ frame = '[%s]' % frame
+ else:
+ frame = ''
+
if sys.platform == 'win32':
+ # XXX - Does win32 support pipe ?
from win32pipe import popen2
if resolution is None:
- imgin, imgout = popen2('convert -quality %s -geometry %sx%s - -'
- % (quality, width, height), 'b')
+ imgin, imgout = popen2('convert -quality %s -geometry %sx%s -%s %s-'
+ % (quality, width, height, frame, format), 'b')
else:
- imgin, imgout = popen2('convert -density %sx%s -quality %s -geometry %sx%s - -'
- % (resolution, resolution, quality, width, height), 'b')
+ imgin, imgout = popen2('convert -density %sx%s -quality %s -geometry %sx%s -%s %s-'
+ % (resolution, resolution, quality, width, height, frame, format), 'b')
else:
from popen2 import popen2
if resolution is None:
- imgout, imgin = popen2('convert -quality %s -geometry %sx%s - -'
- % (quality, width, height))
+ imgout, imgin = popen2('convert -quality %s -geometry %sx%s -%s %s-'
+ % (quality, width, height, frame, format))
else:
# LOG('Resolution',0,str(resolution))
- cmd = 'convert -density %sx%s -quality %s -geometry %sx%s - -' % (resolution,
- resolution, quality, width, height)
+ cmd = 'convert -density %sx%s -quality %s -geometry %sx%s -%s %s-' % (
+ resolution, resolution, quality, width, height, frame, format)
imgout, imgin = popen2(cmd)
- imgin.write(str(self.getData()))
+ def writeData(stream, data):
+ if isinstance(data, str):
+ stream.write(str(self.getData()))
+ else:
+ # Use PData structure to prevent
+ # consuming too much memory
+ while data is not None:
+ stream.write(data.data)
+ data = data.next
+
+ writeData(imgin, self.getData())
imgin.close()
newimg.write(imgout.read())
newimg.seek(0)
return newimg
- def _getDisplayData(self, display, format='', quality=75, resolution=None):
+ def _getDisplayData(self, display, format='', quality=75, resolution=None, frame=None):
"""Return raw photo data for given display."""
if display is None:
(width, height) = (self.getWidth(), self.getHeight())
@@ -378,26 +413,30 @@
width = self.getWidth()
height = self.getHeight()
(width, height) = self._getAspectRatioSize(width, height)
- return self._resize(display, width, height, quality, format=format, resolution=resolution)
-
- def _getDisplayPhoto(self, display, format='', quality=75, resolution=None):
+ return self._resize(display, width, height, quality, format=format,
+ resolution=resolution, frame=frame)
+
+ def _getDisplayPhoto(self, display, format='', quality=75, resolution=None, frame=None):
"""Return photo object for given display."""
try:
base, ext = string.split(self.id, '.')
- id = base+'_'+display+'.'+ext
+ id = base + '_' + display + '.' + ext
except ValueError:
- id = self.id+'_'+display
+ id = self.id +'_'+ display
image = OFSImage(id, self.getTitle(), self._getDisplayData(display, format=format,
- quality=quality,resolution=resolution))
+ quality=quality, resolution=resolution, frame=frame))
return image
- def _makeDisplayPhoto(self, display, format='', quality=75, resolution=None):
+ def _makeDisplayPhoto(self, display, format='', quality=75, resolution=None, frame=None):
"""Create given display."""
- if not self.hasConversion(display=display, format=format, quality=quality,resolution=resolution):
- image = self._getDisplayPhoto(display, format=format, quality=quality, resolution=resolution)
- self.setConversion(image, mime=image.content_type,
- display=display, format=format,
- quality=quality ,resolution=resolution)
+ if not self.hasConversion(display=display, format=format, quality=quality,
+ resolution=resolution, frame=frame):
+ image = self._getDisplayPhoto(display, format=format, quality=quality,
+ resolution=resolution, frame=frame)
+ self.setConversion(image, mime=image.content_type,
+ display=display, format=format,
+ quality=quality, resolution=resolution,
+ frame=frame)
def _getAspectRatioSize(self, width, height):
"""Return proportional dimensions within desired size."""
More information about the Erp5-report
mailing list